función estática php

108

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

supongamos que tengo una clase

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

si lo hago test::sayHi();funciona sin problema.

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

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

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

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

Luna
fuente
15
A partir de php7, no se puede llamar a un método no estático estáticamente
sanjay yadav

Respuestas:

153

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

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

Jonathan Fingland
fuente
22
Ahora la llamada estática de métodos no estáticos funciona, pero está en desuso. ¡Tenga cuidado al usar esta sintaxis, por ejemplo, métodos!
Jet
1
Entonces, ¿por eso lo dicen como función estática? porque no hay instancias múltiples con flujo de datos dinámico y salida dinámica. Solo guíame. @ Chaos
dom
22

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

$ esto significa que este es un objeto de esta clase. No se aplica a 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 'Hi'
usuario2132859
fuente
9
Ok, no soy un asistente de PHP, pero ¿la variable ('hola') que se pasa a la función estática no se sobrescribe explícitamente con 'Hola'? Lo que significa que la línea print test1 :: sayHi ('hola'); no devolvería 'hola', pero devolvería 'hola'?
Fnord23
6
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 aclaran el punto.
reinierpost
No es un buen ejemplo. $ hola = 'Hola'; sobrescribe el argumento dado y no tiene nada que ver con la declaración estática. Arreglaría esto como: self :: $ hi = $ hi; y funcionaría igual que el no estático. Puede acceder a las variables de clase con self :: en lugar de $ this->
GotBatteries
20

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

Bueno, está bien, otra diferencia: E_STRICTel primer ejemplo genera una advertencia.

caos
fuente
1
no tengo ninguna advertencia cuando uso por primera vez y estoy en php7
ashkan nasirzadeh
¿Por qué no tenemos $ this dentro de una función estática? ¿Cuál es la lógica arquitectónica de esto? Gracias.
Lucas Bustamante
@LucasBustamante: se $thisrefiere al objeto actual. En una función estática, no hay ningún objeto actual; la función existe en la clase sin necesidad ni referencia a una instancia de objeto de esa clase.
caos
3

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


fuente
2

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

Czimi
fuente
1
¿Es estático simplemente cómo se definen las funciones de clase? ningún otro negocio elegante? Entonces, ¿estás diciendo que si se hubiera llamado "método_clase" en lugar de "estático", sería más semántico?
ahnbizcad
1

Después de probar ejemplos (PHP 5.3.5), descubrí que en ambos casos de definir funciones no se puede usar el $thisoperador para trabajar en funciones de clase. Entonces no pude encontrar una diferencia en ellos todavía. :(

yogesh
fuente