Pregunta

Tengo una pregunta con respecto a la función estática en php.

Supongamos que tengo una clase

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

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

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

test::sayHi(); funciona tan bien.

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

Lo que es especial acerca de una función estática?

¿Fue útil?

Solución

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

funciones estáticas están asociados con la clase, no una instancia de la clase. Como tal, $this no está disponible desde un contexto estático ($this no está apuntando a cualquier objeto).

Otros consejos

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

$ este medio, se trata de 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 'Hi'

diferencia en todo, usted no recibe $this suministrado dentro de la función estática. Si intenta utilizar $this, obtendrá un Fatal error: Using $this when not in object context.

Bueno, está bien, otra diferencia:. E_STRICT una advertencia es generada por el primer ejemplo

Llamar a métodos no estáticos estáticamente genera un aviso de nivel de E_STRICT.

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

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top