web-dev-qa-db-fra.com

Découvrez si une méthode existe dans une classe statique

Je veux vérifier si une fonction existe dans une bibliothèque que je crée, qui est statique. J'ai vu function et method_exists, mais je n'ai pas trouvé de moyen qui me permette de les appeler dans un contexte relatif. Voici un meilleur exemple:

class myClass{
    function test1()
    {
        if(method_exists("myClass", "test1"))
        {
            echo "Hi";
        }
    }
    function test2()
    {
        if(method_exists($this, "test2"))
        {
            echo "Hi";
        }
    }
    function test3()
    {
        if(method_exists(self, "test3"))
        {
            echo "Hi";
        }
    }
}
// Echos Hi
myClass::test1();
// Trys to use 'self' as a string instead of a constant
myClass::test3();
// Echos Hi
$obj = new myClass;
$obj->test2();

J'ai besoin de pouvoir faire écho au test 3 si la fonction existe, sans avoir besoin de la sortir de son contexte statique. Étant donné que le mot clé pour accéder à la classe doit être "self", car $ c'est pour les classes affectées.

36
Tyler Carter

static::class Est disponible depuis PHP 5.5, et renverra le nom de la classe " Late Static Binding ":

class myClass {
    public static function test()
    {
        echo static::class.'::test()';
    }
}

class subClass extends myClass {}

subClass::test() // should print "subClass::test()"

get_called_class() fait de même, et a été introduit dans PHP 5.3

class myClass {
    public static function test()
    {
        echo get_called_class().'::test()';
    }
}

class subClass extends myClass {}

subClass::test() // should print "subClass::test()"

La fonction get_class() , qui à partir de php 5.0.0 ne nécessite aucun paramètre si elle est appelée dans une classe, renverra le nom de la classe dans laquelle la fonction a été déclarée (par exemple, la classe parente):

class myClass {
    public static function test()
    {
        echo get_class().'::test()';
    }
}

class subClass extends myClass {}

subClass::test() // prints "myClass::test()"

La __CLASS__ Constante magique fait de même [ link ].

class myClass {
    public static function test()
    {
        echo __CLASS__.'::test()';
    }
}

class subClass extends myClass {}

subClass::test() // prints "myClass::test()"
56
gapple

Mettre à jour:

Ahh, excuses. J'étais temporairement aveugle :) Vous voudrez utiliser la constante magique __CLASS__

par exemple.

if (method_exists(__CLASS__, "test3")) { echo "Hi"; }
3
hobodave