Saya sedang mengerjakan aplikasi saya dan menemukan perilaku aneh dari metode yang dipanggil secara statis tetapi tidak didefinisikan sebagai statis yang memperluas kelas yang sama. Pada akhirnya metode ini dapat mengakses dan mengubah variabel dan metode yang dilindungi pemanggil. Ini contoh kode saya:
<?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;
?>
Perilaku ini tidak didokumentasikan, jadi saya bertanya-tanya apakah ini bug atau fitur dan dapatkah ini menyebabkan masalah keamanan?
UPDATE. Saya mengetahui bahwa $this tidak diperbolehkan di dalam metode statis dan perilaku ini muncul di php versi 5.2.11