getFilesByExtension( 'php', true); foreach ($ModelFiles as $modelFile){ require_once $modelFile; } /// Get Model subClasses $LoadedClasses = get_declared_classes(); $ModelClasses = []; foreach( $LoadedClasses as $loadedClass){ if( is_subclass_of( $loadedClass, Model::class)){ $ModelClasses[] = $loadedClass; } } /// Test classes foreach( $ModelClasses as $modelClass){ $ModelReflect = new \ReflectionClass( $modelClass); $ClassArgs = []; $properties = $ModelReflect->getProperties(); foreach ( $properties as $property){ $ClassArgs[$property->getName()] = ''; } $Model = new $modelClass($ClassArgs); $methods = $ModelReflect->getMethods(); foreach ( $methods as $method){ $method = new \Zend_Reflection_Method( $Model, $method->getName()); $docBlock = $method->getDocblock(); echo "--" . PHP_EOL; echo "$modelClass " . $method->getName() . PHP_EOL; if( ! $method->isPublic()){ continue; } $args = []; if($docBlock->hasTag('param')) { /** @var \Zend_Reflection_Docblock_Tag_Param[] $tagParams */ $tagParams = $docBlock->getTags('param'); // $tagReturn is an instance of Zend_Reflection_Docblock_Tag_Return foreach ( $tagParams as $tagParam){ echo "Param Type : " . $tagParam->getType() . PHP_EOL; switch( $tagParam->getType()){ case 'string' : $args[] = $tagParam->getName(); break; case 'bool': case 'boolean': $args[] = true; break; case 'array' : $args[] = []; break; default : print_r( $tagParam); return; } } } $a = $method->invokeArgs( $Model, $args); if( $docBlock->hasTag('return')) { /** @var \Zend_Reflection_Docblock_Tag_Return $tagReturn */ $tagReturn = $docBlock->getTag('return'); echo "Returns a: " . $tagReturn->getType() . PHP_EOL; $this->assertInternalType( $tagReturn->getType(), $a); /* switch( $tagReturn->getType()){ case 'string' : $this->assertInternalType( string); break; case 'bool': case 'boolean': $args[] = true; break; case 'array' : $args[] = []; break; default : print_r( $tagParam); return; } */ } } } } }