Abrufen der Argumentnamen der Funktion

Lesezeit: 3 Minuten

Benutzer-Avatar
Gotys

Betrachten Sie in PHP diese Funktion:

function test($name, $age) {}

Ich muss die Parameternamen irgendwie extrahieren (um benutzerdefinierte Dokumentationen automatisch zu generieren), damit ich so etwas tun kann:

get_func_argNames('test');

und es würde zurückkommen:

Array['name','age']

Ist das in PHP überhaupt möglich?

  • Gibt es einen Grund, warum Sie nicht nur PHPDoc verwenden, um Ihre Dokumentation automatisch zu generieren?

    – Narzisse

    22. April 2010 um 16:20 Uhr

  • Verwandt: stackoverflow.com/q/17455043/1454514

    – David Refoua

    8. Februar 2020 um 10:20 Uhr

Benutzer-Avatar
Tom Haigh

Sie können verwenden Betrachtung :

function get_func_argNames($funcName) {
    $f = new ReflectionFunction($funcName);
    $result = array();
    foreach ($f->getParameters() as $param) {
        $result[] = $param->name;   
    }
    return $result;
}

print_r(get_func_argNames('get_func_argNames'));


//output
Array
(
    [0] => funcName
)

  • Vielen Dank . Und wenn ich dies verwenden möchte, um die Argumente der Klassenmethode zu erhalten?

    – Gotys

    22. April 2010 um 16:20 Uhr

  • Sie können ReflectionMethod verwenden, zB new ReflectionMethod('classname', 'methodname'); Der Rest sollte gleich sein.

    – Tom Haigh

    22. April 2010 um 16:23 Uhr

  • Gordon, du bist mir zuvorgekommen. Vielen Dank

    – Tom Haigh

    22. April 2010 um 16:24 Uhr

  • Ok, entschuldigen Sie die “Langsamkeit”, aber gibt es eine Möglichkeit, den Standardwert eines Parameters zu erhalten? public function test($age = 30) Bekomme ich “30” zusammen mit “age”?

    – Gotys

    22. April 2010 um 16:40 Uhr

  • @Gotys: ReflectionParameter nachschlagen, Sie erhalten ein Array davon von ReflectionFunction::getParameters() zurück. Im obigen Beispiel verwende ich nur die Eigenschaft name, aber es gibt eine Methode defaultValue(), die Ihnen helfen sollte

    – Tom Haigh

    22. April 2010 um 21:17 Uhr

Es ist 2019 und niemand hat das gesagt?

Benutz einfach get_defined_vars():

class Foo {
  public function bar($a, $b) {
    var_dump(get_defined_vars());
  }
}

(new Foo)->bar('first', 'second');

Ergebnis:

array(2) {
  ["a"]=>
  string(5) "first"
  ["b"]=>
  string(6) "second"
}

Dies ist eine alte Frage, die mir passiert ist, als ich nach etwas anderem als Reflection gesucht habe, aber ich werde meine aktuelle Implementierung wegwerfen, damit sie jemand anderem helfen kann. Verwendung von array_map

Für eine Methode

    $ReflectionMethod =  new \ReflectionMethod($class, $method);

    $params = $ReflectionMethod->getParameters();

    $paramNames = array_map(function( $item ){
        return $item->getName();
    }, $params);

Für eine Funktion

    $ReflectionFunction =  new \ReflectionFunction('preg_replace');
    $params = $ReflectionFunction->getParameters();
    $paramNames = array_map(function( $item ){
        return $item->getName();
    }, $params);
    echo '<pre>';
    var_export( $paramNames );

Ausgänge

array(
    '0' => 'regex',
    '1' => 'replace',
    '2' => 'subject',
    '3' => 'limit',
    '4' => 'count'
)

Prost,

Zusätzlich zu Tom Haighs Antwort, wenn Sie den Standardwert optionaler Attribute abrufen müssen:

function function_get_names($funcName){

    $attribute_names = [];

    if(function_exists($funcName)){

        $fx = new ReflectionFunction($funcName);

        foreach ($fx->getParameters() as $param){

            $attribute_names[$param->name] = NULL;

            if ($param->isOptional()){

                $attribute_names[$param->name] = $param->getDefaultValue();
            }
        }           
    }

    return $attribute_names;
}

Nützlich für die Validierung des Variablentyps.

@Tom Haigh, oder mach es eleganter:

function getArguments( $funcName ) {
    return array_map( function( $parameter ) { return $parameter->name; },
        (new ReflectionFunction($funcName))->getParameters() );
}

// var_dump( getArguments('getArguments') );

func_get_args

function my($aaa, $bbb){
     var_dump(  func_get_args() );  
}


my("something","something");    //result:  array('aaa' => 'something', 'bbb' => 'something');

Außerdem gibt es noch weitere globale Funktionen: get_defined_vars()die nicht nur die Funktion zurückgibt, sondern alle Variablen.

1282730cookie-checkAbrufen der Argumentnamen der Funktion

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy