繁体   English   中英

PHP 5.3在static ::后期绑定上的奇怪行为

[英]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::teststatic指的是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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM