【问题标题】:Cant get static variable from $class无法从 $class 获取静态变量
【发布时间】:2012-08-18 17:44:57
【问题描述】:

我有一个关于“动态”类初始化的问题,让我解释一下我的意思:

$class = 'User';
$user = new $class();

//...is the same as doing
$user = new User();

所以...这不是问题,但是我在从类中调用静态变量时遇到了一些麻烦,例如:

$class = 'User';
print $class::$name;

这给出了以下错误:

解析错误:语法错误,出现意外的 T_PAAMAYIM_NEKUDOTAYIM

当然,我已经测试过print User::$name; 并且有效。所以课堂有效。

为什么会这样?有办法解决吗?

跟进问题:
还有什么正当理由不使用这种“动态”方式来创建类?

【问题讨论】:

  • 你不能混合动态和静态调用,这就是为什么不能调用 User::$$prop 和你的 $class::$name
  • 我不喜欢这种做你想要达到的目标的方法。如何保证存储在字符串$class 中的类中有静态变量$name?如果你能保证,那么我认为没有理由将类名存储在变量中。
  • @ThomasClayson 是我的例子,我用它来加载在变量中都有相同“元数据”的插件类,例如版本和名称。所有插件类都在扩展和实现,以确保它们具有正确的结构和数据。

标签: php class scope


【解决方案1】:

如果您没有 5.3 及以上的 PHP 版本,并且您不想使用反射(在我看来这是一种矫枉过正 - 除非您想访问多个静态属性),您可以定义 getter 函数并调用它通过 call_user_func():

class A {
    public static $var = "Hello";
    public static function getVar() {
        return self::$var;
    }
}
$className = "A";
echo call_user_func(array($className, 'getVar'));

【讨论】:

  • 嗯,这肯定是解决问题的方法......谢谢!
  • 似乎更简单的解决方法是; $vars = get_class_vars($className);
【解决方案2】:

这是我在 cmets 中链接的问题的答案:

您可以使用reflection 来执行此操作。创建一个ReflectionClass 给定类名的对象,然后使用 getStaticPropertyValue 获取静态变量值的方法。

class Demo
{
    public static $foo = 42;
}

$class = new ReflectionClass('Demo');
$value=$class->getStaticPropertyValue('foo');
var_dump($value);

【讨论】:

  • 使用反射似乎是一种矫枉过正的解决方案,除非您打算在静态类的大量属性上使用它,但是是的,使用反射将为您提供所需的结果
  • 此外,从错误消息中可以看出,OP 使用的是 php 的任何版本(5.3.something)之前的版本,该版本对静态类和静态类变量有适当的支持,因此这可能是最佳选择。
  • 与仅仅创建“真实”类然后获取我的变量的真正区别是什么?喜欢:$user = new $class(); print $user->name;?使用反射有性能提升吗?
  • 静态变量和实例变量是两个不同的东西。我可能会使用实例变量并做你想做的事,反射是一种非常迂回的方式来做你需要的事情。对于你需要的只是使用实例变量(我假设你在某个时候实例化了这个类?)
【解决方案3】:

此代码在 PHP 5.4.3 上运行良好:

<?php

class A {
    public static $var = "Hello";
}

print(A::$var);

$className = "A";
print($className::$var);

?>

【讨论】:

  • 这是 OP 的代码。大概(尽管他没有说明)他必须使用早期版本的 PHP。
  • 好吧,那么我知道问题出在我的 PHP 版本上。 :) 谢谢!
猜你喜欢
  • 1970-01-01
  • 2015-06-02
  • 1970-01-01
  • 1970-01-01
  • 2015-07-22
  • 2012-06-29
  • 1970-01-01
  • 2018-02-06
  • 1970-01-01
相关资源
最近更新 更多