[英]PHP 5.3 strange behaviour on static:: late binding
<?php
class baseModel
{
public static function show($className=__CLASS__)
{
print_r($className);
}
public function test()
{
static::show();
}
}
class AModel extends baseModel
{
public static function show($className=__CLASS__)
{
print_r($className);
}
}
class Controller
{
public function actionTest()
{
baseModel::test();
AModel::test();
}
}
$c = new Controller;
$c->actionTest();
?>
预期产量:
baseModelAModel
实际输出:
Fatal error: Call to undefined method Controller::show() in /var/www/dashboard/test.php on line 12
为什么PHP试图找到Controller::show()
而不是AModel::show
?
static
关键字是指上下文,而不是方法定义的类。因此,当您从C的上下文调用A::test
, static
指的是C。
正如它在php手册中所写
在非静态上下文中 ,被调用的类将是对象实例的类。 由于$ this->会尝试从同一范围调用私有方法,因此使用static ::可能会得出不同的结果 。 另一个区别是static ::只能引用静态属性。
这意味着在对象$c
(类Controller
)的上下文中,进行非静态调用( $c->t()
)后期绑定static::
方法baseModel::test()
关键字引用了对象引用$this
类是Controller
而不是class,如果调用static:
Controller::test();
static::
上下文称为类。
但是,我建议您不要使用静态调用,除非将方法显式定义为静态:
class baseModel
{
public static function show($className=__CLASS__)
{
print_r($className);
}
public static function test()
// must be defined as static or context of static:: may change to Controller instead of actual class being called!
{
static::show();
}
}
该代码之所以有效,是因为如果将baseModel::test()
显式定义为static::
静态上下文,则它将始终是静态的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.