Mezcla de clases

Vamos a mezclar la clase Departamento y la clase Empleado que ya hemos visto. La idea es que el gerente de la clase departamento sea de tipo empleado.

Probad a poner las dos clases juntas y crear primero un empleado y después un departamento pasando el objeto empleado que acabamos de crear ¿Funciona? ¿Por qué sí o por qué no? ¿Hay alguna función que falle? ¿Cómo la arreglaríamos?

Ejercicio Carta

Vamos a crear una clase ‘Carta’ que va a tener las siguientes propiedades:

Palo (de tipo string)
Numero (de tipo string)
Valor (de tipo entero)

Tenemos que crear un constructor que nos obligue a dar todos los valores. Implementar también setter y getter.

Crearemos una función __toString que nos mostrará el valor de la siguiente forma: ‘7 de espadas’

<?php


/**
 * Description of Carta
 *
 * @author incid
 */
class Carta {
    private $palo;
    private $numero;
    private $valor;
    
    function __construct($palo,$numero,$valor) {
        $this->setNumero($numero);
        $this->setPalo($palo);
        $this->setValor($valor);
    }
    
    function getPalo() {
        return $this->palo;
    }

    function getNumero() {
        return $this->numero;
    }

    function getValor() {
        return $this->valor;
    }

    function setPalo($palo) {
        $this->palo = $palo;
    }

    function setNumero($numero) {
        $this->numero = $numero;
    }

    function setValor($valor) {
        $this->valor = $valor;
    }

    function __toString() {
        return $this->getNumero()." de ".$this->getPalo();
    }

}

$miCarta=new Carta("Oros",7,7);
$otra=new Carta("Copas","Rey",10);

echo $otra;

$manoMus=[new Carta("Oros","Sota",10),new Carta("Copas",7,7),
    new Carta("Oros",4,4),new Carta("Bastos",1,1)];

var_dump($manoMus);
$puntos=0;
foreach($manoMus as $carta){
    echo $carta."<br>";
    $puntos+=$carta->getValor();
}
echo "Tienes $puntos puntos";

class BarajaMus{
    private $cartas=[];
    function __construct() {
        $this->crearBaraja();
    }
    private function crearBaraja(){
        $this->cartas=[];
        $palos=['Oros','Espadas','Copas','Bastos'];
        $numeros=["As",2,3,4,5,6,7,'Sota','Caballo','Rey'];
        $valores=[1,2,3,4,5,6,7,10,10,10];
        foreach($palos as $palo){
            for($i=0;$i<count($numeros);$i++){
                $this->cartas[]=new Carta($palo,$numeros[$i],$valores[$i]);
            }
        }
    }
    function barajar(){
        shuffle($this->cartas);
    }
}

$baraja=new BarajaMus();
$baraja->barajar();

Clase Departamento

<?php

/**
 * Description of Departamento
 *
 * @author incid
 */
class Departamento {
    private $nombre;
    private $gerente;
    private $num_empleados;
    /**
     * Esta función nos construye el objeto
     * Es muy bonita y está muy bien hecha
     * Saludos a mi clase que me está leyendo
     * 
     * @param string $nombre El nombre del departamento
     * @param string $gerente El gerente asignado
     * @param int $num_empleados Número de empleados
     */
    function __construct($nombre,$gerente,$num_empleados=2) {
        $this->setNombre($nombre);
        $this->setGerente($gerente);
        $this->setNum_empleados($num_empleados);
    }
    function getNombre() {
        return $this->nombre;
    }

    function getGerente() {
        return $this->gerente;
    }

    function getNum_empleados() {
        return $this->num_empleados;
    }

    function setNombre($nombre) {
        if(empty($nombre)){
            throw new Exception("El nombre no puede estar vacío");
        }
        $this->nombre = $nombre;
    }

    function setGerente($gerente) {
        if(empty($gerente)){
            throw new Exception("El gerente no puede estar vacío");
        }
        $this->gerente = $gerente;
    }

    function setNum_empleados($num_empleados) {
        if($num_empleados<1){
            throw new Exception("Tiene que tener al menos un empleado");
        }
        $this->num_empleados = $num_empleados;
    }
    
    function __toString() {
        return $this->getNombre()." - ".$this->getGerente()." - ".$this->getNum_empleados();
    }
     
     
}

$comercial=new Departamento("Comercial","Eva Pi");

$cad="Departamento: ".$comercial;

echo $cad;

Clase empleado

class Empleado {

    private $nombre;
    private $dni;
    private $sueldo;

    function __construct($nombre, $dni, $sueldo = 1000) {
        $this->setNombre($nombre) ;
        $this->setDni($dni);
        $this->setSueldo($sueldo);
    }

    function verEmpleado() {
        return $this->getNombre() . " - " . $this->getDni() . " - " . $this->getSueldo();
    }

    function sueldoNeto() {
        return $this->getSueldo() * 0.85;
    }

    private function validar_dni($dni) {
        $letra = substr($dni, -1);
        $numeros = substr($dni, 0, -1);
        if (substr("TRWAGMYFPDXBNJZSQVHLCKE", $numeros % 23, 1) == $letra && strlen($letra) == 1 && strlen($numeros) == 8) {
            return true;
        } else {
            return false;
        }
    }

