Diferencia entre revisiones de «Plantilla:PHP/Estatico»

De WikiEducator
Saltar a: navegación, buscar
(Métodos static Vs no static)
 
(2 revisiones intermedias por el mismo usuario no mostrado)
Línea 1: Línea 1:
====Métodos ''static'' Vs ''no static''====
+
<div id=parrafo>
*En php la idea de '''''static''''', es igual que en cualquier lenguaje de programación.
+
==== Métodos ''static'' vs ''no static'' ====
*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.
+
* En PHP, la idea de '''static''' es igual que en cualquier lenguaje de programación orientado a objetos.
*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.
+
* 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 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
+
* 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 '''::'''.
 +
 
 
{{MRM_Actividad|Title=Usar constantes y elementos estáticos|
 
{{MRM_Actividad|Title=Usar constantes y elementos estáticos|
;Como ejemplo vamos a implementar una Factura y utilizarlas con los siguientes requisitos
+
;Como ejemplo, vamos a implementar una clase '''Factura''' con los siguientes requisitos:
*La factura tendrá una constante llamada IVA
+
* La factura tendrá una constante llamada '''IVA'''. 
*Tendremos un atributo estáticos que especificará el número de facturas que tengo
+
* Tendremos un atributo estático que especificará el número de facturas creadas. 
*Los atributos de factura serán importe_bruto y fecha
+
* Los atributos de cada factura serán '''importe_bruto''' y '''fecha'''. 
*Tendrá un método generar factura que nos visualizará una factura con los siguientes datos:
+
* Tendrá un método '''generarFactura()''' que mostrará:
#Factura de XXXX (El nombre lo recibirá como argumento)
+
# Factura de XXXX (el nombre se recibirá como argumento)
#Fecha (La fecha de la factura que es un atributo)
+
# Fecha (atributo)
#Importe (El importe base que es un atrubuto)
+
# Importe base (atributo)
#IVA aplicado (El valor de la constante iva)
+
# IVA aplicado (constante de la clase)
#Total bruto (El importe base más el iva)
+
# Total bruto (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
+
* 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.
  
{{plegable|hide|Posible solucion|
+
{{plegable|hide|Posible solución|
 
<source lang=php>
 
<source lang=php>
</source>
+
<?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 instancia
 +
    private $importe_bruto;
 +
    private $fecha;
 +
 +
    // Constructor
 +
    public function __construct($importe_bruto, $fecha)
 +
    {
 +
        $this->importe_bruto = $importe_bruto;
 +
        $this->fecha = $fecha;
 +
        self::$numeroFacturas++; // Incrementa el contador al crear una nueva factura
 +
    }
 +
 +
    // Destructor
 +
    public function __destruct()
 +
    {
 +
        self::$numeroFacturas--; // Decrementa el contador al eliminar una factura
 +
    }
 +
 +
    // 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<br/>";
 +
        echo "Fecha: {$this->fecha}<br/>";
 +
        echo "Importe base: {$this->importe_bruto} €<br/>";
 +
        echo "IVA aplicado (" . (self::IVA * 100) . "%): {$ivaAplicado} €<br/>";
 +
        echo "Total bruto: {$totalBruto} €<br/>";
 +
        echo "-----------------------------<br/>";
 +
    }
 +
 +
    // Método estático para obtener el número de facturas actuales
 +
    public static function obtenerNumeroFacturas()
 +
    {
 +
        return self::$numeroFacturas;
 +
    }
 +
}
 +
 +
// index.php
 +
 +
// 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() . "<br/><br/>";
 +
 +
// 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() . "<br/><br/>";
 +
 +
// Imprimir las facturas restantes
 +
$factura1->generarFactura("Cliente 1");
 +
$factura2->generarFactura("Cliente 2");
 +
?>
 +
</source>
 
}}
 
}}
*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
+
 
[[Archivo:estatico1.png|center|600px]]
+
* Es muy común tener un atributo '''static''' que cuente cuántos objetos existen de una clase.
*Cuando añadimos un elemento estático, solo habrá una copia en memoria y es compartida por todos los objetos de la clase
+
 
 +
* En la siguiente imagen se ilustra cómo al crear varios objetos, cada uno se instancia por separado en memoria:
 +
[[Archivo:estatico1.png|center|400px]]
 +
 
 +
* Cuando añadimos un elemento estático, solo habrá '''una copia''' en memoria, compartida por todos los objetos de la clase:
 
[[Archivo:estatico2.png|center|600px]]
 
[[Archivo:estatico2.png|center|600px]]
*Vemos el código y como se accede al elemento
+
 
 +
* Vemos el código y cómo se accede al elemento estático:
  
 
<source lang=php>
 
<source lang=php>
 
<?php
 
<?php
 
class Racional {
 
class Racional {
   
+
     static public $cuenta_racionales = 0;
     static public $cuenta_racionales=0;
+
 
 +
    private $num; // Numerador
 +
    private $den; // Denominador
  
    //atributos
 
    private $num; //el numerador
 
    private $den; //el denominador
 
    //......
 
 
     public function __construct($num, $den) {
 
     public function __construct($num, $den) {
 
         self::$cuenta_racionales++;
 
         self::$cuenta_racionales++;
     .......
+
        $this->num = $num;
 
+
        $this->den = $den;
 +
     }
 +
}
 +
?>
 
</source>
 
</source>
*El uso
 
<source lang = php>
 
<?php
 
  
/*  
+
* El uso:
* To change this license header, choose License Headers in Project Properties.
+
 
* To change this template file, choose Tools | Templates
+
<source lang=php>
* and open the template in the editor.
+
<?php
*/
+
 
require_once "Racional.php";
 
require_once "Racional.php";
   
+
 
   
+
$r1 = new Racional(5,4);
    $r1 = new Racional(5,4);
+
$r2 = new Racional(5,4);
    $r2 = new Racional(5,4);
+
$r3 = new Racional(5,4);
    $r3 = new Racional(5,4);
+
 
    echo "<h1>Ahora tenemos ". Racional ::$cuenta_racionales." objetos racionales</h1>";
+
echo "<h1>Ahora tenemos " . Racional::$cuenta_racionales . " objetos Racional</h1>";
    $r4 = new Racional(5,4);
+
 
    $r5 = new Racional(5,4);
+
$r4 = new Racional(5,4);
    echo "<h1>Ahora tenemos" .Racional::$cuenta_racionales."</h1>";
+
$r5 = new Racional(5,4);
    $r6 = new Racional(5,4);
+
 
    $r7 = new Racional(5,4);
+
echo "<h1>Ahora tenemos " . Racional::$cuenta_racionales . " objetos Racional</h1>";
   
+
 
    //Observa (y esto es de php ) que puedo acceder a un elemento estático
+
$r6 = new Racional(5,4);
    //A traves del nombre del objeto
+
$r7 = new Racional(5,4);
    echo "<h1>Ahora tenemos" .Racional::$cuenta_racionales."</h1>";
+
 
    echo "<h1>Podemos acceder con los objtetos </h2>";
+
// Observa (y esto es propio de PHP) que puedo acceder a un elemento estático
    echo "<h1>Según r1 tenemos " .$r1::$cuenta_racionales."</h1>";
+
// tanto a través del nombre de la clase como desde un objeto
    echo "<h1>Según r2 tenemos " .$r2::$cuenta_racionales."</h1>";
+
echo "<h2>Podemos acceder con los objetos:</h2>";
    echo "<h1>Según r3 tenemos " .$r3::$cuenta_racionales."</h1>";
+
echo "<h3>Según r1: " . $r1::$cuenta_racionales . "</h3>";
    echo "<h1>Según r4 tenemos " .$r4::$cuenta_racionales."</h1>";
+
echo "<h3>Según r2: " . $r2::$cuenta_racionales . "</h3>";
    echo "<h1>Según La clase tenemos " .Racional::$cuenta_racionales."</h1>";
+
echo "<h3>Según r3: " . $r3::$cuenta_racionales . "</h3>";
   
+
echo "<h3>Según la clase: " . Racional::$cuenta_racionales . "</h3>";
   
+
   
+
   
+
 
?>
 
?>
 
</source>
 
</source>
*La salida
+
 
 +
* La salida:
 
[[Archivo:AppEstatica1.png]]
 
[[Archivo:AppEstatica1.png]]
  
*Vamos a implementar las operaciones en un Racional.
+
---
Primero como siempre conviene recordar cómo se hacen
+
 
 +
* Vamos a implementar las operaciones con números racionales.
 +
Antes, recordemos las operaciones básicas:
 +
 
 
;Sumar
 
;Sumar
[[Archivo:suma_racionales.png]]<br />
+
[[Archivo:suma_racionales.png]]<br/>
 
;Restar
 
;Restar
[[Archivo:resta_racionales.png]]<br />
+
[[Archivo:resta_racionales.png]]<br/>
 
;Multiplicar
 
;Multiplicar
[[Archivo:mult_racionales.png]]<br />
+
[[Archivo:mult_racionales.png]]<br/>
 
;Dividir
 
;Dividir
[[Archivo:division_racional.png]]<br />
+
[[Archivo:division_racional.png]]<br/>
*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
+
<source lang=php>
+
/**
+
    *
+
    * @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);
+
* 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).
 +
 
 +
<source lang=php>
 +
/**
 +
* 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);
 +
}
 
</source>
 
</source>
*Para usarlo
+
 
 +
* Para usarlo:
 +
 
 
<source lang=php>
 
<source lang=php>
....
+
$r1 = new Racional(7,6);
$r1 = new Racional(7,6);
+
$r2 = new Racional(9,4);
$r2 = new Racional(9,4);
+
 
+
  
$r3 = $r1->sumar($r2)
+
$r3 = $r1->sumar($r2);
echo "$r1 + $r2 = $r3);
+
echo "$r1 + $r2 = $r3";
 
</source>
 
</source>
*La salida
+
 
 +
* La salida:
 
[[Archivo:sumarNoEstatico.png]]
 
[[Archivo: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
+
---
 +
 
 +
* Si la operación la realizamos como un método '''estático''', estaremos sumando '''dos objetos Racional''' y devolviendo un nuevo objeto como resultado:
 +
 
 
<source lang=php>
 
<source lang=php>
    static public function sum_static (Racional $r1, Racional $r2){
+
static public function sum_static(Racional $r1, Racional $r2){
        $n = $r1->getNum()*$r2->getDen()+$r1->getDen()*$r2->getNum();
+
    $n = $r1->getNum() * $r2->getDen() + $r1->getDen() * $r2->getNum();
        $d = $r1->getDen()*$r2->getDen();
+
    $d = $r1->getDen() * $r2->getDen();
        return new Racional ($n, $d);
+
    return new Racional($n, $d);
 +
}
 
</source>
 
</source>
  
*Para usarlo
+
* Para usarlo:
 +
 
 
<source lang=php>
 
<source lang=php>
....
+
$r1 = new Racional(7,6);
$r1 = new Racional(7,6);
+
$r2 = new Racional(9,4);
$r2 = new Racional(9,4);
+
 
+
  
$r3 = Racional::sum_static($r1,$r2);
+
$r3 = Racional::sum_static($r1, $r2);
echo "$r1 + $r2 = $r3);
+
echo "$r1 + $r2 = $r3";
 
</source>
 
</source>
*La salida
+
 
 +
* La salida:
 
[[Archivo:SumarEstatico.png]]
 
[[Archivo:SumarEstatico.png]]
 +
</div>

Última revisión de 05:53 7 nov 2025

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