funzione statica php


108

Ho una domanda sulla funzione statica in php.

supponiamo che io abbia 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 anche.

Quali sono le differenze tra prima classe e seconda classe?

Cosa c'è di speciale in una funzione statica?


15
A partire da php7 non è possibile chiamare staticamente un metodo non statico
sanjay yadav

Risposte:


153

Nella prima classe, sayHi()è in realtà un metodo di istanza che stai chiamando come metodo statico e te la cavi perché sayHi()non ti fa mai riferimento $this.

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


22
Ora la chiamata statica di metodi non statici funziona ma è deprecata. Fai attenzione a usare questa sintassi per i metodi di istanza!
Jet

1
Quindi è per questo che lo dicono come funzione statica? perché non sono presenti più istanze con flusso di dati dinamico e output dinamico. Guidami. @ Caos
domenica

22

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

$ questo significa che 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 'Hi'

9
Ok non sono un wizard PHP, ma la variabile ('hello') che viene passata alla funzione statica non viene sovrascritta esplicitamente con 'Hi'? Significa che la riga print test1 :: sayHi ('hello'); non restituirebbe "ciao", ma restituirebbe "ciao"?
Fnord23

6
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

Non è un ottimo esempio. $ hi = 'Ciao'; sovrascrive l'argomento dato e non ha nulla a che fare con la dichiarazione statica. Lo aggiusterei in questo modo: self :: $ hi = $ hi; e funzionerebbe proprio come quello non statico. Puoi accedere alle variabili di classe con self :: invece di $ this->
GotBatteries

20

L'intera differenza è che non vieni $thisfornito all'interno della funzione statica. Se provi a usare $this, otterrai un fileFatal error: Using $this when not in object context .

Bene, ok, un'altra differenza: E_STRICTviene generato un avviso dal tuo primo esempio.


1
non ho alcun avviso quando lo uso per primo e sono in php7
ashkan nasirzadeh

Perché non abbiamo $ this all'interno di una funzione statica? Qual è la logica architettonica di questo? Grazie.
Lucas Bustamante

@ LucasBustamante: si $thisriferisce all'oggetto corrente. In una funzione statica, non è presente alcun oggetto corrente; la funzione esiste sulla classe senza necessità o riferimento a un'istanza di oggetto di quella classe.
caos

3

La chiamata di metodi non statici genera staticamente un avviso di livello E_STRICT.


2

In poche parole, non hai l'oggetto come $ this nel secondo caso, poiché il metodo statico è una funzione / metodo della classe e non l'istanza dell'oggetto.


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

1

Dopo aver provato esempi (PHP 5.3.5), ho scoperto che in entrambi i casi di definizione di funzioni non è possibile utilizzare $thisoperator per lavorare sulle funzioni di classe. Quindi non ho ancora trovato una differenza in loro. :(

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.