2009-05-24 14 views
88

Tengo una pregunta sobre la función estática en php.php función estática

supongamos que tengo una clase

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

si hago test::sayHi(); funciona sin ningún problema.

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

test::sayHi(); funciona también.

¿Cuáles son las diferencias entre primera clase y segunda clase?

¿Qué tiene de especial la función estática?

+9

A partir de php7 no puede llamar al método no estático estáticamente –

Respuesta

134

En la primera clase, sayHi() es en realidad un método de instancia que está llamando como método estático y se saldrá con la suya porque sayHi() nunca hace referencia a $this.

Las funciones estáticas están asociadas a la clase, no a una instancia de la clase. Como tal, $this no está disponible desde un contexto estático ($this no está apuntando a ningún objeto).

+19

Ahora las llamadas estáticas de métodos no estáticos funcionan pero están en desuso. ¡Tenga cuidado al usar esta sintaxis para los métodos de ejemplo! – Jet

+1

Entonces, ¿por qué lo dicen como función estática? porque no hay una instancia múltiple con flujo de datos dinámico y salida dinámica. Solo guíame. @ Chaos – sun

19

Toda la diferencia es que no se obtiene $this suministrado dentro de la función estática. Si intenta utilizar $this, obtendrá un Fatal error: Using $this when not in object context.

Bien, bien, una otra diferencia: una advertencia E_STRICT es generada por su primer ejemplo.

2

En pocas palabras, no tiene el objeto como $ this en el segundo caso, como el método estático es una función/método de la clase, no la instancia del objeto.

+1

es estático simplemente cómo se definen las funciones de clase? ningún otro negocio elegante? Entonces, ¿está diciendo que si se hubiera llamado "class_method" en lugar de "static", sería más semántico? – ahnbizcad

1

Después de probar ejemplos (PHP 5.3.5), encontré que en ambos casos de definición de funciones no se puede usar el operador $this para trabajar en funciones de clase. Así que no pude encontrar una diferencia en ellos todavía. :(

16

Simplemente, funciones estáticas funcionar independientemente de la clase a la que pertenecen.

$ este medio, esto es un objeto de esta clase. No se aplica a las funciones estáticas.

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, no soy un asistente de PHP, pero ¿no es la variable ('hola') que se pasa a la función estática, explícitamente sobrescrita con 'Hola'? Lo que significa que la línea print test1 :: sayHi ('hello'); no devolvería 'hola', pero volvería 'hola'? – Fnord23

+0

Esta respuesta es descuidada (el efecto de las funciones estáticas * puede * depender de la clase en la que se encuentren) y los ejemplos no dejan muy claro el punto. – reinierpost

3

Como los métodos estáticos se pueden llamar sin una instancia del objeto creado, la pseudovariable $ this no está disponible dentro del método declarado como estático.

No se puede acceder a las propiedades estáticas mediante el objeto utilizando el operador de flecha ->.

Llamar a métodos no estáticos genera de forma estática una advertencia de nivel E_STRICT.

Como cualquier otra variable estática de PHP, las propiedades estáticas solo se pueden inicializar utilizando un literal o constante; las expresiones no están permitidas Por lo tanto, aunque puede inicializar una propiedad estática en un entero o matriz (por ejemplo), no puede inicializarla a otra variable, a un valor de retorno de función oa un objeto.

A partir de PHP 5.3.0, es posible hacer referencia a la clase utilizando una variable. El valor de la variable no puede ser una palabra clave (por ejemplo, self, principal y estático). PHP.NET

3

La llamada a métodos no estáticos genera estáticamente una advertencia de nivel E_STRICT.

Cuestiones relacionadas