__callStatic(): 从静态上下文实例化对象?

2022-08-30 22:16:49

我对PHP中的“静态”和“动态”函数和对象如何协同工作感到困惑,特别是在__callStatic()方面。

__callStatic() 的工作原理:

你可以有一个普通的类MyClass,在类中你可以放置一个名为__callStatic()的静态函数,只有当MyClass没有所需名称的静态函数时,才会调用它。

即我打电话MyClass::newFunction();

newFunction()静态调用,但不声明它。所以,然后被叫到里面,你可以说MyClass__callStatic()

$myObject=new SomeOtherClass();
$myObject->newFunction();

它调用您想要的函数,但在其他对象上。

简短版本:

换句话说,__callStatic() 就是这样做的:

MyClass::newFunction();

它隐藏了这个:

(new SomeOtherClass())->newFunction();

现在说什么?看起来像从类调用静态函数的代码,结果是从其他类调用该函数并通过实例化而不是静态调用它。

请解释一下!

为什么要这样做?你能在其他地方做这样的事情吗,比如C++或Java?我正在寻找关于语言中静态和动态函数的简短而简洁但信息丰富的解释,在这种情况下,无论是__callStatic()还是语言结构的大局。还是完全是一种新的语言结构。violatesconforms


答案 1

__callStatic()为开发人员提供了对方法调用做出反应的可能性,即使该方法不存在无法从类外部访问( 是 )。这对于动态的通用代码生成非常有用。staticprotected


示例:您有以下类:

class Test {

    protected static function myProtected($test) {
        var_dump(__METHOD__, $test);
    }

    public static function __callStatic($method, $args) {
        switch($method) {
            case 'foo' :
                echo 'You have called foo()';
                var_dump($args);
                break;

            case 'helloWorld':
                echo 'Hello ' . $args[0];
                break;

            case 'myProtected':
                return call_user_func_array(
                    array(get_called_class(), 'myProtected'),
                    $args
                );
                break;                      
        }

    }

}

尝试拨打:

// these ones does not *really* exist
Test::foo('bar');
Test::helloWorld('hek2mgl');

// this one wouldn't be accessible
Test::myProtected('foo');

答案 2

为什么要这样做?

这是一个存在主义问题,但我认为答案是“因为你可以”。PHP是一种动态语言,这些构造并炫耀它的力量,这种能力在某些情况下是有用的。__call__callStatic()

你能在其他地方做这样的事情吗,比如C++或Java?

不。他们没有类似的魔术方法。

我正在寻找简短明了,但对语言中的静态和动态函数的信息性解释

静态函数封装代码。即使没有实例化任何类,它们也存在。您可以使用范围解析运算符调用它们。动态功能很好,动态

..__callStatic()是否违反或符合语言结构的大局。还是完全是一种新的语言结构。

它是动态语言的构造。不确定此功能是否存在于所有动态语言中,但在PHP中确实存在。它不违反任何内容,只是在您调用的函数不存在/在当前范围内无法访问时引入了跌倒捕获所有函数的新范例。


推荐