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 重载等于运算符的主要内容,如果未能解决你的问题,请参考以下文章