Diferencia entre revisiones de «Plantilla:PHP/Herencia»
De WikiEducator
(→Herencia) |
|||
Línea 1: | Línea 1: | ||
+ | ====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 | ||
+ | |||
+ | *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]] | ||
+ | *Cuando añadimos un elemento estático, solo habrá una copia en memoria y es compartida por todos los objetos de la clase | ||
+ | [[Archivo:estatico2.png]] | ||
+ | *Vemos el código y como se accede al elemento | ||
+ | |||
+ | <source lang=php> | ||
+ | <?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++; | ||
+ | ....... | ||
+ | |||
+ | </source> | ||
+ | *El uso | ||
+ | <source lang = php> | ||
+ | <?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 salido | ||
+ | [[Archivo:AppEstatica1.png]] | ||
+ | |||
+ | *Veamos un ejemplo | ||
+ | |||
+ | |||
+ | |||
===Herencia=== | ===Herencia=== | ||
*La herencia es un mecanismo de programación que me permite crear una jerarquía en los componentes software, que se pueden ir especializando | *La herencia es un mecanismo de programación que me permite crear una jerarquía en los componentes software, que se pueden ir especializando |
Revisión de 22:25 8 mar 2018
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
- 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
- Cuando añadimos un elemento estático, solo habrá una copia en memoria y es compartida por todos los objetos de la clase
- 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 salido [[Archivo:AppEstatica1.png]] *Veamos un ejemplo ===Herencia=== *La herencia es un mecanismo de programación que me permite crear una jerarquía en los componentes software, que se pueden ir especializando Se puede definir una clase con ciertas características (atributos, métodos) *Posteriormente puedo definir otra clase a partir de la ya existente, quedándo implícitamente los atributos y métodos como también parte de su estructura o composición *Es una característica muy natural (p.e Personas (médicos y bailarines) vehículos (Terrestres (coche, moto) Acuáticos (barco, lancha)) [[Archivo:Herencia.png]] *Es una forma de obtener características comunes por separado y luego especializar evitando redundancias *Facilita la reusabilidad y adaptación *Vemos dos ejemplos para explicar de forma empírica este concepto {{MRM_Ejemplo|Title= Herencia: gestión personal ambulatorio| *Se pide gestionar un ambulatorio. *Para ello vamos a hacer sólo el diagrama de clases y su implementación. *Lo hacemos a nivel básico (sin entrar en detalles). *Tras realizar un análisis se determina que se pretende gestionar: ;los datos de los empleados y anotar las acciones básicas que realizan. *Encontramos los siguientes elementos que especificamos como clases ;Conserjes ;Enfermeras ;Médicas Las propiedades (atributos) y métodos de cada clase se especifican en los siguientes diagramas de clases <gallery> Image:claseConserje.png|Clase Conserje Image:claseEnfermera.png|Clase Enfermera Image:claseMedica.png|Clase Medicas </gallery> *Claramente vemos que todos ellos tienen varios elementos en común. *Esto nos permite crear una clases genérica que por ejemplo podemos llamar '''''personalAmbulatorio''''' *Posteriormente creamos una especialización de '''''personalAmbulatorio''''' con los elementos particulares *El digrama podría quedar [[Imagen:JerarquiaPersonaAmbulatorio.png|center|400px]]<br /> <font size<nowiki>=</nowiki>5 color<nowiki>=</nowiki>red>[[Usuario:ManuelRomero/ProgramacionWeb/php/POO/Herencia/EjemploAmbulatorio | Posible Solución]]</font> <hr /> }} ====clases abstractas==== *Es una situación particular que se presentan en muchas jerarquías *Cuando realizamos jerarquías muchas veces encontramos métodos comunes a varias clases. Esto implicaría que ese método sería un método de una superclase o clase padre de la que luego se heredará *Pero puede ocurrir que aunque el concepto del método es común a todas las clases,la forma de implementarla es particular en cada una de ellas. *En este caso, la forma correcta de proceder, es especificar el método el la clase superior, e implementar el código en cada una de las clases que derivo. *El método especificado en la clase superior sería un método sin código, conocido como un método abstracto, y la clase dónde se especifica pasa a ser abstracta {{MRM_Definicion|Title= Clase Abstracta| Es aquella clase que tiene un método o más abstracto}} {{MRM_Definicion|Title=Método Abstracto| *Es un método que no tiene código asociado *El código se implementará en las clases derivadas }} {{MRM_Puntos clave| ;Nunca podremos instanciar un objeto de una clase abstracta *Esto es normal, ya que ese objeto no tendría instrucciones para su/s método/s abstracto/s }} *Vamos a platear un ejemplo {{MRM_Ejemplo|Title=App de Geometría| ;Gestionar figuras geométricas de tipo triángulo, cuadrado y Rectángulo. *De ellas queremos conocer: #el número de lados. #calcular el área. #dibujar el polígono (Esto insertaremos un pequeño código de javascript de uso básico del canvas #conocer el número de lados del polígono. *Realizamos los siguientes clases ;Clase Polígono <font size<nowiki>=</nowiki>5 color<nowiki>=</nowiki>red>[[Usuario:ManuelRomero/ProgramacionWeb/php/POO/Herencia/EjemploGeometria/Poligono | Descripción de la Clase Polígono]]</font> <hr /> ;Clase Rectángulo <font size<nowiki>=</nowiki>5 color<nowiki>=</nowiki>red>[[Usuario:ManuelRomero/ProgramacionWeb/php/POO/Herencia/EjemploGeometria/Rectangulo | Descripción de la Clase Rectángulo]]</font> <hr /> ;Clase Cuadrado <font size<nowiki>=</nowiki>5 color<nowiki>=</nowiki>red>[[Usuario:ManuelRomero/ProgramacionWeb/php/POO/Herencia/EjemploGeometria/Cuadrado | Descripción de la Clase Cuadrado]]</font> <hr /> ;Clase Triangulo <font size<nowiki>=</nowiki>5 color<nowiki>=</nowiki>red>[[Usuario:ManuelRomero/ProgramacionWeb/php/POO/Herencia/EjemploGeometria/Triangulo | Descripción de la Clase Triángulo]]</font> <hr /> ;Uso de esta aplicación *Un posible código index.php que lo único que hace es crear objetos y visulizar su área y dibujarlos <source lang=php> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> </head> <body> <?php spl_autoload_register(function ($clase){ require "$clase.php"; }); $triangulo = new Triangulo(200,300); $cuadrado = new Cuadrado(200); $rectangulo = new Rectangulo(200,100); echo "<h4>Triángulo, ". Poligono::lados($triangulo)." y área ". $triangulo->area()." px<sup>2</sup></h4>"; echo "<h4>Cuadrado, ". Poligono::lados($cuadrado)." y área ". $cuadrado->area()." px<sup>2</sup></h4>"; echo "<h4>Rectángulo, ". Poligono::lados($rectangulo)." y área ". $rectangulo->area()." px<sup>2</sup></h4>"; echo $triangulo->dibuja(); echo $cuadrado->dibuja(); echo $rectangulo->dibuja(); ?> </body> </html>
- Resultado de su ejecución