Plantilla:PHP/Estatico

De WikiEducator
Saltar a: navegación, buscar

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 ::.



Icon activity.jpg
Usar constantes y elementos estáticos
Como ejemplo, vamos a implementar una clase Factura con los siguientes requisitos
  • La factura tendrá una constante llamada IVA.
  • Tendremos un atributo estático que especificará el número de facturas creadas.
  • Los atributos de cada factura serán importe_bruto y fecha.
  • Tendrá un método generarFactura() que mostrará:
  1. Factura de XXXX (el nombre se recibirá como argumento).
  2. Fecha (atributo).
  3. Importe base (atributo).
  4. IVA aplicado (constante de la clase).
  5. Total bruto (importe base más el IVA).
  • En el archivo index.php crearemos 5 facturas, visualizaremos el número de facturas, eliminaremos dos de ellas y volveremos a visualizar el número de facturas. Finalmente imprimiremos las dos facturas restantes.




  • 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:
Estatico1.png
  • Cuando añadimos un elemento estático, solo habrá una copia en memoria, compartida por todos los objetos de la clase:
Estatico2.png
  • 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:

AppEstatica1.png

---

  • Vamos a implementar las operaciones con números racionales.

Antes, recordemos las operaciones básicas:

Sumar

Suma racionales.png

Restar

Resta racionales.png

Multiplicar

Mult racionales.png

Dividir

Division racional.png

  • 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:

SumarNoEstatico.png

---

  • 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:

SumarEstatico.png