奇怪的行为在PHP匿名对象中连接字符串

时间:2017-02-03 17:26:13

标签: php object

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

CMAKE_MODULE_PATH

在以下循环中,我可以将值分配给$equipTest = (object) [ $leakageLimit = "", $description = "", $location = "", $text = "", ]; $description = ""; 而没有任何问题。

$leakageLimit

$equipTest->leakageLimit = $temp; 不会让我连接错误/通知:

$location

结果:

  

注意(8):未定义的属性:$equipTest->location .= $temp;

正如stdClass::$location所做的那样,直到我在循环外声明了一个temp var。我在循环中为temp描述赋值:

$equipTest->description

然后将它分配给循环结束时的对象:

$description .= $temp; 

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

2 个答案:

答案 0 :(得分:2)

此代码

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

并不意味着

  

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

这意味着

  

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

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

所以,如果你

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

你会看到有4个空值的数组。此外,您的变量$leakageLimit$description$location$text也将设置为空字符串。

因此,如果要创建具有四个命名属性的对象,则代码为:

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

答案 1 :(得分:0)

您的部分问题是您正在向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