gpt4 book ai didi

php - 自动检查两个对象是否相等?

转载 作者:可可西里 更新时间:2023-10-31 23:02:48 25 4
gpt4 key购买 nike

我需要检查两个 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 的局限性(需要是确切的 some object 才能为真),但这没关系。

不过 Contact 类将在不久的将来得到扩展。每次我向类添加新属性/值时,我也必须将它们添加到 isEqualTo。没什么大不了的,但有点麻烦。

那么,有什么方法可以实现isEqualTo 来自动实现所有可用的公共(public)属性吗?

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

我找到了 get_class_methodes 但这会返回所有方法,而不仅仅是 getter 和 setter。通过 get...set... 过滤方法名称当然可行,但这更像是一种 hack 而不是“干净整洁”的解决方案。

简而言之:有没有什么“正确”的方法可以自动检查两个 PHP 对象是否相等?

最佳答案

我不会说这是“正确”的方式,但由于您不想实现/维护自己的比较函数/方法,您可能对 php 的默认行为感兴趣,包括比较 protected /私有(private)属性(property):

<?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 :嵌套级别太深 - 递归依赖?

关于php - 自动检查两个对象是否相等?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34761869/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com