2011-02-09 126 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