Browse Source

ZF-7909 - Fix handling of interfaces in Zend_CodeGenerator_PhpClass when using fromReflection()

git-svn-id: http://framework.zend.com/svn/framework/standard/trunk@18397 44c647ce-9c0f-0410-b52a-842ac1e357ba
beberlei 16 years ago
parent
commit
2709fc21f9

+ 7 - 2
library/Zend/CodeGenerator/Php/Class.php

@@ -111,12 +111,17 @@ class Zend_CodeGenerator_Php_Class extends Zend_CodeGenerator_Php_Abstract
 
         if ($parentClass = $reflectionClass->getParentClass()) {
             $class->setExtendedClass($parentClass->getName());
-            $interfaces = array_diff($parentClass->getInterfaces(), $reflectionClass->getInterfaces());
+            $interfaces = array_diff($reflectionClass->getInterfaces(), $parentClass->getInterfaces());
         } else {
             $interfaces = $reflectionClass->getInterfaces();
         }
 
-        $class->setImplementedInterfaces($interfaces);
+        $interfaceNames = array();
+        foreach($interfaces AS $interface) {
+            $interfaceNames[] = $interface->getName();
+        }
+
+        $class->setImplementedInterfaces($interfaceNames);
 
         $properties = array();
         foreach ($reflectionClass->getProperties() as $reflectionProperty) {

+ 40 - 0
tests/Zend/CodeGenerator/Php/ClassTest.php

@@ -235,4 +235,44 @@ EOS;
         $this->assertEquals($expectedOutput, $output, $output);
     }
 
+    /**
+     * @group ZF-7909
+     */
+    public function testClassFromReflectionThatImplementsInterfaces()
+    {
+        if(!class_exists('Zend_CodeGenerator_Php_ClassWithInterface')) {
+            require_once dirname(__FILE__)."/_files/ClassAndInterfaces.php";
+        }
+
+        require_once "Zend/Reflection/Class.php";
+        $reflClass = new Zend_Reflection_Class('Zend_CodeGenerator_Php_ClassWithInterface');
+
+        $codeGen = Zend_CodeGenerator_Php_Class::fromReflection($reflClass);
+        $codeGen->setSourceDirty(true);
+
+        $code = $codeGen->generate();
+        $expectedClassDef = 'class Zend_CodeGenerator_Php_ClassWithInterface implements Zend_Code_Generator_Php_OneInterface, Zend_Code_Generator_Php_TwoInterface';
+        $this->assertContains($expectedClassDef, $code);
+    }
+
+    /**
+     * @group ZF-7909
+     */
+    public function testClassFromReflectionDiscardParentImplementedInterfaces()
+    {
+        if(!class_exists('Zend_CodeGenerator_Php_ClassWithInterface')) {
+            require_once dirname(__FILE__)."/_files/ClassAndInterfaces.php";
+        }
+
+        require_once "Zend/Reflection/Class.php";
+        $reflClass = new Zend_Reflection_Class('Zend_CodeGenerator_Php_NewClassWithInterface');
+
+        $codeGen = Zend_CodeGenerator_Php_Class::fromReflection($reflClass);
+        $codeGen->setSourceDirty(true);
+
+        $code = $codeGen->generate();
+
+        $expectedClassDef = 'class Zend_CodeGenerator_Php_NewClassWithInterface extends Zend_CodeGenerator_Php_ClassWithInterface implements Zend_Code_Generator_Php_ThreeInterface';
+        $this->assertContains($expectedClassDef, $code);
+    }
 }

+ 26 - 0
tests/Zend/CodeGenerator/Php/_files/ClassAndInterfaces.php

@@ -0,0 +1,26 @@
+<?php
+
+class Zend_CodeGenerator_Php_ClassWithInterface implements Zend_Code_Generator_Php_OneInterface, Zend_Code_Generator_Php_TwoInterface
+{
+    
+}
+
+class Zend_CodeGenerator_Php_NewClassWithInterface extends Zend_CodeGenerator_Php_ClassWithInterface implements Zend_Code_Generator_Php_ThreeInterface
+{
+    
+}
+
+interface Zend_Code_Generator_Php_OneInterface
+{
+    
+}
+
+interface Zend_Code_Generator_Php_TwoInterface
+{
+    
+}
+
+interface Zend_Code_Generator_Php_ThreeInterface
+{
+
+}