2010-02-04 12 views
111

come si chiama un metodo statico da un altro metodo all'interno della stessa classe?chiama un metodo statico all'interno di una classe?

$this->staticMethod(); 

o

$this::staticMethod(); 
+11

Potreste essere interessato a questo ('' self' vs. $ this') : http://stackoverflow.com/questions/151969/php-self-vs-this –

+0

Solo una FYI, il tuo primo esempio è una variabile di istanza che chiama un metodo statico che non è possibile perché un metodo statico fa parte della classe e non è accessibile tramite una variabile di istanza. – joejoeson

+0

puoi cancellare $ this ora per favore non funziona se si usano solo metodi statici e nessuna istanza esiste. – malhal

risposta

211
+0

... ma perché? $ this-> staticMethod() funziona anche. Puoi spiegare perché self :: staticMethod() è più corretto (se lo è)? –

+15

@Ian Dunn In parole semplici, '$ this' esiste solo se un oggetto è stato istanziato ed è possibile utilizzare solo $ $ questo-> metodo all'interno di un oggetto esistente. Se non hai un oggetto ma chiami un metodo statico e in quel metodo vuoi chiamare un altro metodo statico nella stessa classe, devi usare 'self ::'. Quindi per evitare potenziali errori (e avvertimenti severi) è meglio usare 'self'. – jeroen

+0

Non è possibile utilizzare $ in una funzione statica .... – patrick

36

Supponiamo che questa è la tua classe:

class Test 
{ 
    private $baz = 1; 

    public function foo() { ... } 

    public function bar() 
    { 
     printf("baz = %d\n", $this->baz); 
    } 

    public static function staticMethod() { echo "static method\n"; } 
} 

Da all'interno del metodo foo(), guardiamo le diverse opzioni:

$this->staticMethod(); 

In modo che chiama staticMethod() come un metodo di istanza, giusto? Non è così. Questo perché il metodo è dichiarato come public static l'interprete lo chiamerà come metodo statico, quindi funzionerà come previsto. Si potrebbe sostenere che così facendo è meno ovvio dal codice che si sta verificando una chiamata al metodo statico.

$this::staticMethod(); 

Dal PHP 5.3 è possibile utilizzare $var::method() a significare <class-of-$var>::; questo è abbastanza conveniente, anche se il caso d'uso di cui sopra è ancora piuttosto non convenzionale. In modo che ci porta al modo più comune di chiamare un metodo statico:

self::staticMethod(); 

Ora, prima di iniziare a pensare che il :: è l'operatore di chiamata statica, mi permetta di darle un altro esempio:

self::bar(); 

Questo stamperà baz = 1, il che significa che $this->bar() e self::bar() fanno esattamente la stessa cosa; questo perché :: è solo un operatore di risoluzione dell'ambito. È lì per fare funzionare parent::, self:: e static:: e accedere alle variabili statiche; come viene chiamato un metodo dipende dalla sua firma e da come è stato chiamato il chiamante.

Per vedere tutto questo in azione, vedere this 3v4l.org output.

+6

+1 per la spiegazione – FreshPro

+0

'self :: bar()' sembra fuorviante - è ora deprecato? (usando 'self ::' per chiamare un metodo di istanza piuttosto che un metodo statico). – ToolmakerSteve

+0

@ToolmakerSteve in che modo diresti che è fuorviante? –

7

Questa è una risposta molto tardiva, ma le due risposte precedenti sono un po 'fuorvianti.

Quando si tratta di chiamare metodi statici in PHP da un altro metodo statico sulla stessa classe, è importante distinguere tra self e il nome della classe.

Prendete per esempio questo codice:

class static_test_class { 
    public static function test() { 
     echo "Original class\n"; 
    } 

    public static function run($use_self) { 
     if($use_self) { 
      self::test(); 
     } else { 
      $class = get_called_class(); 
      $class::test(); 
     } 
    } 
} 

class extended_static_test_class extends static_test_class { 
    public static function test() { 
     echo "Extended class\n"; 
    } 
} 

extended_static_test_class::run(true); 
extended_static_test_class::run(false); 

L'uscita di questo codice è:

classe originale

classe estesa

Questo perché self si riferisce a la classe in cui si trova il codice, anziché la c ragazza del codice da cui viene chiamato.

Se si desidera utilizzare un metodo definito in una classe che eredita la classe originale, è necessario usare qualcosa come:

$class = get_called_class(); 
$class::function_name(); 
+2

Ho trovato questo informativo. Un piccolo segno, non direi che le altre risposte sono "fuorvianti". Più preciso dire che sono "incompleti"; non affrontano la (non richiesta) domanda su cosa 'self ::' fa nel caso (raro) in cui un metodo statico A chiama un altro metodo statico B, e B è stato sovrascritto in una sottoclasse. IMHO, è meno confuso limitare il metodo che sovrascrive ai metodi di "istanza"; usa questa abilità con parsimonia a livello statico. In altre parole, i lettori del tuo codice si aspettano che il metodo prevalga sui metodi di istanza (che è l'essenza della codifica OO), ma non su quelli statici. – ToolmakerSteve

+1

Molto utile e ha senso che un'estensione della classe non sia la classe originale. Quindi è ovvio che "io" non sarebbe usato in quel caso. Hai dichiarato una classe separata come estensione della prima classe. L'uso di 'self' all'interno della classe estesa farebbe riferimento alla classe estesa. Ciò non contraddice le altre risposte, ma certamente aiuta a dimostrare la portata del "sé". – iyrin

1

Nel tardo PHP versione self::staticMethod(); anche non funzionerà. Lancia l'errore standard severo.

In questo caso, siamo in grado di creare l'oggetto della stessa classe e chiamare per oggetto

qui è l'esempio

class Foo { 

    public function fun1() { 
     echo 'non-static'; 
    } 

    public static function fun2() { 
     echo (new self)->fun1(); 
    } 
} 
+0

Grande input, grazie – Joundill

Problemi correlati