2012-05-08 12 views
8

Se ormai ho capito un po 'in ststic Ora mi rendo conto di non capire nulla. Sono così confuso e faccio fatica a capire e non posso. Qualcuno può spiegare questo programma quando usa auto, genitore, statico e come Tutto il più piccolo cambiamento che faccio cambia il risultato senza che io non possa capire cosa sta succedendo. grazie mille ..quando si utilizza auto, genitore, statico e come?

il codice da http://docs.php.net/language.oop5.late-static-bindings

<?php 
class A { 
    public static function foo() { 
     static::who(); 
    } 

    public static function who() { 
     echo __CLASS__."\n"; 
    } 
} 

class B extends A { 
    public static function test() { 
     A::foo(); 
     parent::foo(); 
     self::foo(); 
    } 

    public static function who() { 
     echo __CLASS__."\n"; 
    } 
} 
class C extends B { 
    public static function who() { 
     echo __CLASS__."\n"; 
    } 
} 

C::test(); 
?> 

L'messo fuori sono:

A 
C 
C 

risposta

17

È necessario comprendere il concetto di Late Static Binding, che determina quando un identificatore è associato a codice/dati. Puoi dire a PHP di collegarlo in anticipo (self::) o successivo (static::).

Slimming l'esempio fino a due classi otteniamo:

class A { 
    public static function foo() { 
     self::who(); // PHP binds this to A::who() right away 
     static::who(); // PHP waits to resolve this (hence, late)! 
    } 

    public static function who() { 
     echo __CLASS__."\n"; 
    } 
} 

class B extends A { 
    public static function test() { 
     self::foo(); 
    } 

    public static function who() { 
     echo __CLASS__."\n"; 
    } 
} 

B::test(); 
+0

Grazie più inteso –

+1

Strano! avrei pensato che la versione finale sarebbe stata l'impostazione predefinita, ovvero perché la classe di mio figlio avrebbe dovuto preoccuparsi di definire un metodo e quindi chiamare la versione principale per impostazione predefinita? Ma non riesco a ricordare alcuna occasione in cui gli standard PHP fossero qualcosa di simile a quanto mi aspettassi. – jsh

+1

Qualcuno può spiegare di più. E spiega i vantaggi e gli svantaggi di entrambi – Rafael

6

Guarda http://php.net/manual/en/language.oop5.static.php. Dice:

Dichiarare proprietà o metodi di classe come statici li rende accessibili senza richiedere un'istanza della classe.

...

Poiché i metodi statici sono richiamabili senza un'istanza dell'oggetto creato, il $ pseudo-variabile non è disponibile all'interno del metodo dichiarato come statico.

Non è possibile utilizzare $this perché quando si chiama un metodo statico, non c'è oggetto classe istanziata da collocare nella variabile $this. Quindi usi self::.

parent:: si riferisce alla classe padre che la classe corrente sta estendendo. Ad esempio, per la Classe C la classe genitore è di Classe B e per la Classe B la classe genitrice è di Classe A. Vedere http://php.net/manual/en/keyword.parent.php.

Si utilizzano metodi statici quando si desidera che la funzione sia accessibile senza avere effettivamente un'istanza di tale classe dichiarata.


Dopo un'attenta ispezione della domanda, il collegamento punta a binding ritardati statici. I primi due esempi in quella pagina indicano abbastanza chiaramente la necessità per la sintassi static::, ma per chiarire per l'esempio che avete inviato:

Date un'occhiata al metodo di foo() in classe A. Si chiama static::who(). Ciò significa che il metodo who() verrà chiamato nell'ambito della classe che ha chiamato la funzione, anziché l'ambito della classe in cui è definita la funzione. Quindi, se dovessi chiamare C::foo(), sarebbe echo C.

Se, invece, si chiama self::who(), chiamerebbe A::who(). Perché all'interno della classe A, self:: si riferisce a A.

Speriamo che questo aiuti.

+1

Questa risposta non tocca le funzioni chiamate quando 'static ::' versus 'self ::' vengono utilizzati, che è davvero l'aspetto più importante del codice di esempio. – webbiedave

+0

@webbiedave: buon punto, risposta rivista. – Travesty3

+0

+1 Ho postato una risposta anche su questo punto ma prima di vedere la modifica. – webbiedave

5

La chiave per la risposta è statica :: chi(), ricordate statica :: mezzi si chiama il metodo con la classe reale (nel nostro caso - C).

modo C :: prova run() come segue:

A::foo(); -> calls to A::foo() therefor echo A 
parent::foo(); -> calls to C parent (which is B), B::foo() inherits A::foo() which calls to static::who(), but our actual class is C, therefor echo C 
self::foo(); -> again calls to foo() which calls to static::who() with our actual class C 

se invece di sé statica :: chi() foo stava chiamando :: chi() si dovrebbe ottenere tre A di conseguenza.

+0

+1 per spiegare 'static ::' vs 'self ::' – webbiedave

+0

Grazie buona spiegazione –

Problemi correlati