【问题标题】:Strange behaviour concatenating string in a PHP anonymous objectPHP匿名对象中的奇怪行为连接字符串
【发布时间】:2017-06-21 03:37:10
【问题描述】:

也许有人可以帮助解释这个匿名对象的奇怪行为:

$equipTest = (object) [
  $leakageLimit = "",
  $description = "",
  $location = "",
  $text = "",
 ];
$description = "";

在下面的循环中,我可以毫无问题地为$leakageLimit 赋值。

$equipTest->leakageLimit = $temp; 

$location 不会让我在没有错误/通知的情况下连接它:

$equipTest->location .= $temp; 

结果:

注意(8):未定义属性:stdClass::$location

就像 $equipTest->description 所做的那样,直到我在循环外声明了一个临时变量。我将值分配给循环中的临时描述:

$description .= $temp; 

然后在循环结束时将其分配给对象:

$equipTest->$description = $description;

为什么我不能连接到这个匿名对象?之前我把它作为一个完全声明的类的一部分是可以的。

【问题讨论】:

标签: php object


【解决方案1】:

这段代码

[
  $leakageLimit = "",
  $description = "",
  $location = "",
  $text = "",
]

不代表

用四个 named 元素创建数组,并用空字符串初始化每个元素。

意思是

创建由四个数字索引元素组成的数组,并将每个元素的值设置为将空字符串分配给变量的结果。

分配的结果是一个被分配的值,即 - 空字符串。

所以,如果你

print_r([
  $leakageLimit = "",
  $description = "",
  $location = "",
  $text = "",
]);

您将看到包含 4 个空值的数组。您的变量 $leakageLimit$description$location$text 也将设置为空字符串。

所以,如果你想创建具有四个命名属性的对象,你的代码是:

$equipTest = (object) [
  'leakageLimit' => "",
  'description' => "",
  'location' => "",
  'text' => "",
];

【讨论】:

  • 啊!我现在知道了。我唯一的辩护是我今天早上 7 点开始编码。谢谢。
【解决方案2】:

部分问题是您将array 转换为object。这有时会产生不可预测的事情,它在这里。如果你var_dump($equipTest)你会得到的是

object(stdClass)#1 (4) {
  [0]=>
  string(0) ""
  [1]=>
  string(0) ""
  [2]=>
  string(0) ""
  [3]=>
  string(0) ""
}

您会注意到它没有像您期望的那样保留密钥。当你这样做

$equipTest->leakageLimit = 'someval';

它实际上创建了变量。

object(stdClass)#1 (5) {
  [0]=>
  string(0) ""
  [1]=>
  string(0) ""
  [2]=>
  string(0) ""
  [3]=>
  string(0) ""
  ["leakageLimit"]=>
  string(7) "someval"
}

如果我是你,我会先创建一个定义这些值的类,然后你可以将它们连接起来。它避免了the nasty side effects of casting

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-09
    • 1970-01-01
    • 2018-10-01
    • 2016-12-26
    相关资源
    最近更新 更多