Nuevo yo: El yo es una palabra clave en PHP. Se refiere a la misma clase en la que se escribe realmente la nueva palabra clave. Se refiere a los miembros de la clase, pero no a ningún objeto en particular. Esto se debe a que los miembros estáticos (variables o funciones) son miembros de clase compartidos por todos los objetos de la clase. La función llamada self::theFunction() se comporta como «Ejecutaré en el contexto de la clase a la que pertenezco físicamente». (Suponiendo el escenario de herencia).
- Example: Suppose we make this call to the static model function in the Car class – since it is a static function we can, of course, call the function directly using only the class name:
<?php
class
Car
{
public
static
function
model()
{
self::getModel();
}
protected
static
function
getModel()
{
echo
"I am a Car!"
;
}
}
class
Mercedes
extends
Car
{
protected
static
function
getModel()
{
echo
"I am a Mercedes!"
;
}
}
Car::model();
echo
(
"\n"
);
Mercedes::model();
?>
- Output:
I am a Car! I am a Car!
- Explicación: la función de modelo se define dentro de la clase de automóvil y no se anula en la clase de Mercedes, pero la función de modelo es, por supuesto, heredada por la clase de Mercedes.
Como resultado, cuando llamamos a la versión del modelo dentro de la clase Mercedes, el alcance de la función todavía está dentro de la clase Car, porque la definición de la función está dentro de la clase Car. La forma en que funciona la palabra clave «self» es que llamará a la implementación de la función getModel de la clase actual, y dado que la función del modelo se define dentro de la clase Car, la clase actual sería la clase Car.Por lo tanto, llamará a la implementación de la clase Car de getModel y NO a la implementación de la clase Mercedes. Este comportamiento puede considerarse indeseable porque no es polimórfico y no está alineado con los principios de diseño orientado a objetos. Pero existe una solución alternativa que puede generarnos ese tipo de comportamiento, y aquí es donde la palabra clave estática se vuelve útil.
Nueva estática: La estática es una palabra clave en PHP. Estático en los enlaces estáticos tardíos de PHP 5.3, se refiere a cualquier clase en la jerarquía en la que llamó al método. El uso más común de static es para definir métodos estáticos. Dichos métodos son parte de una clase, como cualquier método, aunque pueden usarse incluso sin ningún objeto instanciado. La función llamada static::theFunction() se comporta como «Ejecutaré en el contexto de la clase, que en realidad ha sido llamada por el mundo exterior».
- Ejemplo:
<?php
class
Car
{
public
static
function
model()
{
static
::getModel();
}
protected
static
function
getModel()
{
echo
"I am a Car!"
;
}
}
class
Mercedes
extends
Car
{
protected
static
function
getModel()
{
echo
"I am a Mercedes!"
;
}
}
Car::model();
echo
(
"\n"
);
Mercedes::model();
?>
- Producción:
I am a Car! I am a Mercedes!
PHP new self vs new static: ahora que cambiamos el código en nuestro ejemplo para usar static en lugar de self, puede ver la diferencia es que self hace referencia a la clase actual, mientras que la palabra clave static permite que la función se vincule a la clase de llamada en tiempo de ejecución La diferencia entre palabras clave propias y estáticas es bastante fácil de entender con un ejemplo.
<?php class g { /* The new self */ public static function get_self() { return new self(); } /* The new static */ public static function get_static() { return new static(); } } class f extends g {} echo get_class(f::get_self()); // g echo get_class(f::get_static()); // f echo get_class(g::get_self()); // g ?>
Salida: En este ejemplo de código, f hereda ambos métodos de g. La autoinvocación está vinculada a A porque está definida en la implementación del método de g, mientras que la estática está vinculada a la clase llamada.
gfg