2011-02-09 7 views
9

PHPプログラムでは、いくつかのカスタムオブジェクトの配列があり、配列に特定のオブジェクトが含まれているかどうかを調べたいと思います。もちろん、私はarray_searchを使うことができますが、オブジェクトが同じオブジェクトであるかどうかをチェックします。同じ変数を持つ場合はそうではありません。だから、私はarray_searchメソッド(または類似のもの)で使うことができる、オブジェクトのために私自身の比較関数を作成できるようにしたい。php overload equals-operator

class foo 
{ 
    public $_a,$_b; 
    function __construct($a,$b) 
    { 
     $this->_a = $a; 
     $this->_b = $b; 
    } 

    function __equals($object) 
    { 
     return $this->_a == $object->_a; 
    } 
} 
$f1 = new foo(5,4); 
$f2 = new foo(4,6); 
$f3 = new foo(4,5); 

$array = array($f1,$f2); 
$idx = array_search($f3,$array); // return 0 

はこの可能のようなものです: 私はこのような何かを行うことができるようにしたいですか? クラスのメソッドを使用する独自のarray_searchメソッドを作成することもできますが、2つの異なる検索関数を使用するよりも、独自のcompare関数を持つクラス用と、 't。

+2

array_searchは、3番目の$ strictパラメータをtrueに設定すると、オブジェクトが同じインスタンスであるかどうかのみをチェックします。それ以外の場合、2つのオブジェクトは「同じ属性と値を持ち、同じクラスのインスタンスです」と等しいとみなされます。[==](http://php.net/manual/en/language。 oop5.object-comparison.php)演算子。 – yscik

答えて

8

ここで私が最近見つけた小ぎれいなトリックです:

class Foo { 
    public $a; 
    public $b; 

    public function __toString() { 
     return (string)$this->a; 
    } 

    public function __construct($a, $b) { 
     $this->a = $a; 
     $this->b = $b; 
    } 

} 

$a = new Foo(1, 'a'); 
$b = new Foo(2, 'b'); 
$c = new Foo(3, 'c'); 
$d = new Foo(2, 'd'); 
$array = array($a, $b); 

$key = array_search($d, $array);   // false 

$key = array_search((string)$c, $array); // false 
$key = array_search((string)$d, $array); // 1 

また、これは動作します:

$is_equal = ((string)$d == $b);   // true 

文字列を通過したときに$針array_searchが中に含まれるオブジェクトをキャストしようとします$ haystackこれを比較する文字列には、__toStringというマジックメソッドがあればそれを呼び出します。この場合はFoo::$aを返します。

+1

ありがとう!それは本当に素晴らしいトリックでした! – Tiddo

+0

これは非常に役に立ちます。オブジェクトを文字列と比較する限り、PHPは '__toString'メソッドを使用してオブジェクトを文字列値に変換します。 –

3

通常はありません。あなたはPECL Operators -Extensionを見るかもしれませんが、それは本当に古いものです。

+2

これは5.3 *と* 5.4のために更新されましたが、リリース間の7年間に渡るパッケージは、メンテナンスの信頼を鼓舞しません。 –

+1

@XiongChiamiovそれが動作すれば、更新の必要はありませんか? – KingCrunch

+1

さらに、まだベータ状態です。プロダクション環境で使用する予定がある場合は、それを考慮する必要があります。 –

関連する問題