Clases Abstractas

 <?php

        //Clases abstractas
        //No se puede instanciar
        abstract class ClaseAbstracta {

            public $nombre;

            function saludo() {
                echo "Hola";
            }

            abstract function despedida();
        }

        class ClaseConcreta extends ClaseAbstracta {
            //Obligado a implementar despedida
            function despedida() {
                echo "adios";
            }

        }
        //Da error porque no implementamos despedida
        class OtraClase extends ClaseAbstracta{
            
        }
        $fallo=new ClaseAbstracta(); //ERROR
        
        $obj = new ClaseConcreta();
        $obj->nombre = "Juan";
        $obj->saludo();

Ejemplo conexión BD

<?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();
    }
}
$actores=new BD("actor");
print_r($actores->getAll());

$paises=new BD("country");

print_r($paises->getAll());

Sobreescritura

<?php 
        class A {
            public $nombre;
            public function __construct($nombre) {
                $this->nombre=$nombre;
            }
            
            function saludo(){
                echo "Hola ".$this->nombre;
            }
        }
        class B extends A{
            public $apellidos;
            public function __construct($nombre,$apellidos) {
                parent::__construct($nombre);
                $this->apellidos=$apellidos;
            }
            function saludo(){
                echo "Hola ".$this->nombre." ".$this->apellidos;
            }
        }
        $ana=new A("Ana");
        $ana->saludo();
        
        $juan=new B("Juan","Pi");
        $juan->saludo();
        ?>

Valores estáticos

 <?php
        class foo{
            public static $ciudad="Barcelona";
            public $nombre;
            public function __construct($nombre) {
                $this->nombre=$nombre; 
            }
            public static function saludo(){
                       echo "Hola estoy en ".self::$ciudad;
         
            }
             public static function otroSaludo(){
                echo "Hola ".$this->nombre; //Esto da un error por ser estático
            }
        }
        $ana=new foo("Ana");
        $juan=new foo("Juan");
        
        print_r($ana);
        print_r($juan);
        
        echo foo::$ciudad;
        echo $ana::$ciudad;
        echo $juan::$ciudad;
        
        foo::$ciudad="Turruncún";
        echo foo::$ciudad;
        echo $ana::$ciudad;
        echo $juan::$ciudad;
        
        $juan::saludo();
        $ana::saludo();
        ?>

Constructores

 <?php

        class A {

            public $elementos = [];

            public function __construct() {
                for ($i = 0; $i < 10; $i++) {
                    $this->elementos[] = $i;
                }
            }
          

        }

        class B {

            public $elementos = [];

            public function __construct($num=10) {
                for ($i = 0; $i < $num; $i++) {
                    $this->elementos[] = $i;
                }
            }

        }

        $a = new A();
        $b = new A();


        $c = new B(3);
        $d = new B(9);
        $e = new B();

        print_r($c->elementos);
        print_r($d->elementos);
        print_r($e->elementos);
        ?>

Herencia y visibilidad

 <?php

        class A {

            public $aa = "aa";
            private $bb = "bb";
            protected $cc = "cc";

        }

        class B extends A {

            public $dd = "dd";
            private $ee = "ee";

            function test() {
                echo $this->aa;
                echo $this->bb; //Esta no la imprime
                echo $this->cc;
                echo $this->dd;
                echo $this->ee;
            }

        }

        $obj = new B();
        $obj->test();

        echo $obj->aa;
        echo $obj->bb;//Esta no la imprime
        echo $obj->cc;//Esta no la imprime
        echo $obj->dd;
        echo $obj->ee;//Esta no la imprime

Ejercicio alumnos

class Alumno {

            private $nombre;
            private $nota;
            private $apellidos;

            //Set y get para todas las propiedades. La nota enter 0 y 10
            //El resto no vacíos
            //Función aprobado que nos devuelva true si la nota es >=5
            //Función nombre completo que nos devuelva el nombre y el apellido
            //¿Sería posible hacerlo como propiedad y no como función?
            //Functión mágica toString que nos devuelva nombre completo y nota

            function __set($name, $value) {
                if (property_exists($this, $name)) {
                    if ($name == 'nota') {
                        if ($value >= 0 && $value <= 10) {
                            $this->nota = $value;
                        } else {
                            throw new Exception("La nota debe estar entre 0 y 10");
                        }
                    } else {
                        if (!empty($value)) {
                            $this->$name = $value;
                        }
                    }
                }
            }

            function aprobado() {
                return $this->nota >= 5;
            }

            function __get($name) {
                if (property_exists($this, $name)) {
                    return $this->$name;
                } else {
                    if ($name == "nombreCompleto") {
                        return $this->nombreCompleto();
                    }
                }
            }

            function nombreCompleto() {
                return $this->nombre . " " . $this->apellidos;
            }

