Explorar o código

ZF-10365: report Unknown[] for parameters type-hinted as arrays

- Auto-detect array typehints during reflection
- In the Introspector, if a parameter is given an "array" typehint, return it as
  "Unknown[]"

git-svn-id: http://framework.zend.com/svn/framework/standard/trunk@23315 44c647ce-9c0f-0410-b52a-842ac1e357ba
matthew %!s(int64=15) %!d(string=hai) anos
pai
achega
bdb57d9e45

+ 6 - 1
library/Zend/Amf/Adobe/Introspector.php

@@ -283,7 +283,12 @@ class Zend_Amf_Adobe_Introspector
             return 'Unknown';
         }
 
-        if (in_array($typename, array('int', 'integer', 'bool', 'boolean', 'float', 'string', 'object', 'Unknown', 'stdClass', 'array'))) {
+        // Arrays
+        if ('array' == $typename) {
+            return 'Unknown[]';
+        }
+
+        if (in_array($typename, array('int', 'integer', 'bool', 'boolean', 'float', 'string', 'object', 'Unknown', 'stdClass'))) {
             return $typename;
         }
 

+ 10 - 0
library/Zend/Server/Reflection/Function/Abstract.php

@@ -306,6 +306,16 @@ abstract class Zend_Server_Reflection_Function_Abstract
         } else {
             $helpText = $function->getName();
             $return   = 'void';
+
+            // Try and auto-determine type, based on reflection
+            $paramTypesTmp = array();
+            foreach ($parameters as $i => $param) {
+                $paramType = 'mixed';
+                if ($param->isArray()) {
+                    $paramType = 'array';
+                }
+                $paramTypesTmp[$i] = $paramType;
+            }
         }
 
         // Set method description

+ 11 - 0
tests/Zend/Amf/Adobe/IntrospectorTest.php

@@ -131,6 +131,17 @@ class Zend_Amf_Adobe_IntrospectorTest extends PHPUnit_Framework_TestCase
         $xml = $this->introspector->introspect('com.zend.framework.IntrospectorTest');
         $this->assertRegexp('/<type[^>]*(name="explicit")/', $xml, $xml);
     }
+
+    /**
+     * @group ZF-10365
+     */
+    public function testArgumentsWithArrayTypeHintsReflectedInReturnedXml()
+    {
+        require_once dirname(__FILE__) . '/TestAsset/ParameterHints.php';
+        $xml = $this->introspector->introspect('Zend.Amf.Adobe.TestAsset.ParameterHints');
+        $this->assertRegexp('/<argument[^>]*(name="arg1")[^>]*(type="Unknown\[\]")/', $xml, $xml);
+        $this->assertRegexp('/<argument[^>]*(name="arg2")[^>]*(type="Unknown\[\]")/', $xml, $xml);
+    }
 }
 
 class com_zend_framework_IntrospectorTest

+ 8 - 0
tests/Zend/Amf/Adobe/TestAsset/ParameterHints.php

@@ -0,0 +1,8 @@
+<?php
+class Zend_Amf_Adobe_TestAsset_ParameterHints
+{
+    public function argSimReturn(array $arg1, array $arg2, $arg3)
+    { 
+        return $arg1; 
+    }
+}