Diferencia entre revisiones de «Plantilla:PHP/Estatico»

De WikiEducator
Saltar a: navegación, buscar
(Métodos static Vs no static)
(Métodos static Vs no static)
 
Línea 20: Línea 20:
 
{{plegable|hide|Posible solucion|
 
{{plegable|hide|Posible solucion|
 
<source lang=php>
 
<source lang=php>
 +
<?php
 +
//Factura.php
 +
class Factura
 +
{
 +
    // Constante IVA
 +
    const IVA = 0.21;
 +
 +
    // Atributo estático para contar el número de facturas
 +
    private static $numeroFacturas = 0;
 +
 +
    // Atributos de la factura
 +
    private $importe_bruto;
 +
    private $fecha;
 +
 +
    // Constructor
 +
    public function __construct($importe_bruto, $fecha)
 +
    {
 +
        $this->importe_bruto = $importe_bruto;
 +
        $this->fecha = $fecha;
 +
        self::$numeroFacturas++; // Incrementa el número de facturas al crear una nueva instancia
 +
    }
 +
 +
    // Destructor
 +
    public function __destruct()
 +
    {
 +
        self::$numeroFacturas--; // Decrementa el número de facturas al eliminar una instancia
 +
    }
 +
 +
    // Método para generar una factura
 +
    public function generarFactura($nombreCliente)
 +
    {
 +
        $ivaAplicado = $this->importe_bruto * self::IVA;
 +
        $totalBruto = $this->importe_bruto + $ivaAplicado;
 +
 +
        echo "Factura de $nombreCliente\n";
 +
        echo "Fecha: {$this->fecha}\n";
 +
        echo "Importe base: {$this->importe_bruto} €\n";
 +
        echo "IVA aplicado (" . (self::IVA * 100) . "%): {$ivaAplicado} €\n";
 +
        echo "Total bruto: {$totalBruto} €\n";
 +
        echo "-----------------------------\n";
 +
    }
 +
 +
    // Método estático para obtener el número de facturas actuales
 +
    public static function obtenerNumeroFacturas()
 +
    {
 +
        return self::$numeroFacturas;
 +
    }
 +
}
 +
 +
 +
//index.php
 +
// Código en el índice
 +
 +
// Crear 5 facturas
 +
$factura1 = new Factura(100, '2024-11-18');
 +
$factura2 = new Factura(200, '2024-11-18');
 +
$factura3 = new Factura(150, '2024-11-18');
 +
$factura4 = new Factura(300, '2024-11-18');
 +
$factura5 = new Factura(250, '2024-11-18');
 +
 +
// Visualizar el número de facturas
 +
echo "Número de facturas actuales: " . Factura::obtenerNumeroFacturas() . "\n\n";
 +
 +
// Eliminar dos facturas
 +
unset($factura4);
 +
unset($factura5);
 +
 +
// Visualizar el número de facturas tras eliminar dos
 +
echo "Número de facturas tras eliminar: " . Factura::obtenerNumeroFacturas() . "\n\n";
 +
 +
// Imprimir las facturas restantes
 +
$factura1->generarFactura("Cliente 1");
 +
$factura2->generarFactura("Cliente 2");
 +
 +
 
</source>
 
</source>
  

Última revisión de 18:44 19 nov 2024

Métodos static Vs no static

  • En php la idea de static, es igual que en cualquier lenguaje de programación.
  • Cuando un elementos (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 haya un objeto de esa clase.
  • Como no es un elemento de cada objeto, sino de todos los objetos de una clase, también se le suelen llamar atributos o métodos de la clase.
  • Como no es de la clase para acceder a él necesitamos nombrar la clase. En php se puede hacer suando el operador self o incluso el propio nombre de la clase


Icon activity.jpg
Usar constantes y elementos estáticos
Como ejemplo vamos a implementar una Factura y utilizarlas con los siguientes requisitos
  • La factura tendrá una constante llamada IVA
  • Tendremos un atributo estáticos que especificará el número de facturas que tengo
  • Los atributos de factura serán importe_bruto y fecha
  • Tendrá un método generar factura que nos visualizará una factura con los siguientes datos:
  1. Factura de XXXX (El nombre lo recibirá como argumento)
  2. Fecha (La fecha de la factura que es un atributo)
  3. Importe (El importe base que es un atrubuto)
  4. IVA aplicado (El valor de la constante iva)
  5. Total bruto (El importe base más el iva)
  • En el index crearemos 5 facturas, visualizaremos el número de facturas, elimniaremos dos de ellas y visualizaremos el número de facturas e imprimieremos las 2 facturas que nos queden



  • Es un ejemplo típico tener un atributo static que cuente cuantos objetos hay de una clase.
  • Miramos la siguiente imagen que trata de ilustrar como al crear objetos se instancian en memoria
Estatico1.png
  • Cuando añadimos un elemento estático, solo habrá una copia en memoria y es compartida por todos los objetos de la clase
Estatico2.png
  • Vemos el código y como se accede al elemento
<?php
class Racional {
 
    static public $cuenta_racionales=0;
 
    //atributos
    private $num; //el numerador
    private $den; //el denominador
    //......
    public function __construct($num, $den) {
        self::$cuenta_racionales++;
    .......
  • El uso
<?php
 
/* 
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
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 racionales</h1>";
    $r4 = new Racional(5,4);
    $r5 = new Racional(5,4);
    echo "<h1>Ahora tenemos" .Racional::$cuenta_racionales."</h1>";
    $r6 = new Racional(5,4);
    $r7 = new Racional(5,4);
 
    //Observa (y esto es de php ) que puedo acceder a un elemento estático
    //A traves del nombre del objeto
    echo "<h1>Ahora tenemos" .Racional::$cuenta_racionales."</h1>";
    echo "<h1>Podemos acceder con los objtetos </h2>";
    echo "<h1>Según r1 tenemos " .$r1::$cuenta_racionales."</h1>";
    echo "<h1>Según r2 tenemos " .$r2::$cuenta_racionales."</h1>";
    echo "<h1>Según r3 tenemos " .$r3::$cuenta_racionales."</h1>";
    echo "<h1>Según r4 tenemos " .$r4::$cuenta_racionales."</h1>";
    echo "<h1>Según La clase tenemos " .Racional::$cuenta_racionales."</h1>";
 
 
 
 
?>
  • La salida

AppEstatica1.png

  • Vamos a implementar las operaciones en un Racional.

Primero como siempre conviene recordar cómo se hacen

Sumar

Suma racionales.png

Restar

Resta racionales.png

Multiplicar

Mult racionales.png

Dividir

Division racional.png

  • Si la operación la implemento como un método no estático lo que estaría haciendo es sumar al objeto acutual, otro objeto Racional que pasamos como argumento. Puedo modificar el objeto acutal como resultado de la suma, o devolver otro objeto Racional que sería lo mas correcto
 /**
     *
     * @param Racional $n1
     * @return \Racional
     * @description suma al racional actual, el racional que recibe como parámetro
     */
    public function sumar(Racional $n1) {
        $den = ($this->den * $n1->getDen());
        $num = ($this->den * $n1->getNum() + $this->num * $n1->getDen());
 
        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 realizo como un método estático lo que estaría haciendo es sumar dos objetos Racionales , devolviendo un nuevo objeto de tipo Racional Vamos
    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