Php 比较除pdo变量之外的两个对象
对于我的php项目,我已经创建了应该比较的组对象。因为变量中存储了PDO连接,==运算符将始终返回false,因为一个变量不相等。除了比较这一个唯一的PDO变量外,还有其他方法比较这些对象吗? 我能想象的唯一方法是一个巨大的for循环,它检查每个变量。Php 比较除pdo变量之外的两个对象,php,object,pdo,Php,Object,Pdo,对于我的php项目,我已经创建了应该比较的组对象。因为变量中存储了PDO连接,==运算符将始终返回false,因为一个变量不相等。除了比较这一个唯一的PDO变量外,还有其他方法比较这些对象吗? 我能想象的唯一方法是一个巨大的for循环,它检查每个变量。 如果有人知道更聪明的方法,我会非常高兴。使用此功能。它将使用反射来比较每个属性,除了$exceptParameter <?php class Test { public $var1; public $pdo; pu
如果有人知道更聪明的方法,我会非常高兴。使用此功能。它将使用反射来比较每个属性,除了
$exceptParameter
<?php
class Test
{
public $var1;
public $pdo;
public function __construct($var1, $pdo)
{
$this->var1 = $var1;
$this->pdo = $pdo;
}
}
$a = new Test("test1", "test2");
$b = new Test("test1", "test3");
$c = new Test("test2", "test4");
function areSameExcept($obj1, $obj2, $exceptParameter) {
$ref1 = new ReflectionClass($obj1);
$ref2 = new ReflectionClass($obj2);
$propertiesObj1 = $ref1->getProperties();
foreach ($propertiesObj1 as $propertyObj1) {
if ($propertyObj1->getName() === $exceptParameter) continue;
$propertyObj1->setAccessible(true);
$valueObj1 = $propertyObj1->getValue($obj1);
$propertyObj2 = $ref2->getProperty($propertyObj1->getName());
$propertyObj2->setAccessible(true);
$valueObj2 = $propertyObj2->getValue($obj2);
if ($valueObj1 !== $valueObj2) {
return false;
}
}
return true;
}
var_dump(areSameExcept($a, $b, "pdo")); // true
var_dump(areSameExcept($a, $c, "pdo")); // false
注意:此解决方案仅适用于没有私有属性的类
您可以创建一个类函数,该函数接收来自同一类的另一个对象,并检查除PDO连接之外的所有属性是否相等
有两种方法可以做到这一点,这两种方法都要求将其中一个对象作为参数传递给另一个对象进行比较。您可以创建一个函数,显式检查要在两个对象之间比较的每个属性,也可以循环遍历参数,跳过任何不想检查的参数
class GroupObj {
public $prop1;
public $prop2;
public $prop3;
public $db;
public function __construct($prop1 = "", $prop2 = "", $prop3 = "") {
$this->db = "connection established here";
$this->prop1 = $prop1;
$this->prop2 = $prop2;
$this->prop3 = $prop3;
}
public function equalsTedious($object) {
return ($this->prop1 == $object->prop1 &&
$this->prop2 == $object->prop2 &&
$this->prop3 == $object->prop3);
}
public function equals($object) {
$result = true;
foreach ($this as $key => $value) {
# skip properties you don't want to compare
if ($key == "db") {
continue;
}
if ($this->{$key} != $object->{$key}) {
$result = false;
break;
}
}
return $result;
}
}
$group1 = new GroupObj(1, 2, 3);
$group2 = new GroupObj(1, 2, 3);
$group3 = new GroupObj(4, 5, 6);
if ($group1->equalsTedious($group2)) {
echo "Equal but annoying to maintain 1.<br>";
}
if ($group1->equalsTedious($group3)) {
echo "Equal but annoying to maintain 2.<br>";
}
if ($group1->equals($group2)) {
echo "Equal with the loop version too 1.<br>";
}
if ($group1->equals($group3)) {
echo "Equal with the loop version too 2.<br>";
}
class-GroupObj{
公帑1元;
公共部门2美元;
公共部门3美元;
公帑$db;
公共功能结构($prop1=“”、$prop2=“”、$prop3=“”){
$this->db=“在此处建立连接”;
$this->prop1=$prop1;
$this->prop2=$prop2;
$this->prop3=$prop3;
}
公共函数同等繁琐($object){
返回($this->prop1==$object->prop1)&&
$this->prop2==$object->prop2&&
$this->prop3==$object->prop3);
}
公共函数等于($object){
$result=true;
foreach($key=>$value){
#跳过不想比较的属性
如果($key==“db”){
继续;
}
如果($this->{$key}!=$object->{$key}){
$result=false;
打破
}
}
返回$result;
}
}
$group1=新的GroupObj(1,2,3);
$group2=新的GroupObj(1,2,3);
$group3=新的GroupObj(4,5,6);
如果($group1->equal乏味($group2)){
echo“保持1的相等但令人讨厌”;
}
如果($group1->equalstudious($group3)){
回声“保持2.相等但令人讨厌”;
}
如果($group1->equals($group2)){
echo“与循环版本相同也为1.
”;
}
如果($group1->equals($group3)){
echo“与循环版本相同也2.
”;
}
您可以使用反射来比较每个值,但您知道不同的值(即PDO连接)除外。您到底想做什么?你试图比较两个相等的对象,除了一个不同的属性?是的,=
操作符将两个对象等同为false,因为它们不是相同的对象。您是否试图在每个对象的属性上循环并检查有多少匹配项?@obsidiange这些对象完全相同。我可以使group()==group(),它可能返回false,因为该类在_construct()函数中设置了到数据库的PDO连接。我正在寻找一种方法来比较这两者,忽略我可以帮助的PDO连接LAD!啊,说得好!我将编辑我的答案以反映这一点。我仍然想保留它,以防有人想要一个具有所有公共属性的类的简单解决方案。