Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何使用$this访问静态类成员?_Php_Oop_Laravel_Reference_Static Members - Fatal编程技术网

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

Php 如何使用$this访问静态类成员?,php,oop,laravel,reference,static-members,Php,Oop,Laravel,Reference,Static Members,我试图访问另一个类中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 使用$this->var访问它的正确方法是

我试图访问另一个类中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
使用
$this->var
访问它的正确方法是什么

另一个例子:

您不能执行类似于
$this->class::create()
的操作。如果要访问静态成员,必须使用
Class::member
。Zend PHP解析器的当前实现只支持直接对类名或变量进行静态方法调用。以下是语法:

%token T_PAAMAYIM_NEKUDOTAYIM ":: (T_PAAMAYIM_NEKUDOTAYIM)"

function_call:
    name argument_list
        { $$ = zend_ast_create(ZEND_AST_CALL, $1, $2); }
|   class_name T_PAAMAYIM_NEKUDOTAYIM member_name argument_list
        { $$ = zend_ast_create(ZEND_AST_STATIC_CALL, $1, $3, $4); }
|   variable_class_name T_PAAMAYIM_NEKUDOTAYIM member_name argument_list
        { $$ = zend_ast_create(ZEND_AST_STATIC_CALL, $1, $3, $4); }
|   callable_expr argument_list
        { $$ = zend_ast_create(ZEND_AST_CALL, $1, $2); }
将类属性或方法声明为静态使它们可以访问,而不需要类的实例化。声明为静态的属性不能通过实例化的类对象访问(尽管静态方法可以)

由于静态方法可以在没有创建对象实例的情况下调用,因此伪变量
$this
在声明为静态的方法中不可用

无法使用箭头操作符
->
通过对象访问静态属性

静态属性示例

<?php
class Foo
{
    public static $my_static = 'foo';

    public function staticValue() {
        return self::$my_static;
    }
}

class Bar extends Foo
{
    public function fooStatic() {
        return parent::$my_static;
    }
}


print Foo::$my_static . "\n";

$foo = new Foo();
print $foo->staticValue() . "\n";
print $foo->my_static . "\n";      // Undefined "Property" my_static 

print $foo::$my_static . "\n";
$classname = 'Foo';
print $classname::$my_static . "\n"; // As of PHP 5.3.0

print Bar::$my_static . "\n";
$bar = new Bar();
print $bar->fooStatic() . "\n";
?>
<?php
class Foo {
    public static function aStaticMethod() {
        // ...
    }
}

Foo::aStaticMethod();
$classname = 'Foo';
$classname::aStaticMethod(); // As of PHP 5.3.0
?>

静态方法示例

<?php
class Foo
{
    public static $my_static = 'foo';

    public function staticValue() {
        return self::$my_static;
    }
}

class Bar extends Foo
{
    public function fooStatic() {
        return parent::$my_static;
    }
}


print Foo::$my_static . "\n";

$foo = new Foo();
print $foo->staticValue() . "\n";
print $foo->my_static . "\n";      // Undefined "Property" my_static 

print $foo::$my_static . "\n";
$classname = 'Foo';
print $classname::$my_static . "\n"; // As of PHP 5.3.0

print Bar::$my_static . "\n";
$bar = new Bar();
print $bar->fooStatic() . "\n";
?>
<?php
class Foo {
    public static function aStaticMethod() {
        // ...
    }
}

Foo::aStaticMethod();
$classname = 'Foo';
$classname::aStaticMethod(); // As of PHP 5.3.0
?>

更多信息请访问:


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

如果不管发生什么都必须这样做,请像下面这样使用
call\u user\u func()
call\u user\u func\u array()

call_user_func_array(
    array(
        $this->modalClassName, 
        'create'
    ), 
    array()
);
并通过使用为模态类添加一个
setHasMany
方法

call_user_func_array(
    array(
        $this->modalClassName, 
        'setHasMany'
    ), 
    array(['user_level'])
);
而不是直接设置
$hasmany
变量


不过我不推荐。对于这种情况,您可以尝试类似于依赖注入的方法。

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

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

您只需分配一个临时变量即可绕过此限制:

$className = $this->class;
$className::create(); // This will work.

是的,到目前为止我就是这么做的。。但是将变量提取到另一个变量中似乎有点多余(但是阅读adrian的回复,我想这是现在唯一的方法)
($this->class)::create()
谢谢,但我认为将它提取回一个变量并使用它更容易。。当然,返回局部变量的方式也很好,而且似乎比调用用户函数更快。)