ArrayObject
не соответствует array_map
, array_reduce
и аналогичным функциям, которые ожидают реального массива в качестве входа. Если вы хотите, чтобы свойство массива объекта для копирования ссылки, оберните его с любым видом объекта: Использование
class Test
{
private $array;
public function __construct()
{
$this->array = (object) ['array' => []];
}
// we also need to return it by reference
public function &getMyArray()
{
return $this->array->array;
}
}
Пример:
$test = new Test();
$test->getMyArray()[] = 'Hello';
$another = clone $test;
$another->getMyArray()[] = 'Fucking';
$third = clone $another;
$third->getMyArray()[] = 'World!';
unset($test->getMyArray()[1]);
var_dump($test->getMyArray() === $third->getMyArray());
var_dump(implode(" ", $test->getMyArray()));
var_dump(gettype($test->getMyArray()));
Пример вывода:
bool(true)
string(12) "Hello World!"
string(5) "array"
Создать класс оболочки? –
Использование символа & включает в себя меньше ввода текста. – borkweb
Лично я предлагаю не делать ничего, чтобы обойти использование оператора &, в основном для чтения кода. Использование & делает очевидным, что вы имеете дело со ссылкой. Удалить его (используя любой метод) может потенциально вызвать недоразумение для других, читающих ваш код (и даже иногда вы сами даете, что есть время от письменности до повторного чтения .. Не то, чтобы это когда-либо происходило со мной, конечно;)) –