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;
}
}