web-dev-qa-db-fra.com

Pouvez-vous obtenir un nom de méthode à partir d'une méthode en PHP?

Est-il possible de faire quelque chose comme ça?

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

method_get_name() renvoie le nom de la méthode?

58
alex

Bien sûr, vous voulez les constantes magiques.

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

En savoir plus sur le manuel php

98
Kevin Vaughan

Bien que vous puissiez utiliser la constante magie__METHOD__, je vous recommande vivement de consulter le fichier reflection de PHP. Ceci est supporté en PHP5.

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

Vous pouvez ensuite faire des trucs comme vérifier la signature, etc.

20
thesmart

Comme smartj l'a suggéré, vous pouvez essayer la constante magique __METHOD__, mais souvenez-vous que cela retournera une chaîne contenant également le nom de votre classe, c'est-à-dire 'MyClass :: thing'. Utiliser __FUNCTION__ à la place retournera 'quelque chose'.

11
Jan Molak

Utiliser __FUNCTION__ est la voie à suivre au lieu de:

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

qui comporte plusieurs failles: ajouter une variable et de la mémoire pour stocker le nom de la méthode sous forme de chaîne et dupliquer ce qui existe déjà, ce qui ajoute inutilement les ressources utilisées (si vous faites cela pour une grande bibliothèque avec de nombreuses méthodes, cela importe beaucoup).

Les constantes magiques dans PHP ont la garantie de ne pas changer, alors que cette approche nécessiterait une édition applicable si le nom de la méthode était modifié, introduisant ainsi le risque d'incohérence (remarque, j'ai potentiellement dit, ce qui signifie simplement qu'il est inutile modifier si la constante magique a été utilisée à la place).

Le temps et l’effort nécessaires pour nommer une variable, retaper le nom de la méthode en tant que chaîne affectée à cette variable inutile et bien sûr référencer correctement le nom de la variable, ce qui a motivé PHP à fournir des constantes magiques pour commencer (et réfuter toute revendication __FUNCTION__ est inutile).

2
Anonymous Visitor

Hackish, mais vous pourriez aussi probablement le Digger hors de la valeur de retour debug_backtrace ().

1
timdev

Avec __FUNCTION__ je peux utiliser ceci:

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

au lieu de cela:

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

Et ne se soucie pas de remplacer le nom de la méthode à l'intérieur de la méthode si je veux le changer.

Peut-être manque-t-il des liaisons tardives de cette manière.

lorsque la classe B étend la classe A:

__METHOD__ renvoie toujours la partie "className ::" référée à A (A::methodName)

La solution est:

static::class."::".__FUNCTION__

De cette façon, vous obtenez la référence de classe à la classe ouvrière actuelle (B::methodName)

0
sdotbertoli