如何使用$ this访问静态类成员?

sup*_*san 6 php oop reference static-members laravel

我正在尝试访问另一个类中的ActiveModel类的静态类成员.

$class = "\ActiveModel\User";
$class::create(); //WORKS!

$this->class = "\ActiveModel\User";
$this->class::create(); //DOESN'T WORK :( - Throws "Incorrect access to static class member" error
Run Code Online (Sandbox Code Playgroud)

使用它的正确方法是什么$this->var

另一个例子: 在此输入图像描述

小智 5

PHP语言禁止这种构造。还有其他例子。(例如,以前,您无法直接访问函数返回的数组)

$elem = get_array()[0] // Doesn't work until PHP 5.4.0
Run Code Online (Sandbox Code Playgroud)

这些限制背后的主要原因是解析器不喜欢它。因为它们很复杂,或者引起歧义,或者他们想保留这种结构以备将来使用。

您可以通过分配一个临时变量来解决此限制:

$className = $this->class;
$className::create(); // This will work.
Run Code Online (Sandbox Code Playgroud)


NIC*_*ICK 2

因为PHP不支持这种评估5.6.2之前(似乎新版本仍然不支持它)。

如果你确实无论如何都必须这样做,请使用call_user_func()call_user_func_array()像这样:

call_user_func_array(
    array(
        $this->modalClassName, 
        'create'
    ), 
    array()
);
Run Code Online (Sandbox Code Playgroud)

setHasMany并使用以下方法为您的模态类添加方法

call_user_func_array(
    array(
        $this->modalClassName, 
        'setHasMany'
    ), 
    array(['user_level'])
);
Run Code Online (Sandbox Code Playgroud)

而不是直接设置$hasmany变量。

但我不会推荐它。对于这种情况,您可以尝试诸如依赖注入之类的方法。