【发布时间】:2016-04-18 03:25:40
【问题描述】:
我需要检查两个 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_vars 和get_object_vars,但是这些方法不适用于getter 和setter,而只能用于可以直接访问的var。
我找到了get_class_methodes,但这会返回所有方法,而不仅仅是 getter 和 setter。通过get... 和set... 过滤方法名称当然可以,但这更像是一种黑客攻击,而不是“干净整洁”的解决方案。
简而言之:是否有任何“正确”的方法来自动检查两个 PHP 对象是否相等?
【问题讨论】: