Categoría: PHP
Ejercicio herencia
Arreglar la siguiente jerarquía de herencias para que incorpore constructores en las clases derivadas y funcione el área:
abstract class Figuras { abstract function area(); } abstract class Bidimensional extends Figuras{ } class Circulo extends Bidimensional{ private $radio; } class Triangulo extends Bidimensional{ private $base; private $altura; } abstract class Tridimensional extends Figuras{ } class Cubo extends Tridimensional{ private $lado; } class Esfera extends Tridimensional{ private $radio }
Propiedades estáticas
class Estaticas { static public $iva; public $nombre; } $a=new Estaticas(); $b=new Estaticas(); $c=new Estaticas(); Estaticas::$iva=.21; $a->nombre="Ana"; $b->nombre="Eva"; $c->nombre="Rosa"; var_dump($a::$iva); var_dump($b::$iva); var_dump($c::$iva); class Producto{ static private $iva=.21; public $nombre; public $precio; function __construct($nombre,$precio) { $this->nombre=$nombre; $this->precio=$precio; } function PVP(){ return $this->precio*(1+$this::$iva); } } $manzana=new Producto("Manzana",2); echo $manzana->PVP(); $uvas=new Producto("Uvas",3.5); echo $uvas->PVP();
Clases abstractas y polimorfismo
<?php abstract class Figuras { abstract function dibujar(); function saludo(){ echo "Hola"; } } abstract class Bidimensional extends Figuras{ } class Circulo extends Bidimensional{ function dibujar(){ echo "Estoy dibujando un círculo"; } } class Hexagono extends Bidimensional{ function dibujar(){ echo "Dibujando hexágono"; } } abstract class Tridimensional extends Figuras{ } class Cubo extends Tridimensional{ function dibujar(){ echo "Esto es un cubo"; } } class Piramide extends Tridimensional{ function dibujar(){ echo "Porámide"; } } $figuras=[new Circulo(),new Piramide(), new Cubo(),new Hexagono(),new Circulo()]; foreach ($figuras as $figura){ $figura->dibujar(); }
Ejercicio Producto
Vamos a definir una clase ‘Producto’ con las propiedades nombre y precio, ambas obligatorias en el constructor.
Vamos a crear una función PVP que nos devuelve el precio mas el 21% de iva.
De ahí derivamos la clase Oferta que la función PVP es la misma que en el anterior pero aplicando un 10% de descuento.
Ejercicio clases y herencia
Vamos a crear la clase Persona con las propiedades nombre (obligatoria) y DNI. Crearemos un método ‘saludo’ que nos devuelva un string con ‘Hola’+nombre
De ahí vamos a derivar la clase ‘caballero’ que tendrá la propiedad ‘tratamiento’ (obligatoria) . Sobre escribiremos el método ‘saludo’ para que devuelva ‘Hola’+tratamiento+nombre.
Añadiremos la propiedad renta de tipo int.
Vamos a derivar la clase ‘plebeyo’. Sobre escribiremos el método saludo para que devuelva ‘Hola’+nombre+’¿Qué pasa?’
Poned los getters y setters que hagan falta, pero que sea obligatorio poner un valor.
class Persona { private $nombre; private $dni; function __construct($nombre) { $this->nombre = $nombre; } function saludo() { return "Hola " . $this->nombre; } function __get($name) { return $this->$name; } function __set($name, $value) { if (empty($value)) { throw new Exception("La propiedad $name no puede estar vacía"); } $this->$name = $value; } } class Caballero extends Persona{ protected $tratamiento; protected $renta; function __construct($nombre,$tratamiento) { parent::__construct($nombre); $this->__set("tratamiento",$tratamiento); } function saludo(){ return "Hola ".$this->tratamiento." ".$this->nombre; } } class Plebeyo extends Persona{ function saludo(){ return parent::saludo()." ¿Qué pasa?"; } }
Ejemplo herencia
<?php /** * Description of Herencia * * @author incid */ class Empleado { private $nombre; function __construct($nombre) { $this->nombre = $nombre; } function __get($name) { return $this->$name; } function __set($name, $value) { if (empty($value)) { throw new Exception("No se puede poner valores vacíos"); } $this->$name = $value; } function saludo() { echo "Hola"; } } class Gerente extends Empleado { private $bonus; function __construct($nombre, $bonus) { parent::__construct($nombre); $this->__set("bonus", $bonus); } function saludo() { parent::saludo(); echo "Los gerentes saludan así: Holi"; } function despedida() { echo "Adios muy buenas"; } } class Gerente2 extends Empleado { private $bonus; function __construct($nombre, $bonus) { parent::__construct($nombre); $this->setBonus($bonus); } function getBonus() { return $this->bonus; } function setBonus($bonus) { $this->bonus = $bonus; } } $juan = new Empleado("Juan Pérez"); $juan->nombre = "Pepito"; $juan->saludo(); //$juan->despedida(); //ERROR var_dump($juan); $eva = new Gerente("Eva Pi", 400); $eva->saludo(); $eva->despedida(); //$eva->bonus=0; var_dump($eva);
Ejercicio clases constructor y getters mágicos
Vamos a crear la clase ‘Cliente’ con las siguientes propiedades privadas:
Nombre
NIF
Pais
Importe
Vamos a crear un constructor que pida obligatoriamente el Nombre y el NIF y vamos a crear getters y setters mágicos.
Los valores no pueden estar vacíos, el NIF tiene que empezar por una letra y tener una longitud de 9 caracteres y el importe no puede ser negativo.
Probad todas las características.
class Cliente { private $nombre; private $nif; private $pais; private $importe; function __construct($nombre, $nif) { $this->nombre = $nombre; $this->nif = $nif; } function __get($name) { if (!property_exists($this, $name)) { throw new Exception("La propiedad $name no existe"); } return $this->$name; } function __set($name, $value) { if (!property_exists($this, $name)) { throw new Exception("La propiedad $name no existe"); } if (empty($value)) { throw new Exception("La propiedad $name no puede estar vacía"); } if($name=="importe" && $value<0){ throw new Exception("El importe no puede ser negativo"); } if($name=="nif" && $this->checkNif($value)) { throw new Exception("NIF incorrecto"); } $this->$name = $value; } private function checkNif($nif){ return (strlen($nif)!=9 || strtoupper(substr($nif, 0,1))<"A" || strtoupper(substr($nif, 0,1))>"Z"); } } $pepe=new Cliente("Pepe", "B61235712"); $pepe->nif="B12345678"; $pepe->importe=500; echo $pepe->nombre; var_dump($pepe);
Combinación setters/getters mágicos y estilo Java
class Libro { private $titulo; private $autor; private $paginas; function getTitulo() { return $this->titulo; } function getAutor() { return $this->autor; } function getPaginas() { return $this->paginas; } function setTitulo($titulo) { $this->titulo = $titulo; } function setAutor($autor) { $this->autor = $autor; } function setPaginas($paginas) { $this->paginas = $paginas; } function __construct($titulo) { $this->__set("titulo",$titulo); } function __get($name) { $metodo="get$name"; if (!method_exists($this, $metodo)) { throw new Exception("La propiedad $name no existe"); } return $this->$metodo(); } function __set($name, $value) { $metodo="set$name"; if (!method_exists($this, $metodo)) { throw new Exception("La propiedad $name no existe"); } if (empty($value)) { throw new Exception("El valor $name no puede estar vacío"); } if ($name == "paginas" && ($value < 10 || $value > 1000)) { throw new Exception("Páginas entre 10 y 1000"); } $this->$metodo($value); } }
Getters/Setters mágicos
class Libro { private $titulo; private $autor; private $paginas; function __construct($titulo) { $this->titulo = $titulo; } function __get($name) { if (!property_exists($this, $name)) { throw new Exception("La propiedad $name no existe"); } return $this->$name; } function __set($name, $value) { if (!property_exists($this, $name)) { throw new Exception("La propiedad $name no existe"); } if (empty($value)) { throw new Exception("El valor $name no puede estar vacío"); } if ($name == "paginas" && ($value < 10 || $value > 1000)) { throw new Exception("Páginas entre 10 y 1000"); } $this->$name = $value; } }