Können Sie einen Methodennamen aus einer Methode in PHP abrufen?

71

Ist es möglich so etwas zu tun?

public function something() {
    $thisMethodName = method_get_name(); 
}

Woher method_get_name()kommt der Name der Methode?

Alex
quelle

Antworten:

118

Klar, du willst die magischen Konstanten.

function myFunction() { print __FUNCTION__." in ".__FILE__." at ".__LINE__."\n"; }

Weitere Informationen finden Sie im PHP-Handbuch

Kevin Vaughan
quelle
42
und nur um frech zu sein, ist die magische Konstante für den Methodennamen:__METHOD__
Anthony
37
Spät zum Spiel, aber ich war überrascht zu sehen, dass __METHOD__tatsächlich Class::methodso __FUNCTION__spezifisch nur der Methodenname zurückgegeben wird ... für alle anderen, die RTFM immer noch nicht mögen wie ich.
Akkorde
26

Während Sie die magische Konstante verwenden können, __METHOD__ würde ich dringend empfehlen, die Reflexion von PHP zu überprüfen . Dies wird in PHP5 unterstützt.

$modelReflector = new ReflectionClass(__CLASS__);
$method = $modelReflector->getMethod(__METHOD__);

Sie können dann verdammt gute Sachen machen, wie die Unterschrift inspizieren usw.

thesmart
quelle
Wenn Sie "Inspektion der Unterschrift" sagen, meinen Sie das? php.net/manual/en/function.openssl-verify.php
Hector Ordonez
@ MrMe Nein, eine Methodensignatur (nicht zu verwechseln mit einer Authentifizierungssignatur) wie diese: en.wikipedia.org/wiki/Type_signature
thesmart
Oh in Ordnung, es ist im Grunde ein Typ Hinweis auf stackoverflow.com/questions/2161040/… Danke!
Hector Ordonez
12

Wie von smartj vorgeschlagen, können Sie die magische Konstante ausprobieren __METHOD__, aber denken Sie daran, dass dies eine Zeichenfolge zurückgibt, die auch Ihren Klassennamen enthält, dh 'MyClass :: Something'. Wenn Sie __FUNCTION__stattdessen verwenden, wird "etwas" zurückgegeben.

Jan Molak
quelle
3

Verwenden __FUNCTION__ist der richtige Weg, anstatt:

 public function something() {
     $thisMethodName = "something";
 }

Dies ist in mehrfacher Hinsicht fehlerhaft, wenn eine Variable und ein Speicher hinzugefügt werden, um den Methodennamen als Zeichenfolge zu speichern und die bereits vorhandenen zu duplizieren, wodurch unnötigerweise verwendete Ressourcen hinzugefügt werden (wenn Sie dies für eine große Bibliothek mit vielen Methoden tun, ist dies von großer Bedeutung).

Es wird garantiert, dass sich die magischen Konstanten in PHP nicht ändern, während dieser Ansatz eine entsprechende Bearbeitung erfordern würde, wenn der Methodenname geändert würde, wodurch das Potenzial für eine Inkonsistenz entsteht (Anmerkung, ich habe möglicherweise gesagt, was bedeutet, dass es sich einfach um eine ansonsten unnötige Bearbeitung handelt, wenn die Magie Konstante wurden stattdessen verwendet).

Die Zeit und Mühe , um eine Variable zu benennen, geben Sie den Namen der Methode als String zu dieser unnötigen Variablen zugewiesen und natürlich richtig den Variablennamen referenzieren, die die Motivation für PHP liefert magische Konstanten ist mit zu beginnen (und Widerlegung jeder Anspruch __FUNCTION__ist nicht notwendig).

Anonymer Besucher
quelle
1

Hackisch, aber Sie könnten es wahrscheinlich auch aus dem Rückgabewert debug_backtrace () herausholen.

timdev
quelle
Dies ist möglicherweise der richtige Weg, wenn Sie über eine allgemeine Protokollierungsfunktion verfügen, die den Namen der Funktion benötigt, die sie aufgerufen hat.
user9645
1

Mit __FUNCTION__kann ich das benutzen:

protected static function getUserResponseByAccessTokenRequestOptions(string $myParam): array
{
    return array_merge(parent::{__FUNCTION__}($myParam), [
        'myValue' => '123'
    ]);
}

an Stelle von:

protected static function getUserResponseByAccessTokenRequestOptions(string $myParam): array
{
    return array_merge(parent::getUserResponseByAccessTokenRequestOptions($myParam), [
        'myValue' => '123'
    ]);
}

Und es ist mir egal, den Namen der Methode innerhalb der Methode zu ersetzen, wenn ich sie ändern möchte.

Илья Зеленько
quelle
1

Vielleicht fehlen auf diese Weise späte Bindungen.

wenn Klasse B Klasse A erweitert:

__METHOD__Geben Sie immer den Teil "className ::" zurück, auf den A ( A::methodName) verweist.

Lösung ist:

static::class."::".__FUNCTION__

Auf diese Weise erhalten Sie den Klassenverweis auf die aktuelle Arbeiterklasse ( B::methodName)

sdotbertoli
quelle
-6

Warum kannst du das nicht tun?

public function something() {
    $thisMethodName = "something";
}
Andrew Hare
quelle
8
Völlig unnötig, wenn __FUNCTION__verfügbar.
zu viel PHP
1
Fair genug - aber im gleichen Sinne könnte ich mich damit zufrieden geben, dass `__FUNCTION__ unnötig ist :)
Andrew Hare
6
Gefährlich, wenn die Methode einen neuen Namen erhält, kann der Entwickler vergessen, den var-Inhalt zu aktualisieren
Marcio Mazzucato