Diferencia entre revisiones de «Plantilla:PHP/Estatico»
De WikiEducator
(→Métodos static Vs no static) |
|||
| Línea 1: | Línea 1: | ||
| − | ====Métodos ''static'' | + | <div id=parrafo> |
| − | *En | + | ==== Métodos ''static'' vs ''no static'' ==== |
| − | *Cuando un | + | * En PHP, la idea de '''static''' es igual que en cualquier lenguaje de programación orientado a objetos. |
| − | *Como no | + | * 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 '''::'''. | ||
| + | |||
{{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 | + | ;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 | + | * 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 | + | * Tendrá un método '''generarFactura()''' que mostrará: |
| − | #Factura de XXXX ( | + | # Factura de XXXX (el nombre se recibirá como argumento). |
| − | #Fecha ( | + | # Fecha (atributo). |
| − | #Importe | + | # Importe base (atributo). |
| − | #IVA aplicado ( | + | # IVA aplicado (constante de la clase). |
| − | #Total bruto ( | + | # Total bruto (importe base más el IVA). |
| − | *En el index crearemos 5 facturas, visualizaremos el número de facturas, | + | * 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 | + | {{plegable|hide|Posible solución| |
<source lang=php> | <source lang=php> | ||
<?php | <?php | ||
| − | //Factura.php | + | // Factura.php |
class Factura | class Factura | ||
{ | { | ||
| Línea 30: | Línea 32: | ||
private static $numeroFacturas = 0; | private static $numeroFacturas = 0; | ||
| − | // Atributos de | + | // Atributos de instancia |
private $importe_bruto; | private $importe_bruto; | ||
private $fecha; | private $fecha; | ||
| Línea 39: | Línea 41: | ||
$this->importe_bruto = $importe_bruto; | $this->importe_bruto = $importe_bruto; | ||
$this->fecha = $fecha; | $this->fecha = $fecha; | ||
| − | self::$numeroFacturas++; // Incrementa el | + | self::$numeroFacturas++; // Incrementa el contador al crear una nueva factura |
} | } | ||
| Línea 45: | Línea 47: | ||
public function __destruct() | public function __destruct() | ||
{ | { | ||
| − | self::$numeroFacturas--; // Decrementa el | + | self::$numeroFacturas--; // Decrementa el contador al eliminar una factura |
} | } | ||
| Línea 54: | Línea 56: | ||
$totalBruto = $this->importe_bruto + $ivaAplicado; | $totalBruto = $this->importe_bruto + $ivaAplicado; | ||
| − | echo "Factura de $nombreCliente | + | echo "Factura de $nombreCliente<br/>"; |
| − | echo "Fecha: {$this->fecha} | + | echo "Fecha: {$this->fecha}<br/>"; |
| − | echo "Importe base: {$this->importe_bruto} € | + | echo "Importe base: {$this->importe_bruto} €<br/>"; |
| − | echo "IVA aplicado (" . (self::IVA * 100) . "%): {$ivaAplicado} € | + | echo "IVA aplicado (" . (self::IVA * 100) . "%): {$ivaAplicado} €<br/>"; |
| − | echo "Total bruto: {$totalBruto} € | + | echo "Total bruto: {$totalBruto} €<br/>"; |
| − | echo "----------------------------- | + | echo "-----------------------------<br/>"; |
} | } | ||
| Línea 69: | Línea 71: | ||
} | } | ||
| − | + | // index.php | |
| − | //index.php | + | |
| − | + | ||
// Crear 5 facturas | // Crear 5 facturas | ||
| Línea 81: | Línea 81: | ||
// Visualizar el número de facturas | // Visualizar el número de facturas | ||
| − | echo "Número de facturas actuales: " . Factura::obtenerNumeroFacturas() . " | + | echo "Número de facturas actuales: " . Factura::obtenerNumeroFacturas() . "<br/><br/>"; |
// Eliminar dos facturas | // Eliminar dos facturas | ||
| Línea 88: | Línea 88: | ||
// Visualizar el número de facturas tras eliminar dos | // Visualizar el número de facturas tras eliminar dos | ||
| − | echo "Número de facturas tras eliminar: " . Factura::obtenerNumeroFacturas() . " | + | echo "Número de facturas tras eliminar: " . Factura::obtenerNumeroFacturas() . "<br/><br/>"; |
// Imprimir las facturas restantes | // Imprimir las facturas restantes | ||
$factura1->generarFactura("Cliente 1"); | $factura1->generarFactura("Cliente 1"); | ||
$factura2->generarFactura("Cliente 2"); | $factura2->generarFactura("Cliente 2"); | ||
| − | + | ?> | |
| − | + | ||
</source> | </source> | ||
| − | |||
}} | }} | ||
| − | |||
}} | }} | ||
| − | |||
| − | * | + | * 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: | ||
[[Archivo:estatico1.png|center|400px]] | [[Archivo:estatico1.png|center|400px]] | ||
| − | *Cuando añadimos un elemento estático, solo habrá una copia en memoria | + | * 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 | + | |
| + | * 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 | ||
| − | |||
| − | |||
| − | |||
| − | |||
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 | |
| − | + | ||
require_once "Racional.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>"; | |
| − | + | ||
| − | + | ||
| − | + | ||
?> | ?> | ||
</source> | </source> | ||
| − | *La salida | + | |
| + | * La salida: | ||
[[Archivo:AppEstatica1.png]] | [[Archivo:AppEstatica1.png]] | ||
| − | *Vamos a implementar las operaciones | + | --- |
| − | + | ||
| + | * 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 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); | |
| − | + | $r2 = new Racional(9,4); | |
| − | + | ||
| − | + | ||
| − | + | $r3 = $r1->sumar($r2); | |
| − | + | echo "$r1 + $r2 = $r3"; | |
</source> | </source> | ||
| − | *La salida | + | |
| + | * La salida: | ||
[[Archivo:sumarNoEstatico.png]] | [[Archivo:sumarNoEstatico.png]] | ||
| − | *Si la operación la | + | --- |
| + | |||
| + | * 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){ | |
| − | + | $n = $r1->getNum() * $r2->getDen() + $r1->getDen() * $r2->getNum(); | |
| − | + | $d = $r1->getDen() * $r2->getDen(); | |
| − | + | return new Racional($n, $d); | |
| + | } | ||
</source> | </source> | ||
| − | *Para usarlo | + | * Para usarlo: |
| + | |||
<source lang=php> | <source lang=php> | ||
| − | + | $r1 = new Racional(7,6); | |
| − | + | $r2 = new Racional(9,4); | |
| − | + | ||
| − | + | ||
| − | + | $r3 = Racional::sum_static($r1, $r2); | |
| − | + | 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 ::.
|
- 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:






