【问题标题】:need help understanding php object property names versus array keys需要帮助理解 php 对象属性名称与数组键
【发布时间】:2013-02-15 19:55:08
【问题描述】:

我在灵活使用 PHP 对象属性名称时遇到了一些麻烦,类似于数组键。

我的理解是数组键可以是任何字符串或整数,例如

$arr = array("crash-me" => "value");

是一个有效的键/值对。

现在,如果我将其“投射”到一个对象:

$obj = (object) $arr;

我是否因为密钥字符串中的破折号而做了违法的事情?

一个简单的例子说明了我的困境:

<?php
error_reporting(-1);
$obj = new stdClass;
$prop = "crash-me";
$arr = array();
$obj->$prop = "no crash"; 
$obj->$prop = $arr; // bp here and $obj->$prop is correct
print_r($obj); // bp here, inspect $obj->$prop and... xdebug/php will crash.
exit;

当您在 print_r() 之前检查 $obj 的值时,这将使使用 xdebug 的 eclipse-pdt 崩溃。

但是,如果没有 bp,则在退出时从 print_r() 正确打印内容。

stdClass Object ( [crash-me] => Array ( ) ) 

请注意,如果我在将某些内容分配给属性时将其填充到数组中,则一切正常:

$obj = new stdClass;
$prop = "crash-me";
$arr = array("works_ok");
$obj->$prop = "no crash";
$obj->$prop = $arr;
print_r($obj);
exit;

底线,我想使用带有破折号的属性名称,可能还有其他类似于数组键的标点符号。是否可以?还是我通过分配一个空数组来做一些非法的事情,在这种情况下不会捕获错误?

非常感谢您的考虑!

在编辑时,我忘记了谜题的另一部分 - 下面的代码不会崩溃。在这种情况下,属性名称没有破折号,但是数组键为空!

$obj = new stdClass;
$prop = "crash_me";  // note underscore
$arr = array();
$obj->$prop = "no crash"; 
$obj->$prop = $arr; // bp here and $obj->$prop is correct
print_r($obj); // bp here, inspect $obj->$prop and... no crash!
exit;

很抱歉造成混乱!这可能是我明显想念的东西。

第二次编辑-

为了澄清,我希望从 json_decode() 读取属性名称并简单地使用对象而无需转换为数组。这是一个使用 json 数据文件中的键进行动态代码生成的实验。根据下面的讨论,看起来如果我想继续使用 PHP,我需要 $arr['key1']['key2']... 语法并让解码器使用“array”标志。

感谢您的精彩回复!

【问题讨论】:

  • 为什么要这样使用它?能够在对象名称中使用破折号有什么好处?顺便说一句,有趣的问题。
  • 我正在尝试自动生成代码并希望创建动态属性。

标签: php


【解决方案1】:

我不确定 xdebug 是否对非标准属性名称有任何问题,但您绝对不想要故意使用这些属性名称。这没有意义。

如果您打算将对象用于 OO 目的,那么您将正式声明它们的属性。在这种情况下,使用“奇怪”的属性名称是完全不可能的,没有什么好说的了。

如果您不打算为 OO 使用对象,那么您最终会得到可以索引 $like-&gt;this 而不是 $like['this'] 的数组。虽然第一种形式较短,我自己也更喜欢它,但使用属性$with-&gt;{'strange-names'} 时它变得更丑陋——实际上比数组访问更糟糕。再说一遍,这样做没有任何好处。

在某些非常特殊的情况下,可能会出现这样的属性名称——例如,如果一个对象使用其属性名称作为数据库表中的列名。但即使在这种情况下,通常在 PHP 属性名称和数据库列名称之间添加一个转换层会更方便,而不是每一步都与语法作斗争。

奖励论点:如果看this question 还不足以改变你的想法,那么什么都不会。这只是一个特定的极端情况,但我们正在谈论 PHP。角落案例应该......避免。

【讨论】:

  • +1 '“奇怪的”属性名,没什么好说的了。'
  • SimpleXMLElement 使用的属性名称可能不是合法的 PHP var 名称,但它们是合法的 XML 元素名称。这样做并不总是不合适的,但我不会养成这样的习惯。
  • 好吧,我害怕那个。我正在尝试一些自动化,并认为可以动态分配属性名称。
  • @user1501974:我想你会发现在这种情况下使用数组并没有什么好处。
  • @user1501974,澄清一下,您可以动态分配属性名称。我们认为您可能应该只使用数组。至于崩溃,这似乎是一个 xdebug 问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-15
  • 1970-01-01
  • 2023-03-09
  • 1970-01-01
相关资源
最近更新 更多