PHP数组对对象与值的作用不同

时间:2019-03-18 21:43:25

标签: php arrays

这是我的代码:

$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>是值数组时,似乎会复制到该项目,但当它是对象数组时则不是。如何使它将对象复制到数组,而不是复制对对象的引用?每次需要向阵列添加对象时都需要创建一个新对象吗?

4 个答案:

答案 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
)

Demo on 3v4l.org

答案 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;)。