            public function __toString() {
                return $this->nombreCompleto." - ".$this->nota;
            }

        }

        $ana = new Alumno();
        $ana->nombre="Ana";
        $ana->apellidos="Pi";
        $ana->nota=7;
        echo $ana->nombreCompleto."<br/>";
        echo $ana;
        ?>

Setters y getters, diferentes formas

Con funciones:

 class Coche{
            private $marca;
            private $modelo;
            private $velocidad;
            
            //Crear las funciones que nos permitan poner y obtener valores
            //En el caso de la velocidad el valor permitido está entre 50 y 300
            //En el caso de marca y modelo comprobar que no esté vacío
            
            function setMarca($marca){
                if (!empty($marca)){
                    $this->marca=$marca;
                }
            }
            function setModelo($modelo){
                if (!empty($modelo)){
                    $this->modelo=$modelo;
                }
            }
            function setVelocidad($velocidad){
                if ($velocidad>=50 && $velocidad<=300){
                    $this->velocidad=$velocidad;
                } else{
                    throw new Exception("La velocidad debe estar entre 50 y 300");
                }
            }
            
            function getMarca(){
                return $this->marca;
            }
            function getModelo(){
                return $this->modelo;
            }
            function getVelocidad(){
                return $this->velocidad;
            }
        }
        
        $seat=new Coche();
        $seat->setMarca("Seat");
        $seat->setModelo("Panda");
        $seat->setVelocidad(180);
        print_r($seat);

Con __get y __set

     <?php
        class Coche {

            private $marca;
            private $modelo;
            private $velocidad;

            //Crear las funciones que nos permitan poner y obtener valores
            //En el caso de la velocidad el valor permitido está entre 50 y 300
            //En el caso de marca y modelo comprobar que no esté vacío

            function __get($name) {
                if (property_exists('Coche', $name)) {
                    return $this->$name;
                }
            }

            function __set($name, $value) {
                if ($name == "velocidad") {
                    if ($value >= 50 && $value <= 300) {
                        $this->velocidad = $value;
                    } else {
                        throw new Exception("La velocidad debe estar entre 50 y 300");
                    }
                } else {
                    if (!empty($value) && property_exists('Coche', $name)) {
                        $this->$name = $value;
                    }
                }
            }

        }

        $seat = new Coche();
        $seat->marca = "Seat";
        $seat->modelo = "Panda";
        $seat->velocidad = 180;
        $seat->color="rojo";
        echo $seat->modelo;
        echo $seat->color;
        print_r($seat);

Trivial: fallos

