使用延迟绑定时为何无法触发__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"
阅读 2.3k
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();

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

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题