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

Den*_*nis 13 php static instantiation magic-methods

我很困惑PHP中的"静态"和"动态"函数和对象如何协同工作,特别是关于__callStatic().

__callStatic()的工作原理如下:

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

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

newFunction()被静态调用,但MyClass没有声明它.所以,然后__callStatic()被调用,你可以说

$myObject=new SomeOtherClass();
$myObject->newFunction();
Run Code Online (Sandbox Code Playgroud)

它调用你想要的函数但是在其他一些对象上.

精简版:

换句话说,__ callStatic()执行此操作:

MyClass::newFunction();
Run Code Online (Sandbox Code Playgroud)

这隐藏了这个:

(new SomeOtherClass())->newFunction();
Run Code Online (Sandbox Code Playgroud)

说什么呢?看起来代码从类中调用静态函数看起来就是从其他类调用该函数并通过实例化调用它,而不是静态调用.

请解释一下!

为什么这样做?你可以在其他地方做这样的事情,比如C++或Java吗?我正在寻找关于语言中静态和动态函数的简短而简洁但有用的解释,在这种情况下,无论是__callStatic()violates还是conforms语言结构的大图.或者它完全是一种新的语言结构.

hek*_*mgl 11

__callStatic()为开发人员提供了对static方法调用做出反应的可能性,即使这些方法不存在或者无法从类外部访问(正在protected).这对于动态的通用代码生成很有用.如果你没有看到它有用,你可能目前不需要这个功能,应该继续学习基础知识.


示例:您有这个类:

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;                      
        }

    }

}
Run Code Online (Sandbox Code Playgroud)

试着打电话:

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

// this one wouldn't be accessible
Test::myProtected('foo');
Run Code Online (Sandbox Code Playgroud)

懂了吗?