2012-02-14 2 views
1

Использование PHP ReflectionClass. Это возможно?Как получить определения переменных по умолчанию для метода

Я хочу получить список методов и определенных переменных и, если возможно, их значения по умолчанию.

$reflection = new \ReflectionClass($var); 
$methods = $reflection->getMethods(\ReflectionMethod::IS_PUBLIC); 

print_r($methods); // only method names here :(
+0

http://php.net/manual/en/reflectionparameter.getdefaultvalue.php – cspray

+0

спасибо! вы должны опубликовать это как ответ, или я удалю свой q: P – Alex

+0

hmmm, но как я могу передать ему имя метода? 'array ($ var, $ method-> name)', похоже, не работает, потому что эта вещь ожидает строку ... – Alex

ответ

2

Используйте метод ReflectionParameter::getDefaultValue(). С вашего примера кода:

$reflection = new \ReflectionClass($var); 
$methods = $reflection->getMethods(\ReflectionMethod::IS_PUBLIC); 
$methodParameters = array(); 

foreach ($methods as $method) { 
    $parameters = $method->getParameters(); 
    foreach ($parameters as $parameter) { 
     $name = $method->getName() . '::' . $parameter->getName(); 
     $methodParameters[$name] = null; 
     if ($parameter->isOptional()) { 
      $methodParameters[$name] = $parameter->getDefaultValue(); 
     } 
    } 
} 

Пример:

class a { 

     public function methodOne() { 
     } 

     public function methodTwo($param) {  
     } 

     public function methodThree($param = 'foo') { 
     } 

} 

    $var = new a(); 

    $reflection = new \ReflectionClass($var); 
    $methods = $reflection->getMethods(\ReflectionMethod::IS_PUBLIC); 
    $methodParameters = array(); 

    foreach ($methods as $method) { 
     $parameters = $method->getParameters(); 
     foreach ($parameters as $parameter) { 
      $name = $method->getName() . '::' . $parameter->getName(); 
      $methodParameters[$name] = null; 
      if ($parameter->isOptional()) { 
       $methodParameters[$name] = $parameter->getDefaultValue(); 
      } 
     } 
    } 
    var_dump($methodParameters); 

// results in this array: 

array(2) { 
    ["methodTwo::param"]=> 
    NULL 
    ["methodThree::param"]=> 
    string(3) "foo" 
} 
+0

просто интересно, список параметров всегда возвращается в исходном порядке? – Alex

+0

Хороший вопрос, позвольте мне сделать немного больше испытаний ... один с. @Alex [Вот обновленный скрипт codepad.viper] (http://codepad.viper-7.com/1Ozhxp) ... кажется, что параметры возвращаются в порядке – cspray

Смежные вопросы