根据手册页之一http://www.php.net/manual/en/language.oop5.static.php:
静态调用非静态方法会生成 E_STRICT 级别的警告。
但是,当从类内部进行调用时,情况似乎并非如此:
error_reporting(-1);
class Test {
private $id;
function __construct($id) { $this->id = $id; }
function id() { return $this->id; }
function __toString() {
return Test::id()
. self::id()
. static::id()
. static::id()
. call_user_func('Test::id')
. call_user_func(array('Test', 'id'));
}
}
$a = new Test('a');
$b = new Test('b');
echo "$a $b $a"; # aaaaaa bbbbbb aaaaaa
var_dump(error_get_last()); # NULL
使用 php 5.4 进行测试
演示: http ://codepad.viper-7.com/IKp9iX
我相信我已经证明:
- 不生成 E_STRICT 警告
- 该php神奇地将静态方法调用更正为实例方法调用(访问实例变量
id
证明了这一点)。
编辑-
我想补充一点,将debug_backtrace () 插入到 __toString 调用中会产生一个调用“类型” ->
,这意味着“方法调用”。
这是一个错误,还是记录在案的功能?