【问题标题】:How Do I Retrieve a Static Property From a Dynamic Object in a Single Expression?如何从单个表达式中的动态对象中检索静态属性?
【发布时间】:2019-02-12 03:50:35
【问题描述】:

将我的一些非静态变量换成静态变量后,我得到了一些类似于这里的表达式。这会引发语法错误,但我不知道为什么。

Class Bar  {
    public static $name = "bar";
}

Class Foo {
    public function getParent(){
        $this->parentClass = new Bar();
        return $this;
    }
}

$foo = (new Foo())->getParent();
echo ($foo->parentClass)::$name; //this line is throwing a syntax error

//output:
PHP Parse error:  syntax error, unexpected '::' (T_PAAMAYIM_NEKUDOTAYIM)

如果我将对象分配给一个变量,那么它不会抛出错误:

$class = $foo->parentClass;
echo $class::$name;
//outputs "bar";

我可以想象可能会遇到一些意外的操作顺序问题,但无法弄清楚为什么这是一个语法错误,我想知道是否有一种方法可以在单行表达式中执行此操作。 (由于这个问题是由大量查找/替换引起的,最好将其保留在一行中)

【问题讨论】:

  • 哪个php版本? php 7.2 没有语法错误。
  • 我使用的是 PHP 5.6,我注意到它可以在 PHP >7 上运行,但不幸的是我们的系统还没有支持
  • 一种方法是在Bar 中创建一个返回静态变量的方法,而不是尝试直接访问它。像这样的东西:3v4l.org/lKkZZ。然后你甚至可以在一行中完成(在实例化之后继续链接)

标签: php syntax syntax-error


【解决方案1】:

有点难看,但如果你真的需要单线:

echo get_class_vars(get_class($foo->parentClass))["name"];

灵感来自this answer

DEMO

【讨论】:

  • 你是对的......它完成了工作并且很丑:-p
  • @MagnusEriksson 是的,我会自己先分配给一个变量,但我会把选择权留给 OP。
  • 所有其他阅读您的代码的开发人员可能想伤害您。
  • 嘿,不要射信使:-)
  • @MagnusEriksson,谢谢我确实选择了 2 线路线。
【解决方案2】:

事实上,这只能从 PHP 7.0 开始。改变的行为没有很好的记录。我认为这更像是一个错误修复而不是一个新功能。

然而,最接近“单线”(在 5.6 中工作)的解决方案似乎是这个:

$bar = (new Foo())->getParent()->parentClass;
echo $bar::$name; 

也许这不是你想要达到的。 重要的是静态类只能通过先放入单个变量来访问。

我建议紧急迁移到 PHP7。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-05
    相关资源
    最近更新 更多