0

我有两个非常相似的课程。比方说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 属性。

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

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

谢谢

4

1 回答 1

0

这不是最性感的事情(因为 getter 的子字符串..,但我不能使用属性,我认为 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 的评论。

于 2013-09-16T12:00:38.940 回答