【问题标题】:PHP 5.5: accessing a static class member of a dynamic class stored in an objectPHP 5.5:访问存储在对象中的动态类的静态类成员
【发布时间】:2015-12-27 20:53:32
【问题描述】:

我们假设如下:

class a {
  public static $foo = 'bar';
}
class b {
  public $classname = 'a';
}
$b = new b();

是否可以以某种方式(大括号等)直接访问 $foo 而不会生成“意外 :: (T_PAAMAYIM_NEKUDOTAYIM)”:

$b->classname::$foo //should result in "bar" not in an "unexpected :: (T_PAAMAYIM_NEKUDOTAYIM)"

我知道并使用以下解决方法:

$c = $b->classname;
$c::$foo;

但我想知道是否存在另一种直接访问 $foo 的好方法。

【问题讨论】:

标签: php variables static


【解决方案1】:

你可以像使用变量变量那样做

class a {
  public static $foo = 'bar';

  public function getStatic(){
      return self::$foo;
  }
}
class b {
  public $classname = 'a';
}
$b = new b();
$a = new a();
echo ${$b->classname}->getStatic();//bar

【讨论】:

  • 我认为关键是在不知道 b 中属性类名的内容的情况下获取 'bar'。如果你需要创建一个新的 a(),有什么意义呢?
  • 我没有 "a" 的实例(由于缺少构造函数参数,我无法创建实例),因此您的解决方案将不起作用。
【解决方案2】:

为了记录,以下在 PHP 7 中有效:

echo  $b->classname::$foo;

旧版本需要一种解决方法,就像您正在使用的版本一样(这已经是“最好的”版本了),因为解析器的工作方式不同。

【讨论】:

    【解决方案3】:

    你需要构建这个表达式:

    $string = a::$foo;

    你可以这样使用 eval:

    eval('$string=' . $b->classname . '::$foo;');
    
    print($string);
    

    【讨论】:

    • OP 要求一种“好”的方式 ;-)
    • 是的,好吧,我认为他不会比现在做得更好,只是提供替代方案。
    • 确认。但是推荐eval有点过分了,你不觉得吗?
    • 猜猜这取决于 OP 来“评估”(眨眼,眨眼)
    • 我也同意 eval 不是好方法 ;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-05
    • 2021-01-21
    • 1970-01-01
    • 1970-01-01
    • 2011-04-18
    • 1970-01-01
    相关资源
    最近更新 更多