Domanda

Ho una domanda per quanto riguarda funzione statica in php.

supponiamo che ho una classe

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

se io test::sayHi(); funziona senza problemi.

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

test::sayHi(); funziona pure.

Quali sono le differenze tra prima classe e seconda classe?

La particolarità di una funzione statica?

È stato utile?

Soluzione

Nella prima classe, sayHi() è in realtà un metodo di istanza che si sta chiamando come un metodo statico e si ottiene franca perché sayHi() non si riferisce a $this.

funzioni statiche sono associate con la classe, non un'istanza della classe. Come tale, $this non è disponibile da un contesto statico ($this non punta ad alcun oggetto).

Altri suggerimenti

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

$ questo significa, si tratta di un oggetto di questa classe. Essa 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'

L'intera differenza è, 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, bene, un altra differenza:. Un avvertimento E_STRICT viene generato dal vostro primo esempio

Chiamare i metodi non statici genera staticamente un allarme per il livello E_STRICT.

In poche parole, non si deve l'oggetto da $ questo nel secondo caso, come il metodo statico è una funzione / metodo della classe non l'istanza di oggetto.

Dopo aver provato esempi (PHP 5.3.5), ho scoperto che in entrambi i casi di funzioni che definiscono non è possibile utilizzare operatore $this per lavorare su funzioni di classe. Quindi non ho potuto trovare una differenza di loro ancora. : (

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top