<?php //Definiendo la clase //Esto es el plano de la casa //No está construída class Producto { public $nombre; public $precio; function __construct($nombre, $precio = 100) { if (empty($nombre)) { throw new Exception("El nombre no puede estar vacío, de qué vas?"); } $this->nombre = $nombre; $this->precio = $precio; } //Creo una función (se llaman métodos de la clase) function PVP() { return $this->precio * 1.21; } function rebajas() { return $this->nombre . " ¡Ahora de rebajas!!!"; } } try { $tele = new Producto("Televisión LCD 50 pulgadas", 1000); $sofa = new Producto("Sofá muy bonito para descansar"); $bien = new Producto(""); //$mal=new Producto(); var_dump($sofa); } catch (Exception $ex) { echo $ex->getMessage(); }
Etiqueta: oop
Ejercicios OOP
Crear una clase empleado con las propiedades nombre, dni y sueldo.
Añadir el método verEmpleado() que nos devuelva un string con los valores de esas propiedades concatenadas.
Añadir otro método sueldoNeto() que nos devuelva el sueldo multiplicado por 0.85
Crear una clase Departamento con la propiedad nombre y numEmpleados.
Añadir el método overBooking() que nos devuelva true si tiene más de 20 empleados.
Crear una clase hipoteca con las siguientes propiedades: importe, tipoInteres y plazo (en años)
Añadir un método meses() que nos devuelva el plazo en meses (el plazo * 12)
Para nota: calcular el importe que hay que pagar cada mes con esta fórmula:
$m=($deuda*$interes*(pow((1+$interes),($anos*12))))/((pow((1+$interes),($anos*12)))-1);
<?php class Empleado { public $nombre; public $dni; public $sueldo; function verEmpleado() { return $this->nombre . " - " . $this->dni . " - " . $this->sueldo; } function sueldoNeto() { return $this->sueldo * 0.85; } } $pepe = new Empleado(); $pepe->nombre = "José Pérez"; $pepe->dni = "12134823"; $pepe->sueldo = 2000; echo $pepe->verEmpleado(); class Hipoteca { public $importe; public $tipoInteres; public $plazo; function meses() { return $this->plazo * 12; } function pagoMes(){ $deuda=$this->importe; $interes=$this->tipoInteres/12; $anos=$this->plazo; $m=($deuda*$interes*(pow((1+$interes),($anos*12))))/((pow((1+$interes),($anos*12)))-1); return round($m,2); } } $h=new Hipoteca(); $h->importe=100000; $h->plazo=30; $h->tipoInteres=.03; echo "<br>"; echo $h->pagoMes();
Ejemplos objetos PHP
<?php //Definiendo la clase //Esto es el plano de la casa //No está construída class Producto { public $nombre; public $precio; //Creo una función (se llaman métodos de la clase) function PVP() { return $this->precio * 1.21; } function rebajas() { return $this->nombre . " ¡Ahora de rebajas!!!"; } } //Aquí hago la casa. Creando una instancia de la clase. //Creando un objeto $tele = new Producto(); $tele->nombre = "Televisión 45 pulgadas"; $tele->precio = 500; print_r($tele); //La uso en el objeto echo $tele->PVP(); $tele->precio = 1000; echo $tele->PVP(); echo $tele->rebajas(); //Vamos a crear un producto 'Sofá' //De nombre 'Sofá cama color crema' y de precio 300 $sofa = new Producto(); $sofa->nombre = "Sofá cama color crema"; $sofa->precio = 300;
Clase Aula con get y set
class Aula { //propiedades nombre de tipo string y capacidad de tipo entero privadas //Crear constructor con nombre obligatorio y capacidad opcional (por defecto 15) //Crear getters y setters: El nombre no puede estar vacío y la capacidad entre 10 y 100 private $nombre; private $capacidad; function __construct(string $nombre, int $capacidad = 15) { $this->setNombre($nombre); $this->setCapacidad($capacidad); } function getNombre() { return $this->nombre; } function getCapacidad() { return $this->capacidad; } function setNombre(string $nombre) { if (!empty($nombre)) { $this->nombre = $nombre; } else { throw new Exception('El nombre no puede estar vacío'); } } function setCapacidad(int $capacidad) { if ($capacidad < 10 || $capacidad > 100) { throw new Exception('Capacidad entre 10 y 100'); } else { $this->capacidad = $capacidad; } } } try { $a = new Aula("Nombre"); $a->setCapacidad(500); } catch (Exception $ex) { echo $ex->getMessage() . " en la línea " . $ex->getLine(); }
Ejemplo herencia en PHP
class Producto { public $nombre; public $precio; function __construct($nombre, $precio = 0) { $this->nombre = $nombre; $this->precio = $precio; } function resumen() { return $this->nombre . " " . $this->precio; } function pvp() { return $this->precio * 1.21; } } class Cd extends Producto { public $longitud; } $nuevoCd=new Cd('Reggeton mix'); $nuevoCd->longitud=90; $nuevoCd->precio=20; var_dump($nuevoCd); //Crear una clase libro con propiedad páginas que derive de producto class Libro extends Producto{ public $paginas; //Sobreescribir el constructor añadiendo el parámetro páginas function __construct($nombre, $paginas, $precio = 0) { parent::__construct($nombre, $precio); $this->paginas=$paginas; } //Sobreescribimos el método de la clase madre function resumen(){ //Invocamos el método de la clase madre return parent::resumen()." ".$this->paginas; } } class LibroAntiguo extends Libro{ public $anyo; function __construct($nombre, $paginas,$anyo, $precio = 0) { parent::__construct($nombre, $paginas, $precio); $this->anyo=$anyo; } } $nuevoLibro=new Libro('El Quijote',400); echo $nuevoLibro->resumen(); $antiguo=new LibroAntiguo('Quijote',500,1754); echo $antiguo->resumen();
Clase genérica BD
class BD { static $server = "localhost"; static $user = "root"; static $password = ""; static $database = "sakila"; private $table; private $idField; private $fields; private $showFields; static private $conn; public function __construct($table, $idField, $fields = "", $showFields = "") { $this->table = $table; $this->idField = $idField; $this->fields = $fields; $this->showFields = $showFields; self::conectar(); } static function conectar() { try { self::$conn = new PDO("mysql:host=" . self::$server . ";dbname=" . self::$database, self::$user, self::$password, [PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8'"]); self::$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } catch (Exception $ex) { echo $ex->getMessage(); } } function __get($name) { if (property_exists($this, $name)) { return $this->$name; } } function __set($name, $value) { if (property_exists($this, $name) && !empty($value)) { $this->$name = $value; } else { throw new Exception("Error: datos incorrectos"); } } function getAll($condicion = "") { $where = ""; if (!empty($condicion)) { //Aquí tendré que hacer algo!!! $where = " where 1=1 "; foreach ($condicion as $clave => $valor) { $where .= " and " . $clave . " = '" . $valor . "' "; } } $res = self::$conn->query("select * from " . $this->table . $where); return $res->fetchAll(PDO::FETCH_ASSOC); } function getAllPrepare($condicion = []) { $where = ""; if (!empty($condicion)) { $where = " where ". join(" and ", array_map(function($v) { return $v . "=:" . $v; }, array_keys($condicion))); } $st = self::$conn->prepare("select * from " . $this->table . $where); $st->execute($condicion); return $st->fetchAll(PDO::FETCH_ASSOC); } /** * Esta función nos devuelve el elemento de la tabla que tenga este id * @param int $id El id de la fila */ function getById($id) { $res = self::$conn->query("select * from " . $this->table . " where " . $this->idField . "=" . $id); return $res->fetch(); } /** * Elimina el registro que tenga el id que le pasamos * @param int $id */ function deleteById($id) { try { self::$conn->exec("delete from " . $this->table . " where " . $this->idField . "=" . $id); } catch (Exception $ex) { echo $ex->getMessage(); } } /** * Esta función toma como parámetro un array asociativo y nos inserta en la tabla * un registro donde la clave del array hace referencia al campo de la tabla y * el valor del array al valor de la tabla. * ejemplo para la tabla actor: insert(['first_name'=>'Ana','last_name'=>'Pi']) * @param type $valores */ function insert($valores) { try { $campos = join(",", array_keys($valores)); $parametros = ":" . join(",:", array_keys($valores)); $sql = "insert into " . $this->table . "($campos) values ($parametros)"; $st = self::$conn->prepare($sql); $st->execute($valores); } catch (Exception $ex) { echo $ex->getMessage(); } } /** * Modifica el elemento de la base de datos con el id que pasamos * Con los valores del array asociativo * @param int $id Id del elemento a modificar * @param array $valores Array asociativo con los valores a modificar */ function update($id, $valores) { try { //Easy way $res = []; foreach ($valores as $clave => $valor) { $res[] = $clave . "=:" . $clave; } $campos = join(",", $res); //Hack way $campos = join(",", array_map(function($v) { return $v . "=:" . $v; }, array_keys($valores))); $sql = "update " . $this->table . " set " . $campos . " where " . $this->idField . " = " . $id; $st = self::$conn->prepare($sql); $st->execute($valores); } catch (Exception $ex) { echo $ex->getMessage(); } } }
Clase BD de acceso a datos
<?php class BD { static $server = "localhost"; static $user = "root"; static $password = ""; static $database = "sakila"; private $table; static private $conn; public function __construct($table) { $this->table = $table; self::conectar(); } static function conectar() { try { self::$conn = new PDO("mysql:host=" . self::$server . ";dbname=" . self::$database, self::$user, self::$password, [PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8'"]); self::$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } catch (Exception $ex) { echo $ex->getMessage(); } } function getAll() { $res = self::$conn->query("select * from " . $this->table); return $res->fetchAll(); } /** * Esta función nos devuelve el elemento de la tabla que tenga este id * @param int $id El id de la fila */ function getById($id) { $res = self::$conn->query("select * from " . $this->table . " where " . $this->table . "_id=" . $id); return $res->fetch(); } /** * Elimina el registro que tenga el id que le pasamos * @param int $id */ function deleteById($id) { try { self::$conn->exec("delete from " . $this->table . " where " . $this->table . "_id=" . $id); } catch (Exception $ex) { echo $ex->getMessage(); } } /** * Esta función toma como parámetro un array asociativo y nos inserta en la tabla * un registro donde la clave del array hace referencia al campo de la tabla y * el valor del array al valor de la tabla. * ejemplo para la tabla actor: insert(['first_name'=>'Ana','last_name'=>'Pi']) * @param type $valores */ function insert($valores) { try { $campos = join(",", array_keys($valores)); $parametros = ":" . join(",:", array_keys($valores)); $sql = "insert into " . $this->table . "($campos) values ($parametros)"; $st = self::$conn->prepare($sql); $st->execute($valores); } catch (Exception $ex) { echo $ex->getMessage(); } } } $actores = new BD("actor"); //print_r($actores->getAll()); $paises = new BD("country"); //$paises->insert(['country'=>'Chiquitistán']); //print_r($paises->getAll()); //print_r($actores->getById(1)); $v = ['first_name' => 'Ana', 'last_name' => 'Pimiento']; $actores->insert($v);
Clases y métodos finales
<?php //Clases final class Pepe { public function saludo() { echo "Hola"; } final public function despedida(){ echo "Adios"; } } class Pepito extends Pepe { public function saludo() { echo "Hola a todo"; } /* Esto da error public function despedida(){ echo "Adios muy buenas"; } * */ } final class NoHeredable{ public $departamento; } //Esto da error class QuieroHeredar extends NoHeredable{ } $p=new Pepito(); ?>
Recorrer propiedades objetos
<?php //Recorrer objetos class MiClase { public $var1 = 'valor 1'; public $var2 = 'valor 2'; public $var3 = 'valor 3'; protected $protected = 'variable protegida'; private $private = 'variable privada'; function iterateVisible() { echo "MiClase::iterateVisible:<br/>"; foreach ($this as $clave => $valor) { echo $clave." - ".$valor."<br/>"; } } } $clase=new MiClase(); foreach($clase as $clave=>$valor){ echo $clave." - ".$valor."<br/>"; } $clase->iterateVisible(); ?>
Rasgos (traits)
<?php //Rasgos (traits) trait Educado { function saludo() { echo "Hola"; } function despedida() { echo "adios"; } } trait HTML { function cabecera() { echo "<h1>$this->nombre</h1>"; } } class Pepe { use Educado; } class Juan { public $nombre; use Educado, HTML; } $obj = new Pepe; $obj->despedida(); $obj2 = new Juan(); $obj2->nombre="Juan"; $obj2->despedida(); $obj2->cabecera(); ?>