2010-05-29 30 views
1

我想是這個類獲取參數列表的一類方法

class Car { 
    public function __construct(Engine $engine, Make $make, Model $model) 
    { 
      // stuff 
    } 
} 

獲得具有建造這個車(Engine, Make, Model)在需要它們的順序所需要的類型的數組構造函數。我正在使用這個我正在做的依賴注入類型的東西。

更新: 我做了這些類來完成任務,但我覺得還有更好的辦法:

<?php 
    class Engine{} 
    class Make{} 
    class Model{} 
    class Car { 
     public function __construct(Engine $engine, Make $make, Model $model, 
     $foo, 
     $cats = 'dogs', 
     Engine $anotherEngine = NULL) 
     { 
       // stuff 
     } 
    } 
    class ServiceParameter extends ReflectionParameter 
    { 
      public $type = NULL; 

      public function __construct() 
      { 
      $args = func_get_args(); 
      call_user_func_array(array('parent', '__construct'), $args); 
        $str = parent::__toString(); 
        $str = explode(" ", $str); 
        $str = $str[4]; 
        if(substr($str, 0, 1) != '$') 
          $this->type = $str; 
      } 

    } 
    class ServiceMethod extends ReflectionMethod 
    { 
     private $_parameter_cache = NULL; 
     private function _wrapParameter(&$item, $key) 
     { 
      $item = new ServiceParameter(array($item->getDeclaringClass()->name, 
       $item->getDeclaringFunction()->name), 
       $item->name); 

     } 
     public function getParameters() 
     { 
      if(is_array($this->_parameter_cache)) 
       return $this->_parameter_cache; 
      else 
      { 
       $rms = parent::getParameters(); 
       array_walk($rms, array($this, '_wrapParameter')); 
       $params = $rms; 
       $this->_parameter_cache = $params; 
       return $params; 

      } 
     } 
    } 


    $c = new ServiceMethod("Car", "__construct"); 
    $args = $c->getParameters(); 
    foreach($args as $arg) 
    { 

     echo "Parameter Name: {$arg->name}\n"; 
     echo "GetName: {$arg->getName()}\n"; 
     echo "Type: {$arg->type}\n"; 


    echo "\n\n"; 
} 

,輸出:

Parameter Name: engine 
GetName: engine 
Type: Engine 


Parameter Name: make 
GetName: make 
Type: Make 


Parameter Name: model 
GetName: model 
Type: Model 


Parameter Name: foo 
GetName: foo 
Type: 


Parameter Name: cats 
GetName: cats 
Type: 


Parameter Name: anotherEngine 
GetName: anotherEngine 
Type: Engine 

我知道有一些多餘的東西( $params = $rms),但這是圍繞着大量的代碼衝刺和改變以使其工作的結果。當我們已經擁有ReflectionParameter實例是一種浪費時,我覺得要構建一個全新的ServiceParameter。有沒有反正($item = (ServiceParameter)$item沒有工作)

回答

4
class Engine { } 
class Make { } 
class Model { } 
class Car { 
    public function __construct(array $a, $b, Engine $engine, Make $make, Model $model) 
    { 
    // stuff 
    } 
} 


$rc = new ReflectionClass('Car'); 
$ctor = $rc->getConstructor(); 
foreach($ctor->getParameters() as $rp) { 
    $cn = $rp->getClass(); 
    if ($cn instanceof ReflectionClass) { 
    $cn = $cn->getName(); 
    } 

    echo $cn, ' ', $rp->getName(), "\n"; 
} 

打印

a 
b 
Engine engine 
Make make 
Model model 
+0

謝謝!這肯定會擊敗「解析toString」黑客。 – 2010-05-30 01:41:37