2016-03-28 1 views
3

Ich versuche, Typ $bar Variable zu bekommen.Wie erhalten Sie den Parametertyp in der Methode der reflektierten Klassen?

<?php 
class Foo 
{ 
    public function test(stdClass $bar, array $foo) 
    { 

    } 
} 

$reflect = new ReflectionClass('Foo'); 
foreach ($reflect->getMethods() as $method) { 
    foreach ($method->getParameters() as $num => $parameter) { 
     var_dump($parameter->getType()); 
    } 
} 

Ich erwarte stdClass aber ich bekomme

Call to undefined method ReflectionParameter::getType() 

Was falsch sein kann? Oder es gibt einige andere Art und Weise? ..

$ php -v 
PHP 5.4.41 (cli) (built: May 14 2015 02:34:29) 
Copyright (c) 1997-2014 The PHP Group 
Zend Engine v2.4.0, Copyright (c) 1998-2014 Zend Technologies 

UPD1 Es sollte auch für das Array arbeiten eingeben.

+3

[getType()] (http://php.net/manual/en/reflectionparameter.gettype.php) in PHP verfügbar ist 7. –

+0

Ups ... Vielen Dank für diese Hinweis. – Kirby

Antwort

2

Es sieht aus wie ähnliche Frage bereits hinzugefügt in PHP Reflection - Get Method Parameter Type As String

ich meine Lösung schrieb es für alle Fälle funktioniert:

/** 
* @param ReflectionParameter $parameter 
* @return string|null 
*/ 
function getParameterType(ReflectionParameter $parameter) 
{ 
    $export = ReflectionParameter::export(
     array(
      $parameter->getDeclaringClass()->name, 
      $parameter->getDeclaringFunction()->name 
     ), 
     $parameter->name, 
     true 
    ); 
    return preg_match('/[>] ([A-z]+) /', $export, $matches) 
     ? $matches[1] : null; 
} 
3

Wenn Sie nur Klassen Type Hinting, können Sie ->getClass() benutzen, die ist in PHP 5 unterstützt und 7.

<?php 

class MyClass { 

} 

class Foo 
{ 
    public function test(stdClass $bar) 
    { 

    } 

    public function another_test(array $arr) { 

    } 

    public function final_test(MyClass $var) { 

    } 
} 

$reflect = new ReflectionClass('Foo'); 
foreach ($reflect->getMethods() as $method) { 
    foreach ($method->getParameters() as $num => $parameter) { 
     var_dump($parameter->getClass()); 
    } 
} 

Der Grund, warum ich Klassen sagen, ist, weil auf einem Array, wird es ret Urn NULL.

Output:

object(ReflectionClass)#6 (1) { 
    ["name"]=> 
    string(8) "stdClass" 
} 
NULL 
object(ReflectionClass)#6 (1) { 
    ["name"]=> 
    string(7) "MyClass" 
} 
+0

Ja, es funktioniert. Vielen Dank! Also, $ Parameter-> getClass()? $ parameter-> getClass() -> name: null; '. Ich weiß nicht, warum ich das nicht bemerkt habe.) Scheint, es ist zu spät, 21 Uhr. :) – Kirby

+0

Ja! Ternary funktioniert in diesem Fall gut. –

+0

Hm, es funktioniert nicht ein Array ... :( – Kirby