2009-05-24 14 views
88

Ho una domanda riguardante la funzione statica in php.php static function

supponiamo che ho una classe

class test { 
    public function sayHi() { 
     echo 'hi'; 
    } 
} 

se lo faccio test::sayHi(); funziona senza problemi.

class test { 
    public static function sayHi() { 
     echo 'hi'; 
    } 
} 

test::sayHi(); funziona pure.

Quali sono le differenze tra prima e seconda classe?

Cosa c'è di speciale in una funzione statica?

+9

A partire da php7 non è possibile chiamare staticamente il metodo non statico –

risposta

134

Nella prima classe, sayHi() è in realtà un metodo di istanza che si chiama come metodo statico e si ottiene con esso perché sayHi() non fa mai riferimento a $this.

Le funzioni statiche sono associate alla classe, non un'istanza della classe. Pertanto, $this non è disponibile da un contesto statico ($this non punta a nessun oggetto).

+19

Ora le chiamate statiche di metodi non statici funzionano ma sono deprecate. Fai attenzione a usare questa sintassi per i metodi di istanza! – Jet

+1

Quindi, perché lo dicono come funzione statica? perché non esiste un'istanza multipla con flusso di dati dinamico e output dinamico. Semplicemente guidami. @ Chaos – sun

19

L'intera differenza è che non si ottiene $this fornito all'interno della funzione statica. Se si tenta di utilizzare $this, si otterrà un Fatal error: Using $this when not in object context.

Bene, ok, un'altra differenza: un avviso E_STRICT viene generato dal primo esempio.

2

In breve, non si ha l'oggetto $ nel secondo caso, come il metodo statico è una funzione/metodo della classe e non l'istanza dell'oggetto.

+1

è statico semplicemente come si definiscono le funzioni di classe? nessun altro affare di lusso? Quindi stai dicendo che se fosse stato chiamato "class_method" piuttosto che "statico", sarebbe più semantico? – ahnbizcad

1

Dopo aver provato degli esempi (PHP 5.3.5), ho riscontrato che in entrambi i casi di funzioni di definizione non è possibile utilizzare l'operatore $this per lavorare sulle funzioni di classe. Quindi non sono riuscito a trovare una differenza in loro ancora. :(

16

Semplicemente, funzioni statiche funzionano indipendentemente dalla classe a cui appartengono.

$ ciò significa, questo è un oggetto di questa classe. Non si applica alle funzioni statiche.

class test { 
    public function sayHi($hi = "Hi") { 
     $this->hi = $hi; 
     return $this->hi; 
    } 
} 
class test1 { 
    public static function sayHi($hi) { 
     $hi = "Hi"; 
     return $hi; 
    } 
} 

// Test 
$mytest = new test(); 
print $mytest->sayHi('hello'); // returns 'hello' 
print test1::sayHi('hello'); // returns 'hello' 
+5

Ok io non sono un mago PHP, ma non è la variabile ('ciao') che viene passata alla funzione statica, sovrascritta esplicitamente con 'Ciao'? Il che significa che la riga stampa test1 :: sayHi ('ciao'); non sarebbe tornato 'ciao', ma sarebbe tornato 'ciao'? – Fnord23

+0

Questa risposta è sciatta (l'effetto delle funzioni statiche * può * dipendere dalla classe in cui si trovano) e gli esempi non rendono il punto molto chiaro. – reinierpost

3

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

Le proprietà statiche non sono accessibili tramite l'oggetto utilizzando l'operatore freccia ->.

La chiamata di metodi non statici genera in modo statico un avviso di livello E_STRICT.

Come qualsiasi altra variabile statica di PHP, le proprietà statiche possono essere inizializzate solo utilizzando un valore letterale o una costante; le espressioni non sono permesse. Pertanto, mentre è possibile inizializzare una proprietà statica su un numero intero o una matrice (ad esempio), non è possibile inizializzarla su un'altra variabile, su un valore restituito dalla funzione o su un oggetto.

A partire da PHP 5.3.0, è possibile fare riferimento alla classe utilizzando una variabile. Il valore della variabile non può essere una parola chiave (ad esempio self, parent e static). PHP.NET

3

La chiamata di metodi non statici genera in modo statico un avviso di livello E_STRICT.