相同classe的2个实例之间的差异

时间:2018-02-22 12:26:04

标签: php class oop

由于以下问题,我提出了这个想法:

想象一下,我有以下课程:

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,但我不知道是否是最好的方法。

1 个答案:

答案 0 :(得分:3)

如果我理解正确,您可以在数据库中存储两个对象并想要比较它们。正确?

假设您有这两个对象;

$plane_one = new Plane ( 'Yellow', 'Iron', '2000cv' );
$plane_two = new Plane ( 'Blue', 'Chrome', '2000cv' );

方法1

这个实际上并不值得建议,因为代码不可维护,但是嘿,它可以工作。

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')
)

方法2

当你的函数只是吐出所有属性之间的所有差异,同时不知道哪些属性存在时,它会更有趣。为此,我们可以使用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 )
)

如果您愿意,您甚至可以传递任何其他对象。没关系