Métodos Estáticos
Métodos Estáticos
Métodos estáticos
class MiClase {
public static $contador = 0;
public function __construct() {
self::$contador++;
}
public static function obtenerContador() {
return self::$contador;
}
}
// Crear objetos
$objeto1 = new MiClase();
$objeto2 = new MiClase();
echo MiClase::obtenerContador(); // Imprime: 2
- Una variable estática puede ser devuelta por un método que no es estático. Es decir los métodos normales pueden devolver atributos estáticos y atributos normales y siempre con instancia. Los métodos estáticos solo pueden devolver variables estáticas.
- Un método estático no puede devolver un atributo que no sea estático (no se puede utilizar $this en un método estático)
- Si tenemos un objeto, podemos llamar a métodos estáticos usando el propio objeto, pero no podemos llamar a sus atributos estáticos desde el propio objeto.
- Usando el nombre de la clase podemos acceder tanto a métodos como atributos estáticos si el modificador nos lo permite.
- Si una propiedad o método en la clase padre es estático, si lo sobreescribimos en el hijo también deben ser estáticos.
class MiClase {
public static $staticVar = 'S';
public static function obtenerContador() {
return "static";
}
}
// Crear objetos
$objeto1 = new MiClase();
echo $objeto1->obtenerContador(); // static
echo $objeto1->staticVar; // error
Herencia de métodos estáticos
Los métodos o atributos estáticos del padre que sean protected se heredan por el hijo. Este tiene que crear métodos estáticos públicos donde se llamen a los métodos estáticos del padre para tener acceso desde fuera.
Los métodos públicos se pueden acceder con el nombre de la clase del padre, instancia del padre, clase del hijo o instancia del hijo. Vamos que es accesible desde cualquier lado
La palabra reservada “parent” solo se puede usar en métodos
class Padre {
protected static $var = "hello";
}
class Hijo extends Padre {
public $varr = parent::$var; // error
public function devolverVar(){
return parent::$var;
}
}
$hijo = new Hijo();
echo $hijo->devolverVar();
self y static
En PHP, static:: se utiliza para acceder a miembros (métodos o propiedades) de una clase en el contexto de ejecución actual. La principal diferencia entre self:: y static:: radica en cómo manejan la herencia y el polimorfismo.
Cuando se utiliza self::, se hace referencia a la clase en la que se escribe el código, y no tiene en cuenta si la llamada proviene de una clase derivada (subclase). Esto significa que self:: siempre se resuelve en tiempo de compilación. En cambio, static:: se resuelve en tiempo de ejecución y se adapta al contexto de la clase que realmente está llamando al método. Esto es especialmente útil en situaciones de herencia, ya que permite que las llamadas a métodos estén vinculadas dinámicamente a la clase que realiza la llamada en lugar de la clase en la que se definió originalmente el método.
class Padre {
public static function quienSoy() {
echo "Padre";
}
public static function llamarMetodoEstatico() {
static::quienSoy();
}
}
class Hijo extends Padre {
public static function quienSoy() {
echo "Hijo";
}
}
// Llamada al método desde la clase Padre
Padre::llamarMetodoEstatico(); // Salida: Padre
// Llamada al método desde la clase Hijo
Hijo::llamarMetodoEstatico(); // Salida: Hijo
class Padre {
protected static $propiedad = "Propiedad en Padre";
public static function obtenerPropiedad() {
return self::$propiedad;
}
public static function obtenerPropiedadConStatic() {
return static::$propiedad;
}
}
class Hijo extends Padre {
protected static $propiedad = "Propiedad en Hijo";
}
// Llamada desde la clase Padre
echo Padre::obtenerPropiedad(); // Salida: Propiedad en Padre
echo Padre::obtenerPropiedadConStatic(); // Salida: Propiedad en Padre
// Llamada desde la clase Hijo
echo Hijo::obtenerPropiedad(); // Salida: Propiedad en Padre
echo Hijo::obtenerPropiedadConStatic(); // Salida: Propiedad en Hijo
self
Se resuelve en tiempo de compilación, lo que significa que siempre se refiere a la clase donde se define el método. Útil para referirse a constantes y propiedades estáticas de la clase actual.
static
Se resuelve en tiempo de ejecución, lo que permite el polimorfismo y la resolución dinámica en el contexto de la herencia. Útil cuando quieres que la llamada al método sea polimórfica y que se adapte al contexto de la clase que realiza la llamada.
Constantes
Las constantes definidas en una clase es como si fueran estáticas dado que podemos acceder a ellas con el nombre de la clase
class Base {
const PI = 3.1459;
}
echo Base::PI; // 3.1459