Я работал над своим приложением и обнаружил странное поведение методов, которые вызываются статически, но не определяются как статические, которые расширяют тот же класс. В конце концов, эти методы могут получать доступ и изменять защищенные переменные и методы вызывающей стороны. Вот пример моего кода:
<?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.