比较两个非常相似的php类(它们的属性值)

时间:2013-09-13 13:21:25

标签: php comparison

我有两个非常相似的课程。让我们说A级和B级。

+---------------+      +---------------+
| Class A       |      | Class B       |
|---------------|      |---------------|
|   Name        |      |   Name        |
|   ZIP         |      |   ZIP         |
|   TelPhone    |      |   TelPhone    |
|               |      |   MobilePhone |
+---------------+      +---------------+

我想在所有常见属性的值中比较它们。

这是我尝试过的一种方式,但是对所有属性(只有3个属性)进行操作对我来说看起来有点矫枉过正:

$differences = array();

if($classA->getName() != $classB->getName()) {
    array_push(
        $differences, 
            array('name' => array(
                'classA' => $classA->getName(),
                'classB' => $classB->getName()
            )
    ));
}
// and the same code for every attribute....

这里最好的方法是什么?

除了手工之外,如果课程被改变,它也不会自动更新。例如,如果A类也获得MobilePhone属性。

请不要告诉我,我应该做一些多态性,这只是一个澄清的例子。

我对差异感兴趣,不仅是属性,还有属性中的值本身。

感谢

1 个答案:

答案 0 :(得分:0)

这不是最性感的东西(因为吸气剂的子串...,但我不能用属性,我认为sym,但我明白了:

// getting an array with all getter methods of a class
private function getGettersOf($object) {

        $methodArray = array();

        $reflection = new ReflectionClass($object);
        $methods = $reflection->getMethods();

        foreach ($methods as $method) {
            // nur getter
            if(strtolower(substr($method->getName(), 0, 3)) == "get") {
                array_push($methodArray, $method->getName());
            }
        }
        return $methodArray;
    }


// getting an array with all differences
public function getDifferences($classA, $classB) {
        // get list of attributes (getter methods) in commond
        $classAMethods = $this->getGettersOf($classA);
        $classBMethods = $this->getGettersOf($classB);

        $intersection = array_intersect($classAMethods, $classBMethods);

        $differences = array();

        // iterate over all methods and check for the values of the reflected methods
        foreach($intersection as $method) {
            $refMethodClassB = new ReflectionMethod($classB, $method);
            $refMethodClassA = new ReflectionMethod($classA, $method);

            if($refMethodClassB->invoke($classB) != $refMethodClassA->invoke($classA)) {
                array_push(
                    $differences,
                    array($method => array(
                        'classA' => $refMethodClassA->invoke($classA),
                        'classB' => $refMethodClassB->invoke($classB)
                    )
                ));
            }

        }

        return $differences;
    }

特别感谢George Marques的评论。