Как изменить составной тип данных, изменив возвращенный закрытый элемент данных?

Как эта страница упоминает, что PHP имеет восемь примитивных типов данных, а именно: скаляры (логическое, целое число, число с плавающей точкой, строка), составные (массив и объект) и специальные (ноль и ресурс).

Я хотел бы спросить, поскольку массивы являются составными типами данных, они должны возвращаться по ссылке в отличие от скаляров, которые копируются при возврате. Так что я должен иметь возможность изменить возвращенный закрытый элемент данных (в C ++ это работает). Так почему же не изменяется тип данных внутреннего массива (согласно комментарию в коде)?

ПРИМЕЧАНИЕ. Я знаю, что изменение закрытых элементов данных таким образом является плохим кодированием, но мне было интересно, почему это не работает.

Вот ссылка на код на ideone.com.

<?php

class Foo {

private $values;

public function __construct() {

$this->values = array();

}

public function addElement($key, $value) {

$this->values[$key] = $value;

}

public function getValues() {

return $this->values;

}

}

$foo = new Foo();
$foo->addElement("hello", "John Doe");
//WHY DOESN'T THE FOLLOWING LINE ALTER $foo->values ?
$foo->getValues()["goodbye"] = "Jane Doe";

var_dump($foo);

-1

Решение

1 Вернуть локальную переменную? $ значения не существуют.

public function getValues() {
return $values;
}
  1. вернуть глобальную переменную

    публичная функция getValues ​​() {

    return $this->values;
    

    }

0

Другие решения

В соответствии с эта страница массивы не возвращаются по ссылке, а копируются при их возврате (мне было бы интересно узнать, копируются ли объекты, когда они возвращаются: я был бы удивлен, если бы они были). В любом случае, чтобы вернуть массив по ссылке, используйте & перед именем метода:

public function &getValues() {

return $this->values;

}

ВЫХОД:

object(Foo)#1 (1) {
["values":"Foo":private]=>
array(2) {
["hello"]=>
string(8) "John Doe"["goodbye"]=>
string(8) "Jane Doe"

Вот код на ideone.com.

0

По вопросам рекламы [email protected]