Как я могу получить тип параметра конструктора через отражение? - PullRequest
21 голосов
/ 24 ноября 2010

Я использую подсказку типа в моем списке параметров конструктора следующим образом:

public function __construct(FooRepository $repository)

Есть ли способ использовать PHP Reflection API для получения подсказки типа?Другими словами, я хочу функцию отражения, которую я могу вызвать, чтобы как-то вернуть строку «FooRepository».Я пытался получить конструктор с помощью отражения, а затем получить параметры конструктора, но я не вижу ничего, что дало бы мне строку подсказанного типа.

Ответы [ 3 ]

34 голосов
/ 24 ноября 2010

Попробуйте это.

class Foo {
    public function __construct(Bar $test) {
    }
}

class Bar {
    public function __construct() {
    }
}

$reflection = new ReflectionClass('Foo');
$params = $reflection->getConstructor()->getParameters();
foreach ($params AS $param) {
    echo $param->getClass()->name . '<br>';
}
0 голосов
/ 11 мая 2011

Проверьте PHP 5.4

Они планируют выпустить PHP 5.4 в этом году, который будет иметь метод отражения (текущий в сборках dev) параметр->getHint ()

Однако до тех пор, пока 5.4 не перейдет в GA, я использую ReflectionClass :: getDocComment ()

Например, вы можете указать его в @param.

// Adapted from meager's example
class Bar {}

class Foo {
    /**
    * @param MyType $value
    * @param array $value2
    */
    function __construct(Bar $value, array $value2) {
    }
}

// Regex
function getHint( $docComment, $varName ) {
    $matches = array();
    $count = preg_match_all('/@param[\t\s]*(?P<type>[^\t\s]*)[\t\s]*\$(?P<name>[^\t\s]*)/sim', $docComment, $matches);
    if( $count>0 ) {
        foreach( $matches['name'] as $n=>$name ) {
            if( $name == $varName ) {
                return $matches['type'][$n];
            }
        }
    }
    return null;
}

$reflection = new ReflectionClass('Foo');
$constructor= $reflection->getConstructor();
$docComment = $constructor->getDocComment();
$params = $constructor->getParameters();
foreach ($params AS $param) {
    $name = $param->getName();
    echo $name ." is ";
    //echo $param->getHint()."\n"; // in PHP 5.4
    echo getHint($docComment, $name)."\n"; // work around
}

Вывод:

value is MyType
value2 is array
0 голосов
/ 24 ноября 2010

Вы пытаетесь получить подсказку или реальный тип?Я не могу понять, почему вы можете захотеть получить подсказку типа, поскольку вы знаете , что это «FooRepository», иначе PHP вызвал бы ошибку.get_class и вы также можете узнать, наследуется ли объект от данного класса с ReflectionClass::isSubclassOf.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...