PHP Array, всегда по ссылке - PullRequest
       1

PHP Array, всегда по ссылке

2 голосов
/ 31 декабря 2010

Есть ли способ создать массив PHP, который всегда обрабатывается по ссылке, без необходимости использования оператора &?

Например:

$a = array_by_ref('a', 'b', 'c');
$b = $a;
$b[] = 'd';

должен привести к обоим $a и $b равны:

('a', 'b', 'c', 'd')

Ответы [ 2 ]

1 голос
/ 31 декабря 2010

Если доступно SPL, существует класс ArrayObject:

$a = new ArrayObject(array('a', 'b', 'c'));
$b = $a;
$b[] = 'd';

Это всё ещё объекты-обёртки; чтобы получить их примитивные массивы, вы должны использовать метод объекта getArrayCopy(). Также имейте в виду, что он может быть довольно медленным, особенно когда вы выполняете его элементы.

0 голосов
/ 24 марта 2014

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"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...