PHP:调用 __call 而不是 __callStatic

标签 php

我正在开发一个自定义 ORM,下面是一个演示该问题的简化示例:

class Foo {
    public static function __callStatic($name, $args){
        if($name == "getBar"){
            return "Bar";
        }
        return NULL;
    }

    public function __call($name, $args){
        if($name == "getFoo"){
            $model = "Foo";
            $method = "getBar";            
            return $model::$method();            
        }
        return NULL;
    }
}

class Foo2 {
    public function __call($name, $args){
        if($name == "getFoo"){
            $model = "Foo";
            $method = "getBar";            
            return $model::$method();            
        }
        return NULL;
    }
}

echo Foo::getBar();//Bar

$foo = new Foo;
var_dump($foo->getFoo()); //Null though I'm expecting Bar

$foo = new Foo2;
var_dump($foo->getFoo()); //Bar

那么为什么在 Foo 内部调用相同的方法会触发 __call 而在 Foo2 内部调用时会触发 __callStatic

最佳答案

那是因为在第一次调用时返回 Null ,并且处于对象上下文中。所以它调用的是 __call() 而不是 __callStatic()

编辑: 在第一种情况下, Foo::getBar() 在 Foo 类实例的范围内调用,因此 Foo::getBar() 实际上与 (instance) 相同->getBar() 这当然不是静态调用。

编辑2:刚刚找到一个关于您的问题的问题+答案:Why does PHP prefer __call() to __callStatic()?

关于PHP:调用 __call 而不是 __callStatic,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39747614/

相关文章:

php - Web 服务 - REST 与 PHP JSON RPC

php - 如何使用 php 将零值视为 true?

javascript - 我们如何在php中将html5 Canvas 图像保存到数据库

php - 调试时禁用第一行 php 脚本 intellij 中断?

php - jQuery 选择器捕获 php if 语句中的类

Php:如何将字符串转换为 double ?

php - Paypal REST API,怎么办?

php - 检查链接是否有效,如果不能直观地识别它是否已损坏

Php显示从url到主页的图像

php - 检查字符串中是否存在至少 3 个不同字符的正则表达式