2011-01-04 5 views
0

クラス内には、すべて同じオブジェクトを指す必要がある3つの配列(インスタンス変数として)があります。最初は、数値的に配列された配列で、私はいくつかの外部関数から戻ってきます。 2番目の配列は、同じオブジェクトをその名前でインデックスする必要があります。他のいくつかのプロパティで3番目。これは、これらのプロパティを使用した高速アクセス用です。つまり、オブジェクトにアクセスして変更するためにどの配列を使用するかは重要ではありません。異なるインデックスを付けられたPHP配列を同じオブジェクトを指すようにする方法

しかし、それは起こりえません。私はPHPのリファレンスについて知っています。私はJavaのリファレンスについて知っています。私はCのポインタについて知っていますが、どこでもアンパサンド(= &)を配置しようとすると、それを実現させることはできません。

class xxx { 

    private $objs; 
    private $objsByName; 

    public function __construct() { 

    $this->objs = getObjs(); 
    $this->objsByName = array(); 
    foreach($this->objs as $obj) { 
     $this->objsByName[$obj->getName()] = $obj; 
    } 
    } 

} 

私は何かが欠けています= &

で=交換しようとしていないここには場所がありませんか?

+0

ようこそStackOverflow。 '{}'ツールバーボタンでソースコードを書式設定することができます(私はあなたのためにこれを行いました)。あなたの問題を解決する最良の答えを* Accepted *としてタグ付けすることを忘れないでください。 –

答えて

0

foreachループをこれに置き換えます。

for($i = 0 , $n = count($this->objs); $i < $n ; $i ++){ 

$this->objsByName[$this->objs[$i]->getName()] = &$this->objs[$i]; 

} 

これはあなたの問題を解決します:)

感謝を!

フセイン。

0

PHPでは、オブジェクトは常に参照(you cannot copy an object unless you use clone keyword)によって渡されます。このコードは、これを示しています:

<?php 

class AnObject{ 
    private $name; 
    public $count=0; 

    public function __construct($name){ 
     $this->name = $name; 
    } 

    public function getName(){ 
     return $this->name; 
    } 
} 

function getObjs(){ 
    return array(
     new AnObject('One'), 
     new AnObject('Two'), 
     new AnObject('Three'), 
    ); 
} 


class xxx { 

    private $objs; 
    private $objsByName; 

    public function __construct() { 

    $this->objs = getObjs(); 
    $this->objsByName = array(); 
    foreach($this->objs as $obj) { 
     $this->objsByName[$obj->getName()] = $obj; 
    } 
    } 

    public function alterAnObjectByName($name){ 
     $this->objsByName[$name]->count++; 
    } 

} 

$x = new xxx; 
var_dump($x); 
$x->alterAnObjectByName('Two'); 
var_dump($x); 

問題はおそらく他の場所です。

0

マークPHPマニュアルから、この部分: http://php.net/manual/en/control-structures.foreach.php

配列が参照されていない限り、foreachのは、指定された配列ではなく、配列自体のコピーで動作します。 foreachには配列ポインタにいくつかの副作用があります。 foreach中または後に配列ポインタをリセットせずにそれに頼らないでください。

あなたの$ objはコピーです。

私はフセインのコードをテストしていませんが、それは良いオプションのように見えます:)

0

PHPは、常に書き込み機能にコピーを使用し、チャンスは1が変更されるまで、あなたのオブジェクトが同じになるということです。

エラーを避けるには、配列の1つにデータが含まれていて、他のものが単なるインデックスであると言う必要があります。

インデックスを使用してidを検索し、idでインデックス付けされたデータ配列を使用してデータを読み取り、変更します。PHP5で

0

あなたはforeachループがオブジェクトのクローンを作成しませ作るためにas変数に&を追加することができます。

foreach($this->objs as &$obj) { 
    $this->objsByName[$obj->getName()] = &$obj; 
} 

参考:http://php.net/manual/en/control-structures.foreach.php

P/S:&場合、私はわからないんだけどforeachの体の中に必要かどうかだけではなく、それを追加して安全です。または、それを削除して、それが必要かどうかを調べることができます。