2016-03-19 5 views
0

まったく同じクラスインスタンスを含む可能性のある2つの変数を比較する方法がわかりません。PHPが変数がこの正確なクラスインスタンスであるかどうかを調べる

抽象クラス(その一部は以下に示されています)には、それを含むオブジェクトを識別するためのfetch_mother()メソッドがあり、スタックの最下部にあるため自身を返します。理論的には、スタックの深さは5以下でなければなりません。

ほとんどのインスタンスはカテゴリのようなものを表します。

期待出力された:[SITEURL] /システム/ドラフト/たとえばオン/また-DEV-ノート/

実際の出力した:SITEURL] /ゲットget_full_path()メソッドで

これは、サニティチェックがループを開始し、ループを壊すことを意味します。また、返されたオブジェクトが$thisと同じであることを正しくテストしていないことも意味します。

どうすれば確認できますか?$var===$this?問題が起きる

コード:

<?php 
namespace modules\content\classes; 
use modules\core\interfaces as i; 
use modules\core\classes as c; 

abstract class content_object extends c\module_lib { 

    // vars 
    // ... 
    protected $mother; 
    protected $map 

    // ... code ... 

    public function get_object_map(){ 
     return $this->map; 
    } 

    /** 
    * Get the stream holding this item 
    * @return \modules\content\classes\error|\modules\content\classes\content_object 
    */ 
    public function &fetch_mother(){ 
     if(isset($this->mother) && is_object($this->mother)){ 
      return $this->mother; 
     } 
     $mother = $this->module()->find_object_stream($this); 
     if(!($mother instanceof \modules\core\error) && is_object($mother) && $mother != $this){ 
      $this->mother = $mother; 
      return $mother; 
     }else{ 
      // I am my own mother ? \\ 
      return $this; 
     } 
    } 

    protected function fetch_full_path_from_mother($path='',$sanity=10){ 
     $map = $this->get_object_map(); 
     $mother = $this->fetch_mother(); 
     $path = $map . '/' . $path; 
     if($this==$mother || !is_object($mother) || $sanity<1){ 
      return $path; 
     } 
     $sanity--; 
     return $mother->fetch_full_path_from_mother($path,$sanity); 
    } 

    public function get_full_path(){ 
     $home = $this->get_core()->factory()->get_config('home'); 
     return $home . $this->fetch_full_path_from_mother(); 
    } 
} 
+1

あなたの質問は不明ですか? '==='はあなたが望むものを正確に行い、オブジェクトが同じインスタンスであるかどうかをテストします。 – Twifty

+0

それは私が思ったのだが... –

+1

@Twifty nopsは彼が望むことをする。 '==='は、オブジェクトが同じ(まったく同じ)場合にのみtrueを返します。 – Lucas

答えて

0

ここで答えは非自明です。

<?php 
$foo = $this; 
if($foo==$this){ 
    echo 'It is'; 
}else{ 
    echo 'It is not'; 
} 

上記の出力はIt isになります。

これは、2つのオブジェクトが同じインスタンスである場合、これを判断するには==比較が十分であるためです。

同様に(コメントごとに)spl_object_hash($mother)==spl_object_hash($this)も同じです同じオブジェクトであれば同じです。ただし、同じプロパティを持つ別のオブジェクトが作成された場合は、別々のオブジェクトであるため、上記はfalseになります。そのまったく同じ話題で

この質問と回答の取引は:spl_object_hash matches, objects not identical

(私が最初に表示されませんでした)私の質問で仮定ルックアップ機能は、工場やキャッシングのオブジェクトとして機能しているということです。差異のある結論は、コピーまたは2番目のインスタンスが返されていることでなければなりません。

したがって、問題はfetch_mother()メソッドである必要があります。

(詳しい調査の結果、実際にこれが問題であったことを示しているんでした。)

ソリューションは、(データベースから引き出されたいくつかのユニークなフィールドがあるとして、この場合に働く)一致するプロパティをチェックまたはprint_r出力を比較しています。

if(print_r($mother,true)==print_r($this,true)){ 
    // code 
} 

この特定の解決策は、醜く、控えめで、信頼性が高くありません。

より良い解決策は、スタックの上位にあるオブジェクトキャッシュを実装することです。 (これは私が提案するものです)。

TL; DR:同じプロパティを持つオブジェクトは、まだ同じではありません。

関連する問題