<?php
//Interfaces
interface webHTML{
public function dibujaTabla();
public function dibujaCabecera($nombre);
}
class miTabla implements webHTML{
public function dibujaTabla() {
echo "<table><tr><td></td></tr></table>";
}
public function dibujaCabecera($nombre) {
echo "<h1>$nombre</h1>";
}
public function saludo(){
echo "hola";
}
}
class OtraTabla implements webHTML{
public function dibujaTabla() {
echo "hola";
}
public function dibujaCabecera($nombre) {
echo $nombre;
}
}
?>
Etiqueta: oop
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);