2012-06-06 20 views
14

bien tengo este código, que estoy estudiandoestáticos y no estáticos Llamada en 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 

Ahora, esto no es realmente el código de mi proyecto pero estas son las cosas que quiero hacer

  1. Quiero crear una clase que contendrá funciones estáticas y no estáticas.
  2. Quiero que una función esté disponible tanto en llamadas estáticas como no estáticas.

Como la función no estática tiene muchas operaciones en ella, también necesito llamarla como una función estática para que no necesite crear una instancia de la clase. es posible? o realmente necesitaba reescribir la función para otra función o clase?

NOTA: dime si ya estoy haciendo una mala programación.

Respuesta

34

Aquí es la regla:

un método estático se puede utilizar en tanto método estático y el método no estático.

Un método no estático solo se puede utilizar en un método no estático.

+0

Pero si llamo al método no estático del método estático usando self :: works. ¿por qué? –

+0

Php le permitió hacer eso, eso no significa que deba hacer eso. self :: funciona porque su método no estático no usa $ this, si usa $ this inside, no debería estar funcionando. – xdazz

+0

@RNKushwaha Si llama al método no estático desde el método estático, si el método no estático usa $ this, 'Error fatal: Error no capturado: usar $ this cuando no está en el contexto del objeto' sucederá, si el método no estático lo hace no usando $ this, 'PHP desaprobado: prueba de método no estático :: foo() no debería ser llamado estáticamente' sucederá. – 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?

Si lo necesita estático, entonces hágalo estático. Si no lo necesita, manténgalo como está. Es posible desde la función no estática llamar a la función estática.

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

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

    public static function zex() 
    { 
    } 
} 


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

Ant a la inversa.

class Foo 
{ 
    public function bar() 
    { 

    } 

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

Cuando debe hacerlo o debe hacerlo en absoluto es otra cuestión. El uso más común de este último es probablemente el patrón de Singleton.

6

Si rara vez se necesita la instancia de su clase, puede hacer que el método estático cree una instancia, llame al método no estático y devuelva el valor.

class Scope { 
    public function mynonstatic() { 
    } 

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

Recuerde que un método estático es realmente solo una función global con alcance reducido. Son útiles, pero no deben crearse sin una buena razón.

Cuestiones relacionadas