2009-07-20 19 views
29

Voglio verificare se esiste una funzione in una libreria che sto creando, che è statica. Ho visto function e method_exists, ma non ho trovato un modo che mi permetta di chiamarli in un contesto relativo. Ecco un esempio migliore:Scoprire se esiste un metodo in una classe statica

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(); 

ho bisogno di essere in grado di effettuare test 3 eco Hi se la funzione esiste, senza bisogno di togliere l'contesto statico. Dato che la parola chiave per accedere alla classe dovrebbe essere 'self', come $ questo è per le classi assegnate.

+0

Perché il metodo test1() non è sufficiente? – gapple

+0

Perché voglio metterlo in una classe che sarà estesa da più classi. Potrei usare una costante magica per raggiungere questo obiettivo, ma dovrebbe esserci un modo più semplice. –

risposta

49

get_called_class() è stato introdotto in PHP 5.3, e tornerà il "Late binding statico" nome della classe:

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

class subClass extends myClass{} 

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

La funzione get_class(), che a partire dal PHP 5.0.0 non richiede qualsiasi parametro se chiamato all'interno di una classe restituirà il nome della classe in cui è stata dichiarata la funzione (ad esempio, la classe genitore):

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

class subClass extends myClass{} 

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

Lo __CLASS__ magic constant fa lo stesso [link].

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

class subClass extends myClass{} 

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

Grazie! Era esattamente quello che stavo cercando. –

+0

Stavo cercando un modo per verificare se esiste un metodo statico sulla classe genitore, e questa risposta mi ha portato a scoprire che 'get_parent_class()' funziona allo stesso modo quando chiamato senza parametri. Grazie! – mopo922

1

Aggiornamento:

Ah, scuse. Ero temporaneamente cieco :) Dovresti usare la costante magica __CLASS__

ad es.

if (method_exists(__CLASS__, "test3")) { echo "Hi"; } 
+0

questa risposta sembra essere la stessa del metodo test1() dell'esempio della domanda usando method_exists() con il nome della classe passato come una stringa – gapple

+0

L'idea è che non ho bisogno di un nome di classe, e quindi posso inserire il metodo qualsiasi classe, e dovrebbe funzionare, se la classe è stata assegnata o meno. –

+0

Vuoi dire dai commenti che ho 'solo' messo la domanda principale? –

Problemi correlati