2010-12-31 3 views
2

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

Например:

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

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

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

Создать класс оболочки? –

+1

Использование символа & включает в себя меньше ввода текста. – borkweb

+1

Лично я предлагаю не делать ничего, чтобы обойти использование оператора &, в основном для чтения кода. Использование & делает очевидным, что вы имеете дело со ссылкой. Удалить его (используя любой метод) может потенциально вызвать недоразумение для других, читающих ваш код (и даже иногда вы сами даете, что есть время от письменности до повторного чтения .. Не то, чтобы это когда-либо происходило со мной, конечно;)) –

ответ

1

Если SPL имеется, есть ArrayObject класс:

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

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

+0

I подумайте, что 'ArrayObject :: getArrayCopy()' может быть предпочтительнее кастинга. – Mchl

+0

@Mchl: Спасибо, что поймали это. – BoltClock

0

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" 
Смежные вопросы