php 重载等于运算符

Posted

技术标签:

【中文标题】php 重载等于运算符【英文标题】:php overload equals-operator 【发布时间】:2011-06-24 06:27:21 【问题描述】:

php 程序中,我有一个包含一些自定义对象的数组,我想查找该数组是否包含某个对象。当然我可以使用array_search,但这会检查对象是否是同一个对象,而不是它是否具有相同的变量。所以我希望能够为对象创建自己的比较函数,我可以将它与 array_search 方法(或类似的方法)一起使用。 我希望能够做这样的事情:

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.

【问题讨论】:

array_search 仅在您将其第三个 $strict 参数设置为 true 时检查对象是否为同一实例。否则,如果两个对象“具有相同的属性和值,并且是同一类的实例”,则它们被视为相等 - 请参阅 == 运算符的行为。 【参考方案1】:

这是我最近发现的一个巧妙的小技巧:

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

当传递一个字符串 $needle 时,array_search 将尝试将 $haystack 中包含的对象转换为字符串以进行比较,方法是调用 __toString 魔法方法(如果存在),在这种情况下返回 Foo::$a

【讨论】:

这很有帮助。只要您将对象与字符串进行比较,PHP 就会使用其__toString 方法将其强制转换为字符串值。【参考方案2】:

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

【讨论】:

它现在已针对 5.3 5.4 进行了更新,但是在发布之间相隔 7 年的软件包并不能完全激发人们对其维护的信任... @XiongChiamiov 取决于。如果有效,就不需要更新了,是吗? 此外,它仍处于测试状态。如果您打算在生产环境中使用它,则应该考虑这一点。

以上是关于php 重载等于运算符的主要内容,如果未能解决你的问题,请参考以下文章

C++ 大于等于运算符

c++运算符重载

c++运算符重载

c++运算符重载

c++运算符重载

php重载=运算符[重复]