Está en la página 1de 59

Programación Orientada a

Objetos con PHP


DWES UD4
1.- Introducción POO
Realmente la primera vez que apareció el concepto de Programación Orientada a
Objetos fue con el lenguaje de programación Simula en 1962, lanzado oficialmente en
1967.

Aunque no fue hasta décadas más tarde a finales de los 90 principios del 2000 cuando
tomó la relevancia que tiene hoy en día.

Su auge fue gracias a lenguajes de programación como Java (1995) y C# (2000), que
aunque estaban basados en el lenguaje C que es procedimental, introdujeron este tipo
de metodologías.
1.- Introducción POO
Características de la POO:

● Herencia: cuando se crea una clase a partir de otra. Se hereda su comportamiento y


características.

● Abstracción: de cara al exterior la clase sólo muestra los métodos (interface) no el


cómo hace las cosas.

● Polimorfismo y sobrecarga: los métodos pueden tener comportamientos diferentes


según la forma de utilizarlos.

● Encapsulación: Están juntos los datos y el código que los usa.


1.- Introducción POO
Propiedades (atributos): almacenan información acerca del estado del ojeto al que
pertenecen. Su valor puede ser diferente para diferentes objetos de una misma clase.

Métodos: contienen código ejecutable y definen las acciones que realiza el objeto. Son
como una función y pueden recibir parámetros y devolver valores.

Instancia: cuando se tiene una clase definida y se crea un objeto de dicha clase se dice
que se tiene una instancia de la clase (un elemento “real”).
1.- Introducción POO
Ventajas que aporta la POO:

● Modularidad: permite dividir los programas en partes más pequeñas


independientes entre sí. Además se pueden usar esas partes en otros programas.

● Extensibilidad: para ampliar la funcionalidad de las clases solo hay que modificar su
código.

● Mantenimiento: Gracias a la modularidad el mantenimiento es más sencillo. Es


importante que cada clase esté en un archivo diferente.

Más información acerca de la POO


2.- POO en PHP
En PHP hay casos que se puede realizar la misma tarea de manera tradicional
(estructurada) y mediante la POO, por ejemplo cuando queremos conectarnos a una
base de datos:

// utilizando programación estructurada


$dwes = mysqli_connect('ip_server', 'user', 'pass', 'nombre_bd');

// utilizando POO
$dwes = new mysqli();
$dwes->connect(ip_server, 'user', 'pass', 'nombre_bd');
2.- POO en PHP
PHP no se diseñó para la POO. En la versión 3 se empezarona introducir algunos
aspectos. En PHP4 se potenció más aún el uso de objetos.

En PHP 5 se reescribió el modelo de objetos para obtener mejor rendimiento y


funcionalidad. A partir de esta versión se dispone de un modelo de objetos completo.

Actualmente PHP incluye las siguientes características de POO:


Métodos estáticos, constructores y destructores
Herencia Interfaces Clases abstractas

No están soportadas las siguientes características:


Herencia múltiple Sobrecarga de métodos y operadores
2.- POO en PHP
Clases

La declaración de una clase se realiza con la palabra class seguida del nombre de la clase y un par de
llaves que encierran las definiciones de las propiedades y métodos:

class Producto {
private $codigo;
public $nombre;
public $PVP;

public function muestra ( ) {


print '<p>' . $this->codigo . '</p>';
}
}
2.- POO en PHP
Clases

Como buenas prácticas de programación conviene que dentro de la clase los elementos
estén ordenados, primero las propiedades y luego los métodos.

Es habitual que la primera letra de la clase sea mayúscula.

Las clases deberían estar en su propio archivo producto.inc.php


2.- POO en PHP
Instanciar objetos

Cuando se declara una variable de una clase dada se dice que se está creando un objeto
de la clase, o lo que es lo mismo una instancia de la clase.

Para crear una instancia de un objeto se utiliza la palabra new.

$miProducto = new Producto();

Recuerda que antes de poder instanciar un objeto de una clase se tiene que declarar la
clase:

require_once('producto.inc.php');
2.- POO en PHP
Atributos

Los atributos son como las variables. Es posible indicar un valor a un atributo en la
declaración de la clase, así en todos los objetos ese atributo tendrá el mismo valor nada
más se instancie.

Para acceder a los atributos y métodos de una clase se utiliza el operador ->

$miProducto->nombre = 'Samsung Galaxy Note 7';


$miProducto->muestra();
2.- POO en PHP
Atributos - Nivel de acceso

Dependiendo del nivel de acceso con el que se declare un atributo se podrá acceder a él
directamente o a través de un método de la clase.

class Producto {
private $codigo;
public $nombre;
public $PVP
}

● public: se puede acceder a estos atributos de manera directa.


● private: solo se puede acceder a estos atributos desde dentro de la clase o mediante un
método de la clase.
2.- POO en PHP
Atributos - Nivel de acceso

● Private

Al formar parte de la información interna del objeto se tiene más control de los
valores que almacenan.

También puede interesar conocer de antemano el valor antes de guardarlo


2.- POO en PHP
Atributos - Nivel de acceso

private $codigo;

public function setCodigo ($nuevo_codigo) {


if (noExisteCodigo($nuevo_codigo)) {
$this->codigo = $nuevo_código;
return true;
}
return false;
}

public function getCodigo ( ) {


return $this->codigo;
}
2.- POO en PHP
setters y getters

Habitualmente se suele nombrar a los métodos que nos permiten obtener o cambiar el valor de un
atributo private empezando con las palabras get y set.

A partir de PHP5 se introdujeron los métodos mágicos, entre los cuales se encuentran _ _get y _
_set.

void _ _set (string name, mixed value)


mixed _ _get (mixed name)

name es el nombre de la variable, mixed indica que puede ser cualquier tipo.

Si se declaran en una clase, PHP los invocará cuando se intente acceder a un atributo que no exista o
no accesible (private).
2.- POO en PHP
Atributos - Nivel de acceso
private $codigo;
public function _ _set ($atributo, $valor) {
switch($atributo) {
case 'Codigo': if (noExisteCodigo($nuevo_codigo)) {
$this->codigo = $nuevo_codigo;
return true;
}
return false;
}
}
public function _ _get ($atributo) {
switch($atributo) {
case 'Codigo': return $this->codigo;
}
}
2.- POO en PHP
El objeto $this

Toda instancia de un objeto posee una referencia a sí mismo que se utiliza cuando se
invoca a un método de dicho objeto. Esta referencia a sí mismo se almacena en la
variable $this que solo es accesible desde los métodos del propio objeto.

class Producto {
private $codigo;

public function cambiarCodigo ($cod) {


$this->codigo = $cod;
}
}
2.- POO en PHP
Constantes de clase

Se pueden definir en las clases valores que serán comunes a todas las instancias de la
clase, son las constantes de clases.

Se definen con la palabra const y su nombre se suele escribir en mayúsculas y no lleva el


símbolo $ y su valor siempre va entre comillas.

Para acceder a esas constantes, ya que son valores de una clase, se utilizará el nombre de
la clase y el operador de resolución de ámbito ::
2.- POO en PHP
Constantes de clase

class Coche {
const RUEDAS = '4';
private $modelo;


}

echo Coche::RUEDAS;
2.- POO en PHP
Atributos y métodos estáticos

Los atributos y métodos estáticos también llamados atributos y métodos de clase, como
bien indica su nombre no dependen de una instancia del objeto.

Dependen de la clase en sí, por ello para acceder a ellos se usará el nombre de la clase y
el operador visto anteriormente ::

Para definirlos se utiliza la palabra static.

Si son public se podrá acceder a ellos usando el nombre de la clase.

Si son private se podrá acceder a ellos desde dentro de la clase (declaración) usando la
palabra self.
2.- POO en PHP
Atributos y métodos estáticos

class Producto {
private static $cantidadProductos = 0;

public static function nuevoProducto () {


self::$cantidadProductos++;
}
}

Producto::nuevoProducto();
2.- POO en PHP
Atributos y métodos estáticos

Los atributos estáticos se utilizan para guardar información general de la clase como por
ejemplo, el número de objetos instanciados. Solo existe un valor para el atributo y se
almacena a nivel de clase no de instancia.

Los métodos estáticos suelen realizar una tarea específica. Por ejemplo una clase
matemática tiene métodos estáticos para calcular logaritmos o raíces cuadradas. No
tiene sentido crear un objeto si lo único que se quiere es realizar un cálculo.

Como se llaman desde la clase no se puede utilizar $this dentro de estos métodos.
2.- POO en PHP
Constructor

Los constructores se ejecutan cuando se crea el objeto, los métodos constructores han
de llamarse _ _construct

Se pueden observar los símbolos _ _ que ya se han visto antes, estos indican que es un
método mágico de PHP.

Solo puede haber un método constructor en cada clase ya que PHP no soporta la
sobrecarga de métodos.
2.- POO en PHP
Constructor

class Producto {
private static $num_productos = 0;
private $codigo;

public function _ _construct ( ) {


self::$num_productos++;
}
}

$miProducto = new Producto();


2.- POO en PHP
Constructor

class Producto {
private static $cantidadProductos = 0;
private $nombre;

public function _ _construct ($codigo) {


$this->$nombre = $codigo;
self::$cantidadProductos++;
}
}

$miProducto = new Producto('GALAXYS');


2.- POO en PHP
Destructor

También se puede definir un método destructor _ _destruct incluidos desde PHP5

Un destructor permite definir las acciones que se ejecutarán cuando se elimine la


instancia del objeto.
2.- POO en PHP
Destructor

class Producto {
private static $cantidadProductos = 0;
private $codigo;

public function _ _construct ($codigo) {


$this->$codigo = $codigo;
self::$cantidadProductos++;
}
public function _ _destruct ( ) {
self::$cantidadProductos--;
}
}
2.- POO en PHP
Utilización de objetos

Ya se ha visto cómo instanciar a un objeto y cómo acceder a sus propiedades y métodos


públicos:

$miProducto = new Producto();


$miProducto->nombre = 'Samsung Galaxy S';
$miProducto->muestra();

Se puede comprobar de qué clase es un objeto con el operador instanceof:

if ($miProducto instanceof Producto) {


...
}
2.- POO en PHP
Utilización de objetos

Existen otras funciones muy útiles en el desarrollo de aplicaciones con POO:

get_class
class_exists
get_declared_classes
class_alias
get_class_methods
method_exists
get_class_vars
get_object_vars
property_exists
2.- POO en PHP
Utilización de objetos

Desde PHP5 se puede indicar en las funciones y también en los métodos el tipo de los
argumentos que se les pasa.

Se ha visto que esto no es necesario, pero se puede realizar.

public function venderProducto (Producto $miProducto) {



}

Si en la llamada no se le pasa un argumento de ese tipo se producirá un error.


2.- POO en PHP
Copiar objetos

$miProducto = new Producto();


$nuevoProducto = $miProducto;

Se podría suponer que el código anterior crea una copia del objeto como ocurre con las variables,
pero cuando se trata de objetos no funciona igual.

Con el código anterior se consigue tener una referencia nueva al mismo objeto, sería como crear un
alias del objeto. Si se cambia algún atributo de $nuevoProducto “también” se cambia en
$miProducto y viceversa (realmente es el mismo objeto).

Con los objetos se usa la funcion clone si se quiere crear una copia del objeto.

$nuevoProducto = clone($miProducto);
2.- POO en PHP
Comparar objetos

Mediante los operadores == y === se puede comprobar si dos objetos contienen los
mismos valores o incluso si son el mismo objeto.

$p = new Producto();
$p->nombre = 'Samsung Galaxy S’;
$a = clone($p);

// El resultado de $a == $p es verdadero pues son dos copias idénticas

// El resultado de $a === $p es falso ya que aunque tienen sus atributos tienen


los mismos valores son objetos diferentes
2.- POO en PHP
Convertir un objeto a cadena

Como ocurre en otros lenguajes de programación, en PHP también se dispone de un


método para indicar cómo se comportará el objeto cuando este se trate como una
cadena de caracteres.

Se deberá definir el método _ _toString

Como es un método mágico se puede utilizar invocándolo directamente o bien actuará


automáticamente cuando se quiera mostrar el objeto como cadena.
2.- POO en PHP
Convertir un objeto a cadena

class Producto {
private $codigo;
private $nombre;

public function _ _construct ($codigo) {


$this->codigo = $codigo;
}

public function ponerNombre ($nombre) {


$this->nombre = $nombre;
}

public function _ _toString ( ) {


return 'Codigo: '. $this->codigo .'<br>Nombre:'. $this->nombre;
}
}
2.- POO en PHP
Convertir un objeto a cadena

$miProducto = new Producto('Nintendo');


$miProducto->ponerNombre('Wii');

// Las siguientes instrucciones producirán el mismo resultado


echo $miProducto->_ _toString();
echo $miProducto;
Ejercicio
Clases en PHP

Realizar el ejercicio 1 del boletín.


2.- POO en PHP
Como ya sabemos y se recordó al principio de la unidad, las características más
importantes de la Programación Orientada a Objetos son:

● Encapsulación

● Herencia

● Polimorfismo y sobrecarga
2.- POO en PHP
Encapsulación

Gracias al nivel de acceso visto en las propiedades, se puede indicar desde qué lugar y
quien puede usar esas propiedades.

public – private

Estos modificadores también se pueden incluir en los métodos de las clases de la misma
manera y con el mismo efecto que con las propiedades.
2.- POO en PHP
Herencia

La herencia permite definir clases en base a otras ya existentes. A las nuevas clases
también se les llama subclases. A las clases que sirven de base se les llama superclases.

Por ejemplo, imagina una aplicación de compra-venta de vehículos, se podría tener una
superclase vehículo con las propiedades comunes a todos los vehículos y luego diferentes
subclases con propiedades específicas que podrían ser coche, moto...

En la herencia, la encapsulación aademás de con public y private, se amplía con la


variante protected.
2.- POO en PHP
Herencia

class Producto {
public $codigo;
public $nombre;
public $nombre_corto;
public $PVP;

public function muestra ( ) {


echo $this->codigo;
}
}

Si todos los productos tienen solo esas propiedades con la clase anterior serviría, pero si por ejemplo
se tienen como productos televisores, altavoces, portátiles... hay propiedades que interesa tener de
un tipo pero no de otro.
2.- POO en PHP
Herencia

class Television extends Producto {


public $pulgadas;
public $tecnologia;
}

class Altavoz extends Producto {


public $potencia;
public $canales;
}

Con la palabra extends se indica que la nueva clase coge como base la clase indicada pero también
tendrán los atributos que se indica en la subclase.
2.- POO en PHP
Herencia

En la misma página del manual vista anteriormente se pueden consultar funciones muy útiles para el
trabajo con la herencia: funciones para clases y objetos

get_parent_class

is_subclass_of
2.- POO en PHP
Herencia

Ten en cuenta que desde una subclase no se puede acceder a una propiedad o método que sea
private en la superclase, para ello deberás definirlo como protected en la superclase.

Aunque no existe la sobrecarga de métodos sí que se permite la sobreescritura de un método en la


subclase.

class Television extends Producto {


public $pulgadas;
public $tecnologia;
public function muestra ( ) {
print $this->pulgadas . ' pulgadas’;
}
}
2.- POO en PHP
Polimorfismo

Al programar con objetos en PHP como en otros lenguajes de programación se puede usar el
polimorfismo.

Gracias al polimorfismo las subclases pueden sobrescribir métodos de sus superclases, de manera
que si la subclase no tiene definido un método que se encuentra en su superclase, al llamar a ese
método desde la subclase automáticamente se ejecutará el de la superclase.

Si la subclase también tiene definido el método entonces al realizar la llamada desde un objeto de la
subclase se ejecutará el método de la subclase.
2.- POO en PHP
Clases y métodos finales

En ocasiones no interesa que las subclases puedan redefinir el comportamiento de los métodos.

También puede interesar que no se creen subclases.

Para esto se usa la palabra final.

final class Producto ( ) {



}

public final function ejemplo ( ) {



}
2.- POO en PHP
Sobrecarga

La sobrecarga en la Programación Orientada a Objetos permite definir varias veces el mismo método
pero dependiendo de los argumentos que reciba tendrá un comportamiento u otro.

Por ejemplo, en Java para sobrecargar un método lo que hacemos es escribirlo tantas veces como se
quiera sobrecargar cada vez con unos argumentos diferentes.

En PHP la sobrecarga de métodos funciona diferente a otros lenguajes de programación orientados a


objetos.

Para sobrecargar un método en PHP solo se debe escribirlo una vez y dentro del cuerpo del método
se comprueba la cantidad y tipo de argumentos recibidos.
2.- POO en PHP
Sobrecarga – Ejemplo

class Prueba {
public function metodoSobrecargado() {
if(count(func_get_args() == 0) {
// acciones a realizar
}
else if(count(func_get_args() == 2) {
// acciones a realizar
}
}
}
Ejercicio
Encapsulación, herencia, sobrecarga y polimorfismo

Realizar el ejercicio 2 del boletín.


2.- POO en PHP
Clases y métodos abstractos

En contraposición a la instrucción final, se puede utilizar abstract que indica que esa clase no puede
tener objetos instanciados, pero sí podrá usarse como base para una subclase.

abstract class Producto { … }

Si un método se define abstract en una superclase, no podrá tener código ese módulo en la
superclase y las subclases están obligadas a definir dicho método.

abstract public function prueba ( );

No se puede declarar una clase como abstract y como final de manera simultánea.
2.- POO en PHP
Ejemplo de clases abstractas
2.- POO en PHP
class Circulo extends Figura {
public function Dibuja ( ) {
echo 'Dib Circulo '.$this->color;
}
abstract class Figura { public function Area ( ) {
protected $color; return 0;
}
public function _ _set($name, $value) { }
if ($name == 'Color' && is_string($value) === true)
$this->color = $value; class Triangulo extends Figura {
} public function Dibuja ( ) {
echo 'Dib Triang '.$this->color;
abstract public function Dibuja ( ); }
abstract public function Area ( ); public function Area() {
} return 0;
}
class Cuadrado extends Figura { }
public function Dibuja ( ) {
echo 'Dib Cuadrado '. $this->color; // Uso
} $cuadrado = new Cuadrado();
$cuadrado->Color = 'Negro'; // Se usa el _ _ set de Figura
public function Area ( ) { $cuadrado->Dibuja();
return 0;
}
}
2.- POO en PHP
Llamada a métodos de la superclase

En ocasiones aunque se sobreescriba un método en una subclase, desde esta se puede hacer que se
ejecute también el método de su superclase, para ello se usa el operador de resolución de ámbito ::
2.- POO en PHP
class Producto { class TV extends Producto {
public $codigo; public $pulgadas;
public $nombre; public $tecnologia;
public $modelo;
public $PVP; public function muestra ( ) {
print $this->pulgadas . ' pulgadas';
public function muestra ( ) { }
print $this->codigo;
} public function _ _construct($row) {
parent::construct($row);
public function _ _construct ($row) { $this->pulgadas = $row['pulgadas'];
$this->codigo = $row['cod']; $this->tecnologia = $row['tecnologia'];
$this->nombre = $row['nombre']; }
$this->modelo = $row[modelo]; }
$this->PVP = $row['PVP'];
}
}
2.- POO en PHP
Interfaces

Una interface se puede entender como una clase vacía que solo contiene declaraciones a métodos,
se usa la palabra interface. Esta clase se utiliza como plantilla para crear otras clases, de manera que
esas clases han de tener los métodos que se indican en la interface. Para que una clase siga esa
plantilla se usa la palabra implements.

interface mostrarDatos {
public function mostrar();
}

class Television extends Producto implements mostrarDatos {


public function mostrar ( ) {

}
}
2.- POO en PHP
Interfaces VS Clases abstractas

Cuando se usa la POO una de las dudas más comunes es qué solución elegir, o clases abstractas o
interfaces. Las dos soluciones permiten definir reglas para que las clases las hereden o implementen,
pero ninguna permite instanciar objetos.

● Clases abstractas: sus métodos pueden contener código, si va a haber código común en varias
subclases se implemente el código en la clase abstracta. En las interfaces si hay código común
habrá que implementarlo en todas las clases que implementen la interface.

● Atributos: las clases abstractas pueden tenerlos, las interfaces no.

● Herencia: no se puede tener herencia múltiple pero sí se puede crear una clase que
implemente varias iterfaces.
2.- POO en PHP
Traits

Como ya sabéis del curso pasado, en la Programación Orientada a Objetos no todos los lenguajes de
programación permiten la herencia múltiple.

En PHP para poder reutilizar código de diferentes “lugares” se utilizan los TRAIT.

Los traits son similares a las clases pero solo permiten agrupar funcionalidades y no se pueden
instanciar.

Se definen con la palabra reservada trait.


2.- POO en PHP
Traits – ejemplo

<?php
trait HolaMundo {
public function decirHolaMundo() {
echo 'Hola mundo';
}
}

class MiHolaMundo {
use HolaMundo;
}

$saludo = new MiHolaMundo();


$saludo->decirHolaMundo();
?>
2.- POO en PHP
Excepciones

PHP tiene un modelo de excepciones similar al de otros lenguajes de programación.

Simplemente se tiene que usar un bloque:

try – catch – finally

A un bloque try debe seguirle un bloque catch y/o un bloque finally.

A un bloque try le pueden seguir varios bloques catch para capturar diferentes tipos de excepciones.
Ejercicio
Abstractas, interfaces, traits y expecpciones

Realizar los ejercicios 3 al 5 del boletín.

Corrección de ejercicios

Ejercicio por parejas

Realizar el ejercicio 6 del boletín.

También podría gustarte