【问题标题】:How do I access a PHP object attribute having a dollar sign?如何访问具有美元符号的 PHP 对象属性?
【发布时间】:2011-01-06 18:46:10
【问题描述】:

我有一个 PHP 对象,其属性中带有美元 ($) 符号。

如何访问该属性的内容?

例子:

echo $object->variable; // Ok

echo $object->variable$WithDollar; // Syntax error :-(

【问题讨论】:

  • 先尝试这样做:vardump ($object);,然后检查结果。
  • 如果它来自 SQL 查询,也许您应该在 SQL 中重命名该字段(即,'select variable$withDollar as varwithoutdollar')。
  • @Code Duck :是的,我本来可以的,直到现在我都这样做了,我试图找出是否可以直接在 PHP 中使用。
  • 我想说 Code Duck 在他的评论中给出的解决方案确实是唯一合理的解决方案。编写、阅读和维护充斥着无效变量名和 hacky 代码来解决这些问题的代码将不必要地耗费时间,并且会导致错误和其他无法预料的问题,而每一个问题都需要更多的 hack。尽可能就近解决问题。
  • 正如我在下面的一个 cmets 中所说的,我根本没有任何选择。我必须查询的系统已有 20 年历史,您无法即时更改此类内容。我完全同意你的看法,一般来说,最好的方法是解决问题的根源,但我找到了一种非 hacky 的方法来做我想做的事情。这不再是问题了。

标签: php oop


【解决方案1】:
  1. 与variable variables:

    $myVar = 'variable$WithDollar';
    echo $object->$myVar;
    
  2. 带大括号:

    echo $object->{'variable$WithDollar'};
    

【讨论】:

  • 你的意思是,使用字符串变量?
  • 不,变量 variables 是正确的术语。但是 $ 在变量名中是非法的...
  • @Jan,这并没有改变您可以获得名称中带有 $ 的变量或属性的事实......
  • 哦,这似乎行得通!有没有办法不使用第二个变量 ($myVar) ?类似于:echo $object->'variable$WithDollar';)
  • @Kevin:我在回答中指出了如何做到这一点。但是,您首先要实现什么目标?字段名称中带有 $ 的 mySQL 结果集至少可以说很奇怪。
【解决方案2】:

感谢您的回答,我才知道如何按照我的意图做到这一点:

echo $object->{'variable$WithDollar'}; // works !

我很确定我以前尝试过所有可能的组合。

【讨论】:

    【解决方案3】:

    我假设您想即时访问具有变量名的属性。为此,请尝试

    echo $object->{"variable".$yourVariable}
    

    【讨论】:

    • 我不是在创建它们,它们是 SQL 查询的结果。这不是我想要做的。
    • 你可以。试试这个:$x = 'a$b'; $$x = 'foo'; print_r(get_defined_vars());
    【解决方案4】:

    你没有。

    美元符号在 PHP 中具有特殊的意义。尽管在取消引用类/对象属性时可以绕过变量替换,但您永远不应该这样做。

    不要尝试用文字“$”声明变量。

    如果你不得不处理别人的烂摊子 - 首先修复他们编写的代码以移除美元,然后去砍掉他们的手指。

    C.

    【讨论】:

    • 一些主要运行数据库的软件已有 20 年的历史。相信我,我希望只有可读的列名(而不是 AF$AT1 例如),我正在与数据库进行通信并且无法更改任何内容!
    【解决方案5】:

    有些反射方法还允许您构造方法和属性名称,这些名称可能由变量构建或包含特殊字符。您可以使用 ReflectionClass::getProperty ( string $name ) 方法。

    $object->getProperty('variable$WithDollar');

    【讨论】:

    • 你必须在那里使用单引号。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-02-21
    • 2014-10-02
    • 2017-03-19
    • 2011-11-08
    • 2011-05-21
    • 2012-08-10
    • 2016-10-31
    相关资源
    最近更新 更多