Как эта страница упоминает, что 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 Вернуть локальную переменную? $ значения не существуют.
public function getValues() {
return $values;
}
вернуть глобальную переменную
публичная функция getValues () {
return $this->values;
}
В соответствии с эта страница массивы не возвращаются по ссылке, а копируются при их возврате (мне было бы интересно узнать, копируются ли объекты, когда они возвращаются: я был бы удивлен, если бы они были). В любом случае, чтобы вернуть массив по ссылке, используйте &
перед именем метода:
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.