由于以下问题,我提出了这个想法:
想象一下,我有以下课程:
Class Plane {
public $color;
public $metal;
public $motor;
}
非常简单,但想象一下,它存储在数据库中,并且有一个带有此模型和bla bla bla的模型,用户可以更新它。因此,当用户创建新平面时,它将是:
new Plane("Yellow","Iron","2000cv");
这是数据库中的存储,在这个数据库中,我有一个日志表来跟踪谁和何时发生了变化,但今天我没有什么发生变化,所以我的问题是,< strong>如何在同一个类和函数中获取两个实例,例如输出这些类的差异?
旧飞机就是:
new Plane("Yellow","Iron","2000cv");
新的是:
new Plane("Blue","Chrome","2000cv");
一些函数接收实例并输出:
Array(
'color'=>Array(
'old'=>'Yellow',
'new'=>'Blue'
),
'metal'=>Array(
'old'=>'Iron',
'new'=>'Chrome'
)
)
我知道如何使用ifs和where if,但我不知道是否是最好的方法。
答案 0 :(得分:3)
如果我理解正确,您可以在数据库中存储两个对象并想要比较它们。正确?
假设您有这两个对象;
$plane_one = new Plane ( 'Yellow', 'Iron', '2000cv' );
$plane_two = new Plane ( 'Blue', 'Chrome', '2000cv' );
这个实际上并不值得建议,因为代码不可维护,但是嘿,它可以工作。
function comparePlanes ( &obj1, &$obj2 ) {
$differences = array ();
if ( $obj1->color != $obj2->color ) {
$differences['color'] => array($obj1->color, $obj2->color);
}
if ( $obj1->metal != $obj2->metal ) {
$differences['metal'] => array($obj1->metal, $obj2->metal);
}
if ( $obj1->motor != $obj2->motor ) {
$differences['motor'] => array($obj1->motor, $obj2->motor);
}
return $differences;
}
这会回来;
Array (
'color' => Array('Yellow', 'Blue'),
'metal' => Array('Iron', 'Chrome')
)
当你的函数只是吐出所有属性之间的所有差异,同时不知道哪些属性存在时,它会更有趣。为此,我们可以使用ReflectionClass
。
function compareObjects( &$obj1, &$obj2 ) {
if ( ! is_object($obj1) || ! is_object($obj2) || get_class($obj1) != get_class($obj2) ) {
return array(); // One of them isn't an object, or they are not from the same class
}
$reflection = new ReflectionClass(get_class($obj1));
$properties = $reflection->getProperties();
$differences = array();
foreach( $properties as $property ) {
if ( $obj1->{$property->name} != $obj2->{$property->name} ) {
$differences[$property->name] = array($obj1->{$property->name}, $obj2->{$property->name});
}
}
return $differences;
}
现在输出完全相同。但是,如果您现在改变您的班级以保持乘客人数,例如;
class Plane {
...
public $passengers;
...
function __construct($color, $metal, $motor, $passengers) {
...
$this->passengers = $passengers;
}
}
你会输入这两个对象;
$plane_one = new Plane ( 'Yellow', 'Iron', '2000cv', 12 );
$plane_two = new Plane ( 'Blue', 'Chrome', '2000cv', 6 );
你也会得到差异;
Array (
[color] => Array ( 'Yellow', 'Blue' ),
[metal] => Array ( 'Iron', 'Chrome' ),
[passengers] => Array ( 12, 6 )
)
如果您愿意,您甚至可以传递任何其他对象。没关系