自动检查两个对象的相等性?

时间:2016-01-13 08:38:21

标签: php class object equality

我需要检查两个PHP对象在相等值方面是否相等。当然,我可以轻松地将isEqualTo(...)方法添加到比较所有相关值的类中。然而,具体课程将在不久的将来发生变化,我想知道是否有任何自动化方法。

示例:

class Contact {
    private name;       // String
    private phone;      // Int
    private someObject; // Custom Object

    public function getName() {
        return $this->name;
    }

    public function setName($newName) {
        $this->name = $newName;
    }


    public function getPhone() {
        return $this->phone;
    }

    public function setPhone($newPhone) {
        $this->phone = $newPhone;
    }


    public function getSomeObject() {
        return $this->someObject;
    }

    public function setSomeObject($newObj) {
        $this->someObject = $newObj;
    }


    // Manual Solution 
    public function isEqualTo($contact) {
         result  = $this->name == $contact->getName();
         result &= $this->phone == $contact->getPhone();

         result &= $this->someObject == $contact->getSomeObject();

         return result;
    }
} 

这显然有效。当然我知道比较someObject的限制(需要确切的某个对象才是真的),但这没关系。

然而,课程Contact将在不久的将来延长。每次我向类中添加新属性/值时,我都必须将它们添加到isEqualTo。没什么大不了的,但有点麻烦。

那么,有没有办法实现isEqualTo自动显示所有可用的公共属性?

我找到了get_class_varsget_object_vars,但这些方法不适用于getter和setter,只适用于可以直接访问的vars。

我找到了get_class_methodes,但这会返回所有方法,而不仅仅是getter和setter。通过get...set...过滤方法名称当然会有效,但这更像是一个黑客而不是一个好的和干净的#34; soltution。

简而言之:有没有"正确"自动检查两个PHP对象是否相等的方法?

2 个答案:

答案 0 :(得分:4)

我不会说这是“正确的”方式,但由于你不想实现/维护你自己的比较函数/方法,你可能会对php的默认行为感兴趣,包括比较受保护/私有财产:

<?php
class Foo {
    private $x,$y,$z;
    public function __construct($x,$y,$z) {
        $this->x = $x;
        $this->y = $y;
        $this->z = $z;
    }
}

$f1 = new Foo(1,2,3);
$f2 = new Foo(4,5,6);
$f3 = new Foo(1,2,3);

var_dump(
    $f1==$f2,
    $f1==$f3
);

打印

bool(false)
bool(true)

对你来说可能或不充分。

作为pointed out by Alma Do,循环引用,例如

<?php
class Foo {
    private $x,$y,$z;
    public function __construct($x,$y,$z) {
        $this->x = $x;
        $this->y = $y;
        $this->z = $z;
    }

    public function setZ($z) {
        $this->z = $z;
    }
}


$f1 = new Foo(1,2,3);
$f2 = new Foo(4,5,6);
$f3 = new Foo(1,2,3);

$f1->setZ($f3);
$f3->setZ($f1);


var_dump(
    $f1==$f2,
    $f1==$f3
);

会导致Fatal error: Nesting level too deep - recursive dependency?

答案 1 :(得分:0)

您可以使用Reflection来做到这一点,但我认为这不是一个好主意。也许serialize()是一个更好的解决方案?

foreach($news_array as $position_in_main_array => $inner_array_member)
{           
    $headarray[] = $inner_array_member["Date"];
    $headarray[] = $inner_array_member["Published"];
    $headarray[] = $inner_array_member["Title"];
    $headarray[] = $inner_array_member["Text"];
}

echo implode(" ",$headarray);