使用延迟绑定时为何无法触发__callStatic

相关代码

<?php
class A {
        public function test () {
                static::who();
                A::who();
                self::who();
                $this->who();
        }   

        public static function __callStatic($a, $b) {
                var_dump('A static');
        }   
            
        public function __call($a, $b) {
                var_dump('A call');
        }   
}

$a = new A;
$a->test();
?>

你期待的结果是什么?实际看到的错误信息又是什么?

为何会输出4个A call,当他调用A::who(),不是应该触发__callStatic

string(6) "A call"
string(6) "A call"
string(6) "A call"
string(6) "A call"
阅读 223
评论 2019-10-10 提问
    2 个回答
    在对象中调用一个不可访问方法时,__call() 会被调用。
    在静态上下文中调用一个不可访问方法时,__callStatic() 会被调用。

    所以说调用哪个并不是根据你的调用方式,是根据所在的上下文。

    class A{
        public function awho(){
            echo "----------public awho-------\n";
        }
        protected function awho1(){
            echo "protected-awho1\n";
        }
        public static function __callStatic($method,$params){
            echo "static ".$method."\n";
        }
        public function __call($method,$params){
            echo "obj ".$method."\n";
        }
    }
    class B{
        function test(){
            A::awho();//执行awho,因为可访问到,仅仅提示Notice错误信息
            (new A())->awho();//执行awho
            A::awho1();//执行__callStatic,因为awho1无法访问到
            (new A())->awho1();//执行__call,因为awho1无法访问到
            A::who();//无法访问到,执行__callStatic
            (new A())->who();//执行__call
        }
    }
    
    class C extends A{
        function test(){
            A::awho();//执行awho,因为可访问到,仅仅提示Notice错误信息
            (new A())->awho();//执行awho
            A::awho1();//执行awho1
            (new A())->awho1();//awho1
            A::who();//无法访问到,且可以访问到调用对象本身,是在对象的上下文内,执行__call
            (new A())->who();//执行__call
        }
    }
    
    $b = new B();
    $c = new C();
    $b->test();
    $c->test();
    评论 赞赏 2019-10-11

      和上下文有关,你再试试@A::test();

      评论 赞赏 2019-10-11
        撰写回答

        登录后参与交流、获取后续更新提醒