这是我的代码:
$words = array();
$word = "this";
$words[] = $word;
$word = "that";
$words[] = $word;
print_r($words);
class word{
private $text;
public function __construct($word){
$this->text=$word;
}
public function setWord($word){
$this->text=$word;
}
}
$class_words = array();
$word = new word("this");
$class_words[] = $word;
$word->setWord("that");
$class_words[] = $word;
print_r($class_words);
exit;
以下是输出:
Array
(
[0] => this
[1] => that
)
Array
(
[0] => word Object
(
[text:word:private] => that
)
[1] => word Object
(
[text:word:private] => that
)
)
我希望第二个输出与第一个输出匹配,因为数组应存储“ this”和“ that”。当array_name[] = <item>
是值数组时,似乎会复制到该项目,但当它是对象数组时则不是。如何使它将对象复制到数组,而不是复制对对象的引用?每次需要向阵列添加对象时都需要创建一个新对象吗?
答案 0 :(得分:1)
如果要将对象的值复制到数组中,则需要为该值写一个“ getter”,例如
class word{
private $text;
public function __construct($word){
$this->text=$word;
}
public function setWord($word){
$this->text=$word;
}
public function getWord() {
return $this->text;
}
}
$class_words = array();
$word = new word("this");
$class_words[] = $word->getWord();
$word->setWord("that");
$class_words[] = $word->getWord();
print_r($class_words);
输出:
Array
(
[0] => this
[1] => that
)
答案 1 :(得分:1)
$x = new X();
将对对象的引用存储到$x
中。后续$y = $x;
复制引用而不是对象,因此$x
和$y
都引用同一个对象。
PHP关于引用的语义相当复杂。
答案 2 :(得分:0)
对象始终是引用;您对$ word的所有使用都指向相同的对象和相同的数据结构。您需要这样做:
$class_words=[new word('this'),new word('that')];
答案 3 :(得分:0)
数组的两个元素都包含相同的对象。因此,每当您对该对象进行更改时,对该对象的所有引用都将显示该更改-它们都是在当前状态中引用相同对象。
如前所述,如果需要不同的值,则需要实例化新对象,或通过返回简单值(字符串,整数,布尔值等)的getter()
来获取属性值,而不是对象本身。
请注意,您可以通过让对象返回对对象的引用(即$Obj->method1()->method2()->method3()
return $this;
)。