如何使用 $this 访问静态 class 成员?
How can I access to static class members using $this?
我正在尝试访问另一个 class 中 ActiveModel class 的静态 class 成员。
$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 解析器的当前实现仅支持直接在 class 名称或变量上进行的静态方法调用。这是语法:
%token T_PAAMAYIM_NEKUDOTAYIM ":: (T_PAAMAYIM_NEKUDOTAYIM)"
function_call:
name argument_list
{ $$ = zend_ast_create(ZEND_AST_CALL, , ); }
| class_name T_PAAMAYIM_NEKUDOTAYIM member_name argument_list
{ $$ = zend_ast_create(ZEND_AST_STATIC_CALL, , , ); }
| variable_class_name T_PAAMAYIM_NEKUDOTAYIM member_name argument_list
{ $$ = zend_ast_create(ZEND_AST_STATIC_CALL, , , ); }
| callable_expr argument_list
{ $$ = zend_ast_create(ZEND_AST_CALL, , ); }
将 class 属性或方法声明为静态使得它们无需实例化 class 即可访问。声明为静态的 属性 无法使用实例化的 class 对象访问(尽管静态方法可以)。
因为静态方法无需创建对象实例即可调用,伪变量$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
?>
阅读更多内容:
http://php.net/manual/en/language.oop5.static.php
Call static method with class name stored as instance variable
https://github.com/php/php-src/blob/master/Zend/zend_language_parser.y#L890
因为PHP在5.6.2之前不支持那种求值(好像新版本还是不支持)
如果无论如何都必须这样做,请像这样使用 call_user_func()
或 call_user_func_array()
:
call_user_func_array(
array(
$this->modalClassName,
'create'
),
array()
);
并使用
为模态 class 添加 setHasMany
方法
call_user_func_array(
array(
$this->modalClassName,
'setHasMany'
),
array(['user_level'])
);
而不是直接设置 $hasmany
变量。
虽然我不推荐它。对于这种情况,您可以尝试 依赖注入。
PHP 语言禁止这种结构。还有其他例子。 (例如,以前,您不能直接访问函数返回的数组)
$elem = get_array()[0] // Doesn't work until PHP 5.4.0
这些限制背后的主要原因是解析器不喜欢它。因为它们很复杂,或者导致歧义,或者他们想保留这样的结构以备将来使用。
您可以通过分配一个临时变量来解决此限制:
$className = $this->class;
$className::create(); // This will work.
我正在尝试访问另一个 class 中 ActiveModel class 的静态 class 成员。
$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 解析器的当前实现仅支持直接在 class 名称或变量上进行的静态方法调用。这是语法:
%token T_PAAMAYIM_NEKUDOTAYIM ":: (T_PAAMAYIM_NEKUDOTAYIM)"
function_call:
name argument_list
{ $$ = zend_ast_create(ZEND_AST_CALL, , ); }
| class_name T_PAAMAYIM_NEKUDOTAYIM member_name argument_list
{ $$ = zend_ast_create(ZEND_AST_STATIC_CALL, , , ); }
| variable_class_name T_PAAMAYIM_NEKUDOTAYIM member_name argument_list
{ $$ = zend_ast_create(ZEND_AST_STATIC_CALL, , , ); }
| callable_expr argument_list
{ $$ = zend_ast_create(ZEND_AST_CALL, , ); }
将 class 属性或方法声明为静态使得它们无需实例化 class 即可访问。声明为静态的 属性 无法使用实例化的 class 对象访问(尽管静态方法可以)。
因为静态方法无需创建对象实例即可调用,伪变量$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
?>
阅读更多内容:
http://php.net/manual/en/language.oop5.static.php
Call static method with class name stored as instance variable
https://github.com/php/php-src/blob/master/Zend/zend_language_parser.y#L890
因为PHP在5.6.2之前不支持那种求值(好像新版本还是不支持)
如果无论如何都必须这样做,请像这样使用 call_user_func()
或 call_user_func_array()
:
call_user_func_array(
array(
$this->modalClassName,
'create'
),
array()
);
并使用
为模态 class 添加setHasMany
方法
call_user_func_array(
array(
$this->modalClassName,
'setHasMany'
),
array(['user_level'])
);
而不是直接设置 $hasmany
变量。
虽然我不推荐它。对于这种情况,您可以尝试 依赖注入。
PHP 语言禁止这种结构。还有其他例子。 (例如,以前,您不能直接访问函数返回的数组)
$elem = get_array()[0] // Doesn't work until PHP 5.4.0
这些限制背后的主要原因是解析器不喜欢它。因为它们很复杂,或者导致歧义,或者他们想保留这样的结构以备将来使用。
您可以通过分配一个临时变量来解决此限制:
$className = $this->class;
$className::create(); // This will work.