2009-08-21 3 views
2

私はツリーにノードを追加すると、私はその親のアドレス(私はそう思った)、その中に格納します。&in PHPはアドレスを意味しませんか?どのように木ノードに親ポインタを格納するのですか?

-- Client -- 
$parent = new Node(); 
$child = new Node(); 
$parent->add($child) 

-- Class Node -- 
function add($child) { 
    $this->setParent(&$this); 
    $this->children[] = $child; 
} 

function setParent($ref_parent) { 
    $this->ref_parent = $ref_parent; 
} 

をしかし、私は$チャイルド> ref_parentエコーしようとすると、それがキャッチできる「に失敗しました私は&を使用します。子オブジェクトに親オブジェクトを格納したくないのですが、どのようなアイデアでも動作しないようですね。

+0

もう少しupvotedする必要があります。私たち全員が行うパラダイムシフトミスの完璧な例。 –

+0

@ e-satis:私は同意しません。実際には、この問題は、マニュアルを読まず、PHPのような奇妙な前提をCのようにしてしまった結果です。つまり、 "new"と "&"ポインタを返す " - >"間接的な " C++のような演算子、$ thisはポインタでなければなりません。したがって、&$ thisはオブジェクト型の**でしょう。だから、私はこれが特に良い質問ではないと思うので、私は確かにアップボートしません。 –

答えて

5

いいえ、いいえ、いいえ。 PHPのメモリアドレスのような低レベルの概念に分解することはできません。値のメモリアドレスを取得することはできません。 $thisなどのオブジェクトは常に参照渡しされるため、オブジェクトはコピーされません。少なくともPHP5では。

9

エラーメッセージは「キャッチ可能な致命的なエラー」なので、PHP4ではなくPHP5を使用していることを示します。 PHP5以降、オブジェクトは常に参照渡しされるため、 '&'を使用する必要はありません。

ところで:あなたの問題は何ですか?大丈夫だと思われますが、エラーはクラスが文字列に変換できないために発生し、エコーで使用することはできません。 echoを実行するときに便利な何かを表示するには、魔法の__toString()メソッドを実装してみてください。

+0

うん、私はちょうどそれがアドレスであることを確認したいエコーを使用して(Cの方法で考える)、今私は親データがこのようにコピーされていないことを学んだ – Edward

4

php5オブジェクトは参照渡しとなりますので、&は必要ありません。メソッドの宣言もメソッド呼び出し(これも非推奨)ではありません。 $の親が(コピーではなく、コピー・オン・ライト - thingeling)を行うように$の子供が実際には同じオブジェクトへの参照を格納することを意味し

<?php 
$parent = new Node(); 
$child = new Node(); 
$parent->add($child); 
$child->foo(); echo "\n"; 
// decrease the id of $parent 
$parent->bar(); 
// and check whether $child (still) references 
// the same object as $parent 
$child->foo(); echo "\n"; 

class Node { 
    private $ref_parent = null; 
    private $id; 

    public function __construct() { 
    static $counter = 0; 
    $this->id = ++$counter; 
    } 

    function add($child) { 
    $child->setParent($this); 
    $this->children[] = $child; 
    } 

    function setParent($ref_parent) { 
    $this->ref_parent = $ref_parent; 
    } 

    public function foo() { 
    echo $this->id; 
    if (!is_null($this->ref_parent)) { 
     echo ', '; 
     $this->ref_parent->foo(); 
    } 
    } 

    public function bar() { 
    $this->id -= 1; 
    } 
} 

プリント

2, 1 
2, 0 

関連する問題