2010-12-31 28 views
2

&演算子を使用せずに常に参照によって扱われるPHP配列を作成する方法はありますか?例えばPHP配列、常に参照渡し

$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"