# nombre, pregunta
antes muerta que sencilla, ¿Cómo seleccionamos elementos con la clase ‘test’?
antes muerta que sencilla, Sintaxis de while en JS
antes muerta que sencilla, ¿Qué evento ocurre cuando clicamos en un elemento HTML?
antes muerta que sencilla, ¿Usando qué nos aseguramos en jQuery que el código se ejecuta al cargar la página?
antes muerta que sencilla, ¿Qué significa HTML?
antes muerta que sencilla, ¿Cómo seleccionamos un elemento con id ‘demo’?
antes muerta que sencilla, ¿Cómo añadimos una clase a un elemento con jQuery?
antes muerta que sencilla, Propiedad para cambiar el tipo de fuente de un elemento
arnaubuixo, ¿Cómo ponemos los párrafos de color rojo en jQuery?
arnaubuixo, ¿Cómo se hace un comentario en CSS?
arnaubuixo, Indica que HTML usaríamos para poner un vídeo en HTML
arnaubuixo, Indica que valor de la propiedad position nos permite colocar un elemento respecto a la página
arnaubuixo, ¿Con qué código ponemos negrita a todos los párrafos?
carmen, ¿Cual es la etiqueta para un salto de línea?
carmen, ¿Qué selecciona en jQuery $(‘p#intro’)?
carmen, ¿Usando qué nos aseguramos en jQuery que el código se ejecuta al cargar la página?
carmen, Sintaxis de while en JS
carmen, Indica que valor de la propiedad position nos permite colocar un elemento respecto a la página
carmen, Código para seleccionar todos los ‘p’ dentro de un ‘div’
carmen, ¿Cuál es la manera correcta de obtener el valor de una variable GET?
carmen, Etiquetas para escribir php
carmen, ¿Cómo enlazamos un CSS externo?
carmen, ¿Cómo creamos arrays en PHP?
carmen, ¿Cómo cambiamos el contenido de un elemento ‘p’ con id ‘demo’?
Eladelite, Indica que valor de la propiedad position nos permite colocar un elemento respecto a la página
Eladelite, ¿Qué evento ocurre cuando clicamos en un elemento HTML?
Eladelite, ¿Cuantas columnas usa el grid de bootstrap?
Eladelite, ¿Cómo ocultamos elementos en jQuery?
Eladelite, Código para seleccionar todos los ‘p’ dentro de un ‘div’
Eladelite, Indica el código correcto para sumar uno a la variable $count
Eladelite, Propiedad para cambiar el tipo de fuente de un elemento
Eladelite, ¿Qué selecciona en jQuery $(‘p#intro’)?
Eladelite, Operador en PHP para comprobar igualdad de valor y tipo
Eladelite, ¿Se puede usar Ajax en jQuery?
Eladelite, ¿Cómo seleccionamos un cliente cuyo nombre empieza por ‘a’
Eladelite, Código para aplicar color rojo a todos los h1
Eladelite, ¿Cuál es la manera correcta de obtener el valor de una variable GET?
Eladelite, ¿Usa jQuery los selectores CSS para seleccionar elementos?
Eladelite, ¿Cómo añadimos una clase a un elemento con jQuery?
Eladelite, Sintaxis de if en JS
Eladelite, ¿Qué carácter usa jQuery como atajo para sus instrucciones?
fabian, ¿Cómo se hace un comentario en CSS?
fabian, Indica que valor de la propiedad position nos permite colocar un elemento respecto a la página
Jordi, En bootstrap hay una clase para crear un botón grande ¿Cuál?
Jordi, Propiedad para cambiar el tipo de fuente de un elemento
Jordi, ¿Usa jQuery los selectores CSS para seleccionar elementos?
Jordi, Indica que valor de la propiedad position nos permite colocar un elemento respecto a la página
Jordi, ¿Qué carácter usa jQuery como atajo para sus instrucciones?
Jordi, Código para seleccionar todos los ‘p’ dentro de un ‘div’
Jordi, El código $(‘div’) ¿Qué selecciona?
Jordi, Sentencia SQL para modificar datos
Jordi, Que afirmación es correcta
Jordi, ¿Usando qué nos aseguramos en jQuery que el código se ejecuta al cargar la página?
Jose Antonio, ¿Qué selecciona en jQuery $(‘p#intro’)?
Jose Antonio, ¿Cómo cambiamos el contenido de un elemento ‘p’ con id ‘demo’?
Jose Antonio, ¿Cómo creamos arrays en PHP?
Jose Antonio, En bootstrap hay una clase para crear un botón grande ¿Cuál?
Jose Antonio, Indica que HTML usaríamos para poner un vídeo en HTML
Jose Antonio, ¿Cómo seleccionamos un cliente cuyo nombre empieza por ‘a’
Mario, Indica que valor de la propiedad position nos permite colocar un elemento respecto a la página
Mario, Indica el código correcto para sumar uno a la variable $count
Mario, En bootstrap hay una clase para crear un botón grande ¿Cuál?
Mario, Sentencia SQL para borrar datos
Mario, ¿Cómo se hace un comentario en CSS?
Martes Martes, ¿Qué etiqueta semántica se utiliza para especificar la cabecera de un documento?
Martes Martes, Indica que valor de la propiedad position nos permite colocar un elemento respecto a la página
Martes Martes, Sentencia SQl para obtener datos
Martes Martes, ¿cual de estas etiquetas designa una encabezado?
Martes Martes, ¿Con qué etiqueta creamos un desplegable en HTML?
Martes Martes, ¿Con qué código ponemos negrita a todos los párrafos?
Martes Martes, ¿Cómo redondeamos 7.25 al entero más cercano en js?
Martes Martes, Propiedad para cambiar el tipo de fuente de un elemento
Martes Martes, ¿Cómo ponemos los párrafos de color rojo en jQuery?
Martes Martes, Etiquetas para escribir php
Martes Martes, Sentencia SQL para modificar datos
roger, ¿Cómo redondeamos 7.25 al entero más cercano en js?
roger, Indica cómo harías un checkbox en HTML
roger, Indica que HTML usaríamos para poner un vídeo en HTML
roger, ¿Qué significa HTML?
roger, ¿Usando qué nos aseguramos en jQuery que el código se ejecuta al cargar la página?
roger, Indica que valor de la propiedad position nos permite colocar un elemento respecto a la página
roger, Pincha en la etiqueta utilizada para destacar un texto
roger, ¿Usa jQuery los selectores CSS para seleccionar elementos?
roger, ¿Cómo creamos arrays en PHP?
roger, Código para seleccionar todos los ‘p’ dentro de un ‘div’
roger, ¿Cómo se hace un comentario en CSS?
Roser, Propiedad para cambiar el tipo de fuente de un elemento
Roser, ¿Cómo seleccionamos un cliente cuyo nombre empieza por ‘a’
Roser, ¿Qué etiqueta semántica se utiliza para especificar la cabecera de un documento?
Victor Pessolato, ¿Con qué etiqueta creamos un desplegable en HTML?
Victor Pessolato, ¿Con qué carácter se cierran las etiquetas?