【发布时间】:2011-04-11 09:01:48
【问题描述】:
我正在处理我的应用程序,发现静态调用但未定义为扩展同一类的静态方法的奇怪行为。最终,此方法可以访问和更改调用者受保护的变量和方法。 这是我的代码示例:
<?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
【问题讨论】:
标签: php oop object methods static