2011-02-09 32 views
9

在一個PHP程序中,我有一些自定義對象的數組,我想查找數組是否包含某個對象。當然,我可以使用array_search,但是這會檢查對象是否是同一個對象,而不是它是否具有相同的變量。所以我想能夠創建我自己的比較函數的對象,我可以使用array_search方法(或類似的東西)。 我希望能夠做這樣的事情:php overload equals運算符

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個不同的搜索函數,一個用於具有自己的比較函數的類,另一個用於那些避難所「T。

+2

如果您將第三個$ strict參數設置爲true,array_search僅檢查對象是否是相同的實例。否則,如果兩個對象「具有相同的屬性和值,並且是同一類的實例」,則認爲它們是相等的 - 請參閱[==](http://php.net/manual/en/language)的行爲。 oop5.object-comparison.php)運算符。 – yscik 2011-02-09 16:32:14

回答

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

3

通常它不是。你可以看看PECL Operators-Extension,但那真的很老。

+2

它現在已經更新爲5.3 *和* 5.4,但是一個發行版間隔7年的軟件包並不完全激發對其維護的信任...... – 2013-05-17 18:40:37

+1

@XiongChiamiov取決於。如果有效,則不需要更新,是嗎? – KingCrunch 2013-05-18 01:00:31