2012-06-06 13 views
14

ok Ho questo codice, che sto studiandostatici e non statici Chiamata in PHP

class scope{ 

    function printme(){ 
     return "hello"; 
    } 

    public static function printme(){ 
     return "hello"; 
    } 

} 

$s = new scope(); 
echo $s->printme(); //non-static call 
echo "<br>"; 
echo scope::printme(); //static call 

Ora, questo non è davvero il codice del mio progetto, ma queste sono le cose che voglio fare

  1. Voglio creare una classe che conterrà funzioni statiche e non statiche.
  2. Desidero che una funzione sia disponibile sia su chiamate statiche che non statiche.

Poiché la funzione non statica ha un sacco di operazioni su di esso, devo anche chiamarla come una funzione statica in modo che non avrò bisogno di istanziare la classe. È possibile? o avevo davvero bisogno di riscrivere la funzione su un'altra funzione o classe?

NOTA: dimmi se sto già programmando male.

risposta

34

Ecco la regola:

Procedimento statico può essere utilizzato sia in modalità statica e metodo non statico.

Un metodo non statico può essere utilizzato solo in un metodo non statico.

+0

Ma se chiamo metodo non statico dal metodo statico usando self :: funziona. perché? –

+0

Php ti ha permesso di farlo non significa che dovresti farlo. self :: funziona perché il tuo metodo non statico non usa $ this, se usi $ this all'interno, non dovrebbe funzionare. – xdazz

+0

@RNKushwaha Se si chiama il metodo non statico dal metodo statico, se il metodo non statico utilizza $ this, 'Errore irreversibile: Errore non rilevato: l'utilizzo di $ this quando non nel contesto dell'oggetto' avverrà, se il metodo non statico non lo fa non usando $ this, 'PHP deprecato: il metodo non statico test :: foo() non dovrebbe essere chiamato staticamente' accadrà. – xdazz

2

As non-static function has a lot of operations on it, I also need to call it as a static function so that I will not need to instantiate the class. Is this possible? or I really needed to rewrite the function to another function or class?

Se è necessario statico, quindi renderlo statico. Se non ne hai bisogno, mantienilo così com'è. È possibile all'interno di una funzione non statica chiamare la funzione statica.

class Foo 
{ 
    public function bar() 
    { 
     Foo::zex(); 

     // or self::zex() or even $this->zex(); 
    } 

    public static function zex() 
    { 
    } 
} 


$foo = new Foo; 
$foo->bar(); 

Ant viceversa.

class Foo 
{ 
    public function bar() 
    { 

    } 

    public static function zex() 
    { 
     $foo = new Foo; 
     $foo->bar(); 
    } 
} 

Quando si dovrebbe fare o si dovrebbe farlo a tutti è un'altra questione. L'uso più comune di quest'ultimo è probabilmente il pattern Singleton.

6

Se l'istanza della classe è raramente necessaria, è possibile avere il metodo statico per creare un'istanza, chiamare il metodo non statico e restituire il valore.

class Scope { 
    public function mynonstatic() { 
    } 

    public static function mystatic() { 
     $s = new Scope(); 
     return $s->mynonstatic(); 
    } 
} 

Ricordare che un metodo statico è in realtà solo una funzione globale con ambito ridotto. Sono utili, ma non dovrebbero essere creati senza una buona ragione.