我需要检查两个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,只适用于可以直接访问的vars。
我找到了get_class_methodes
,但这会返回所有方法,而不仅仅是getter和setter。通过get...
和set...
过滤方法名称当然会有效,但这更像是一个黑客而不是一个好的和干净的#34; soltution。
简而言之:有没有"正确"自动检查两个PHP对象是否相等的方法?
答案 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);