Plantilla:PHP/Estatico
De WikiEducator
Revisión a fecha de 05:53 7 nov 2025; ManuelRomero (Discusión | contribuciones)
Métodos static vs no static
- En PHP, la idea de static es igual que en cualquier lenguaje de programación orientado a objetos.
- Cuando un elemento (atributo o método) es estático, ese elemento es compartido por todos los objetos de la clase y persiste en memoria con su contenido mientras exista al menos un objeto de esa clase.
- Como no pertenece a cada objeto individual, sino a la clase en general, también se les llama atributos o métodos de clase.
- Para acceder a un elemento estático, necesitamos nombrar la clase (no el objeto). En PHP podemos hacerlo usando el operador self o el propio nombre de la clase junto con el operador de resolución de ámbito ::.
|
- Es muy común tener un atributo static que cuente cuántos objetos existen de una clase.
- En la siguiente imagen se ilustra cómo al crear varios objetos, cada uno se instancia por separado en memoria:
- Cuando añadimos un elemento estático, solo habrá una copia en memoria, compartida por todos los objetos de la clase:
- Vemos el código y cómo se accede al elemento estático:
<?php class Racional { static public $cuenta_racionales = 0; private $num; // Numerador private $den; // Denominador public function __construct($num, $den) { self::$cuenta_racionales++; $this->num = $num; $this->den = $den; } } ?>
- El uso:
<?php require_once "Racional.php"; $r1 = new Racional(5,4); $r2 = new Racional(5,4); $r3 = new Racional(5,4); echo "<h1>Ahora tenemos " . Racional::$cuenta_racionales . " objetos Racional</h1>"; $r4 = new Racional(5,4); $r5 = new Racional(5,4); echo "<h1>Ahora tenemos " . Racional::$cuenta_racionales . " objetos Racional</h1>"; $r6 = new Racional(5,4); $r7 = new Racional(5,4); // Observa (y esto es propio de PHP) que puedo acceder a un elemento estático // tanto a través del nombre de la clase como desde un objeto echo "<h2>Podemos acceder con los objetos:</h2>"; echo "<h3>Según r1: " . $r1::$cuenta_racionales . "</h3>"; echo "<h3>Según r2: " . $r2::$cuenta_racionales . "</h3>"; echo "<h3>Según r3: " . $r3::$cuenta_racionales . "</h3>"; echo "<h3>Según la clase: " . Racional::$cuenta_racionales . "</h3>"; ?>
- La salida:
---
- Vamos a implementar las operaciones con números racionales.
Antes, recordemos las operaciones básicas:
- Sumar
- Restar
- Multiplicar
- Dividir
- Si la operación la implementamos como un método no estático, lo que estaremos haciendo es sumar al objeto actual otro objeto Racional que pasamos como argumento.
Podemos modificar el objeto actual o devolver un nuevo objeto (lo más correcto).
/** * Suma al racional actual el racional recibido como parámetro. * @param Racional $n1 * @return Racional */ public function sumar(Racional $n1) { $den = $this->den * $n1->getDen(); $num = $this->num * $n1->getDen() + $this->den * $n1->getNum(); return new Racional($num, $den); }
- Para usarlo:
$r1 = new Racional(7,6); $r2 = new Racional(9,4); $r3 = $r1->sumar($r2); echo "$r1 + $r2 = $r3";
- La salida:
---
- Si la operación la realizamos como un método estático, estaremos sumando dos objetos Racional y devolviendo un nuevo objeto como resultado:
static public function sum_static(Racional $r1, Racional $r2){ $n = $r1->getNum() * $r2->getDen() + $r1->getDen() * $r2->getNum(); $d = $r1->getDen() * $r2->getDen(); return new Racional($n, $d); }
- Para usarlo:
$r1 = new Racional(7,6); $r2 = new Racional(9,4); $r3 = Racional::sum_static($r1, $r2); echo "$r1 + $r2 = $r3";
- La salida:






