Sei sulla pagina 1di 21

Tema 3.

3
Programación orientada a
objetos en PHP

1
Reintroducción a la POO

• Seguimos el modelo de objetos de Java o C++


• Un objeto combina una estructura de datos junto con las operaciones que se
pueden realizar sobre ella
• Soporta ocultación de detalles de implementación vía 'public', 'private',
etcétera
• Usaremos los conceptos habituales:
• Clases e instancias
• Interfaces
• Polimorfismo
• Abstracción
• Vinculación dinámica

Tema 3.3: Código en el servidor - Objetos en PHP 2


Objetos

• Desde PHP 5 se ha mejorado el modelo de objetos


• Clases
• Traits (¡esto es nuevo!)
• Interfaces

• Los objetos se crean con el operador new


• Las variables de objetos son referencias a los objetos (no copias de los objetos)
• Las asignaciones de variables de referencia a objetos copian referencias, no los
objetos
• Si se quiere una copia del objeto hay que clonar el objeto:
• $copia_de_objeto = clone $objeto;

Tema 3.3: Código en el servidor - Objetos en PHP 3


Clases

• Se definen con class seguida del nombre de clase


• Una etiqueta válida PHP que no sea una palabra reservada

Atributos
• Constantes
• Variables

• Métodos
• Funciones
• Constructor __construct()
• Destructor __destruct()

Tema 3.3: Código en el servidor - Objetos en PHP 4


Definición de clases y objetos

https://www.w3schools.com/php/php_oop_classes_objects.asp

Tema 3.1 Ejecución de código en el servidor 5


Declarando objetos
<?php
class Saludo {
// atributos
private $bienvenida = 'hola';
// constantes
const unaConstante = 'un valor constante';
// métodos
public function muestraBienvenida() {
echo $this->bienvenida;
}
}

$saludo = new Saludo(); // crea uno nuevo


$otro = $saludo; // ambos se refieren al mismo
$saludo->muestraBienvenida(); // funciona
$saludo->bienvenida; // error -- es privado
?>
Fuente: http://www.php.net/manual/en/language.oop5.basic.php
Tema 3.3: Código en el servidor - Objetos en PHP 6
Clases y objetos
• Una clase puede tener métodos o atributos estáticos
• Declarados con un 'static' delante
• Los objetos estáticos no pueden acceder a $this

• Llamando a métodos estáticos


• miObjeto->metodoEstatico() funciona con warning (desde
PHP5.3)
• MiClase::metodoEstatico() preferido (al igual que en C+
+/Java)

Tema 3.3: Código en el servidor - Objetos en PHP 7


Visibilidad

• Sólo para atributos y métodos (las constantes son siempre públicas)


• Similar a C++ / Java:
• public siempre accesible, desde cualquier contexto
(se asume 'public' si no se especifica nada).
• protected sólo desde la clase o subclases de la misma
• private sólo desde la clase

• El ‘estilo’ PHP
• Mucho más frecuente dejar cosas públicas que en otros lenguajes
• Aún así, se recomienda
• Especificar siempre la visibilidad para cada método o función
• Usar siempre la más restrictiva que funcione

https://www.w3schools.com/php/php_oop_access_modifiers.asp
Tema 3.3: Código en el servidor - Objetos en PHP 8
Constructor y Destructor

Constructor:
https://www.w3schools.com/php/phptryit.asp?filename=tryphp_constructor2

Destructor:
https://www.w3schools.com/php/phptryit.asp?filename=tryphp_destructor2

Tema 3.1 Ejecución de código en el servidor 9


Aplicaciones Web

Herencia

Tema 3.3: Código en el servidor - Objetos en PHP 10


Herencia de clases

• Herencia simple (una clase solo puede heredar de otra)


• Se pueden sobreescribir los métodos y propiedades que no estén
declarados como final en la superclase
• Como no hay sobrecarga de métodos, en PHP tampoco se puede
sobreescribir un método con distintos parámetros que la superclase
• Se puede acceder a los métodos de la superclase con parent::
• parent::metodo();

https://www.w3schools.com/php/php_oop_inheritance.asp

Tema 3.3: Código en el servidor - Objetos en PHP 11


Herencia de clases

class Foo {
private $v = 'foo';

public function value() {


return $this->v;
}
}

class Bar extends Foo {


public function value() {
return parent::value() . '2'; // ojo: parent::$v falla
}
}

Tema 3.3: Código en el servidor - Objetos en PHP 12


Interfaces

• Definen conjuntos de métodos públicos


• Tienen que ser implementados por clases
• Se declaran las interfaces que implementa con la palabra implements
• Una clase puede implementar más de una interface

interface Bolsa {
public function compra();
public function venta();
}

class BolsaDeMadrid implements Bolsa {


// implementación de los métodos compra() y venta()
}

Tema 3.3: Código en el servidor - Objetos en PHP 13


Clases abstractas

• Clases que no se pueden instanciar, solo heredar


• Pueden tener métodos sin implementar (abstractos)
abstract class ClaseAbstracta {
public function metodo() {
// implementación del método
}
public abstract function abstracta();
}

class ClaseConcreta extends ClaseAbstracta {


// implementación de la función abstracta()
}

Tema 3.3: Código en el servidor - Objetos en PHP 14


Aplicaciones Web

Peculiaridades de PHP

Tema 3.3: Código en el servidor - Objetos en PHP 15


Traits
Permite agrupar funcionalidades muy específicas
• Mecanismo para hacer una especie de herencia múltiple
• No se puede instanciar directamente un trait
• Poco recomendable, hay alternativas que permiten mejores diseños

trait A {
public function printa() { echo 'a'; }
}
trait B {
public function printb() { echo 'b'; }
}
class AB {
use A, B;
}
$o = new AB();
$o->printa();
$o->printb();

https://www.w3schools.com/php/php_oop_traits.asp
Tema 3.3: Código en el servidor - Objetos en PHP 16
Métodos mágicos y constructores
• En general, los nombres que empiezan por __ están reservados. Los más
importantes son:
• __construct() -- constructor
• __destruct() -- destructor
• __toString() -- convierte tu objeto a cadena

• Si el constructor se declara siguiendo la convención C++/Java (método con el


nombre de la clase) se considera un método normal (desde PHP 5.3.3)

class AutoCart extends Cart {


function AutoCart() { //método normal, no constructor
$this->addItem("10", 1);
}
...
}

• Ojo: si hay superclase, hay que llamar al constructor de la superclase de forma


explícita -- parent::__construct()
Tema 3.3: Código en el servidor - Objetos en PHP 17
Jugando con objetos
• Iteración tipo array asociativo
• Sólo muestra las variables que estén “visibles”

foreach ($objeto as $propiedad => $valor) {


echo "$propiedad vale $valor";
}

• Clonado sencillo, con copia campo-a-campo


(si quieres que sea más profundo, sobreescribe __clone())
$objetoCopia = clone $objetoOriginal;

• Serialización JSON
$json = json_encode($objeto) // devuelve "{ ... }"

• Serialización estándar
$copia = unserialize(serialize($objetoOriginal))
Tema 3.3: Código en el servidor - Objetos en PHP 18
Objetos vs. clásico

• No es más complicado usar algo de objetos que no usarlos


• Como poco, organizan el código en espacios de nombres
Clase::metodo() vs. tipo_funcion()
• Las constantes quedan bien agrupadas
• Puedes marcar cosas internas como privadas,
para que no se usen por accidente desde fuera

Tema 3.3: Código en el servidor - Objetos en PHP 19


Objetos vs. clásico

• Muy cómodo usar objetos para las entidades del dominio


• Una clase para los elementos de cada tabla; asumamos una tabla 'anuncios'
• Objeto 'anuncio'. Métodos para
• crear un nuevo anuncio (= constructor)
• insertar (devuelve ID asignado) ó sobreescribir un anuncio en la BD
• borrar un anuncio de la BD por ID
• leer un anuncio de la BD por ID
• leer de la BD todos los anuncios de un tipo dado
• "Data Access Object", DAO: patrón de diseño especializado en persistir los
datos
• Código de vistas muy legible; posibilidad de pasar de/a JSON fácilmente

Tema 3.3: Código en el servidor - Objetos en PHP 20


Licencia de uso
• Licencia Creative Commons
• Este documento tiene establecidas las siguientes
condiciones:
Reconocimiento (Attribution):
En cualquier explotació n de la obra autorizada por la licencia
hará falta reconocer la autoría.
No comercial (Non commercial):
La explotació n de la obra queda limitada a usos no comerciales.
Compartir igual (Share alike):
La explotació n autorizada incluye la creació n de obras derivadas
siempre que mantengan la misma licencia al ser divulgadas.

• Material elaborado por Juan Pavón Mestras, con modificaciones


de Pablo Moreno Ger, Manuel Freire Morán, Raquel Hervás
Ballesteros y Santiago Domínguez Salamanca
21

Potrebbero piacerti anche