ฉันกำลังทำงานกับแอปพลิเคชันของฉันและค้นพบพฤติกรรมแปลก ๆ ของวิธีการที่เรียกว่าแบบคงที่แต่ไม่ได้ถูกกำหนดให้เป็นแบบคงที่ที่ขยายคลาสเดียวกัน ในที่สุดวิธีนี้ก็สามารถเข้าถึงและแก้ไขตัวแปรและวิธีการป้องกันผู้โทรได้ นี่คือตัวอย่างรหัสของฉัน:
<?php
class object
{
private $version;
protected $alteredBy = 'nobody';
public function __construct()
{
$this->version = PHP_VERSION;
$this->objectName = get_class($this);
echo sprintf("<pre><strong>New %s Created</strong>", $this->objectName);
}
public function __destruct()
{
echo sprintf("</pre><strong>Source Code</strong><div>%s</div>", highlight_file(__FILE__, true));
}
}
class superApplication extends object
{
public function __toString()
{
echo "\nCalling third party object statically like thirdParty::method()\n";
echo thirdParty::method();
echo "\nCalling third party object statically via call_user_func()\n";
echo call_user_func(array('thirdParty','method'));
echo sprintf("New Object params\n%s", print_r($this, true));
return sprintf("%s: done\n", $this->objectName);
}
}
class thirdParty extends object
{
public function method()
{
if(is_object($this))
{
$this->alteredBy = __CLASS__;
return sprintf(
"<span style=\"color:red\">Object '%s' was altered successfully by %s class</span>\n",
get_class($this),
__CLASS__
);
}
else return "Cannot access caller object\n\n";
}
}
print new superApplication;
?>
พฤติกรรมนี้ไม่ได้รับการบันทึกไว้ ดังนั้นฉันจึงสงสัยว่ามันเป็นข้อบกพร่องหรือฟีเจอร์และอาจนำไปสู่ปัญหาด้านความปลอดภัยหรือไม่
อัปเดต ฉันทราบว่า $this ไม่ได้รับอนุญาตภายในวิธีการแบบคงที่ และลักษณะการทำงานนี้ปรากฏบน php เวอร์ชัน 5.2.11