    function setSueldo($sueldo) {
        if ($sueldo < 900) {
            throw new Exception("El sueldo no puede ser menor que el interprofesional");
        }
        $this->sueldo = $sueldo;
    }

    function setNombre($nombre) {
        if (empty($nombre)) {
            throw new Exception("El nombre no puede estar vacío");
        }
        $this->nombre = $nombre;
    }

    function setDni($dni) {
        if (!$this->validar_dni($dni)) {
            throw new Exception("DNI no válido");
        }
        $this->dni = $dni;
    }

    function getSueldo() {
        return $this->sueldo;
    }

    function getNombre() {
        return $this->nombre;
    }

    function getDni() {
        return $this->dni;
    }

}

$pepe = new Empleado("José Pérez", "12345678Z");
$pepe->setSueldo(2000); //Esto nos permite acceder a la propiedad
echo $pepe->verEmpleado();

Ejercicio constructor

En la siguiente clase vamos a añadir un constructor que nos obligue a poner el nombre, el dni, pero que el sueldo sea opcional (lo podemos pasar o no) y que si no lo pasamos por defecto valga 1000:

class Empleado {

    public $nombre;
    public $dni;
    public $sueldo;

    function verEmpleado() {
        return $this->nombre . " - " . $this->dni . " - " . $this->sueldo;
    }

    function sueldoNeto() {
        return $this->sueldo * 0.85;
    }

}

Solución:

class Empleado {

    public $nombre;
    public $dni;
    public $sueldo;

    function __construct($nombre, $dni, $sueldo = 1000) {
        if (empty($nombre)){
            throw new Exception("El nombre no puede estar vacío");
        }
        if(!$this->validar_dni($dni)){
            throw new Exception("DNI no válido");
        }
        if ($sueldo<900){
             throw new Exception("El sueldo no puede ser menor que el interprofesional");
        }
        $this->nombre = $nombre;
        $this->dni = $dni;
        $this->sueldo = $sueldo;
    }

    function verEmpleado() {
        return $this->nombre . " - " . $this->dni . " - " . $this->sueldo;
    }

    function sueldoNeto() {
        return $this->sueldo * 0.85;
    }

    function validar_dni($dni) {
        $letra = substr($dni, -1);
        $numeros = substr($dni, 0, -1);
        if (substr("TRWAGMYFPDXBNJZSQVHLCKE", $numeros % 23, 1) == $letra && strlen($letra) == 1 && strlen($numeros) == 8) {
            return true;
        } else {
            return false;
        }
    }

}

Ejemplo Producto con constructor

<?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();
}

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;

Ejercicio actores pseudo autocompletar

<!DOCTYPE html>

<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
    </head>
    <body>
        Actor:<input type="text" id="actor"><br/>
        <div id="lista"></div>
        <script>
            $(function () {
                console.log("Página cargada");
                $('#actor').keyup(function () {
                    console.log("Pulsado");
                    fetch('fetch_backend.php?actor='+$('#actor').val(), {
                        method: 'GET',
                    })
                            .then(function (response) {
                                console.log(response);
                                return response.json();
                            })
                            .then(function (data) {
                                console.log('data = ', data);
                                $('#lista').html('');
                                for(i=0;i<data.length;i++){
                                    $('#lista').append(data[i]+"<br>");
                                }
                            })
                            .catch(function (err) {
                                console.error(err);
                            });
                });
            });
        </script>
    </body>
</html>

<?php

$server = "localhost";
$user = "root";
$password = "";
$db = "sakila";
try {
    $conn = new PDO("mysql:host=$server;dbname=$db;charset=UTF8", $user, $password);
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $actor = filter_input(INPUT_GET, "actor");
    $sql = "select * from actor "
            . "where first_name like :actor "
            . "or last_name like :actor limit 10";
    $parametros = [
        'actor' => '%' . $actor . '%'
    ];
    $st = $conn->prepare($sql);
    $st->execute($parametros);
    $resultado = [];
    while ($fila = $st->fetch()) {
        $resultado[] = $fila['first_name'] . " " . $fila['last_name'];
    }
    echo json_encode($resultado);
} catch (Exception $e) {
    echo "Connection failed: " . $e->getMessage();
}

Como usar fetch en JS

Fetch

 <body>
        Importe:<input type="text" id="importe"><br/>
        Plazos:<input type="text" id="plazos"><br/>
        <button id="ajax">Pulsa aquí para probar el ajax</button>
        <div id="resultado"></div>
        <script>
            $(function () {
                console.log("Página cargada");
                $('#ajax').click(function () {
                    console.log("Pulsado");

                    fetch('ajax_backend.php', {
                        method: 'POST',
                        headers: {
                            'Content-Type': 'application/x-www-form-urlencoded'
                        },
                        body: 'importe=' + $("#importe").val() + '&plazos=' + $("#plazos").val()
                    })
                            .then(function (response) {
                                console.log('response =', response);
                                return response.json();
                            })
                            .then(function (data) {
                                console.log('data = ', data);
                                $('#resultado').html("<ul>");
                                for (prop in data) {
                                    $('#resultado').append("<li>" + data[prop] + "</li>");
                                }
                                $('#resultado').append("</Ul>");
                            })
                            .catch(function (err) {
                                console.error(err);
                            });
                   
                });
            });
        </script>
    </body>