Php Avanzado

Primera edición PHP Avanzado Luis Miguel Cabezas Granado Francisco José González Lozano PHP Orientado a Objetos 1

Views 109 Downloads 4 File size 4MB

Report DMCA / Copyright

DOWNLOAD FILE

Recommend stories

Citation preview

Primera edición

PHP Avanzado

Luis Miguel Cabezas Granado Francisco José González Lozano

PHP Orientado a Objetos

1

• Orientación a Objetos • Interfaces y Clases abstractas • Espacios de nombres • Rasgos • Métodos mágicos • Principios SOLID de la orientación a objetos

Capítulo 1

PHP Orientado a Objetos

Un desarrollo orientado a objetos pensaría en cada problema como una identidad única, como un objeto. Puesto que el DNI siempre va asociado a una persona, puede crear un objeto que identifique a personas, y a su vez dentro de ese objeto programar una función (método en este caso) que pueda calcular la Letra.

Introducción

La aproximación procedural (crear una función) no asocia esa función a personas directamente y le podría pasar cualquier número entero, recibiendo una respuesta válida. En cambio, la aproximación de objetos crea la función dentro del objeto cliente y sólo permitiría, mediante técnicas que veremos más adelante, recuperar la Letra del DNI de una persona.

PHP comenzó su andadura como un simple lenguaje de scripts. A medida que las versiones avanzaban, se fueron incluyendo algunas características que permitían programar con orientación a objetos. Con la aparición de PHP 5, los desarrolladores tuvimos una verdadera plataforma de programación orientada a objetos, gracias a la potencia del nuevo engine Zend 2.0, que permitía ejecutar más rápido y eficientemente este tipo de programas. PHP 5.5 y el motor Zend 2.0 mejora considerablemente el rendimiento de las aplicaciones y añade algunas nuevas características al paradigma de la programación orientada a objetos. Actualmente, en las librerías técnicas, es posible encontrar lbros y manuales sobre lenguajes orientados a objetos como Java o C++. La programación orientada a objetos en PHP 5 no necesita una sintaxis muy diferente, sino que es una aproximación a la realidad en otro camino diferente al acostumbrado. Por ejemplo, si piensa en un programa que tenga que averiguar la Letra del DNI de un cliente, lo normal es que cree una función con un parámetro al que le pase el número de DNI y le devuelva la Letra buscada.

La programación orientada a objetos desarrolla nuevos conceptos y terminologías que deben aprenderse correctamente para poder generar buen código.

Definición de Clases Una clase es un tipo de dato que contiene, en una misma estructura, variables y funciones. Una clase es una especie de plantilla desde la que los objetos son instanciados y toman su valor. Desde una clase se pueden construir varios objetos del mismo tipo. La definición es la siguiente: class Persona { public $nombre; function getNombre() { return $this->nombre; } }

2

Mediante la palabra reservada class definimos una clase completa. Las variables que se utilizaran dentro de la clase (propiedades) se definen entre el nombre de la clase y los métodos. Los métodos son las acciones que puede realizar una clase y se definen con la palabra reservada function. class Persona { public $nombre; public $apellidos; $dni;

La clase anterior tiene tres propiedades y seis métodos para interactuar con ellas (setters y getters). Los métodos que empiezan por set (por convención) serán utilizados para dar valor a una propiedad y los que empiezan por get para obtener ese valor. Nota: El nombre de los métodos siguen la convención adoptada por PHP CamelCase, esto quiere decir que los métodos que tengan palabras compuestas hay que escribirlos con todas las palabras juntas y la primera letra de cada palabra en mayúscula exceptuando la primera (lowerCamelCase). Si un método es el encargado de copiar datos bancarios tendría que escribirse más o menos así copiarDatosBancarios.

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

Instancia de la Clase Para que el código funcione, necesita crear el objeto. Esto se hace utilizando el operador new seguido del nombre de la clase:

function setApellidos($apellidos) { $this->apellidos = $apellidos; } function getApellidos() { return $this->apellidos; } function setDni($dni) { $this->dni = $dni; } function getDni() { return $this->dni; }

$luisMiguel = new Persona();

Con el código anterior hemos creado un objeto que contiene todas las variables y funciones de la clase Persona. La variable que contiene ese objeto es $luisMiguel. Para acceder a las funciones desde el nuevo objeto creado tenemos que utilizar la variable que contiene al objeto, en este caso $luisMiguel seguido del operador ( -> ) y el nombre del método. Para trabajar correctamente, graba la definición de la clase en un archivo llamado clases.php y crea un nuevo archivo llamado ejemplo.php con el siguiente contenido:

}

3



$this->nombre = $nombre;

$this->apellidos = $apellidos;

Datos de

DNI:

Al ejecutar el ejemplo obtenemos los datos del usuario dentro de algunas etiquetas HTML.

Constructor En PHP existen algunos métodos especiales en la definición de una clase (métodos mágicos). El más importante es el constructor. Ésta se ejecuta cada vez que se crea un nuevo objeto y permite crear las variables iniciales que se necesitan. El nombre del método constructor debe ser:

Herencia La programación orientada a objetos permite heredar de otras clases. Con esta técnica se puede ahorrar mucho tiempo de trabajo. La clase hija (clase que hereda de otra) adquiere estas propiedades: • Automáticamente obtiene todas las variables miembro de la clase padre. • También obtiene todos los métodos miembro de la clase padre, que
 funcionarán exactamente de la misma forma. • La clase hija puede a su vez definir nuevas variables y funciones.

__construct()

La sintaxis es la siguiente:

Podemos añadir un constructor a la clase Persona para añadir los datos básicos en la creación de los objetos.

class Persona {

function __construct($nombre, $apellidos, $dni) {

public $nombre; public $apellidos;

4

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

las culturas exista un nombre y al menos un apellido). La clase hija hace una particularidad de la Persona para adecuarla al sistema Español, añadiendo el dni. Si creamos un objeto del tipo PersonaEspaña, todas las propiedades y métodos de la clase superior se heredarán, estando disponibles para el objeto creado.

} function setApellidos($apellidos) { $this->apellidos = $apellidos; } function getApellidos() {

Si ahora se ejecuta el código instanciando la clase que hemos creado, se puede ver que los métodos que tienen que ver con el nombre y los apellidos pueden utilizarse aunque no estén definidos en la clase PersonaEspaña.

return $this->apellidos;

Redefinición de métodos

} }

class PersonaEspaña extends Persona { public $dni;

Cuando definimos una clase hija, las funciones de la clase padre son automáticamente heredadas. Se llama redefinición de métodos a la creación de funciones en la clase hija, con el mismo nombre que en la clase padre.

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



Podemos modificar la clase Persona para que recoja los dos apellidos en propiedades distintas. Si creamos una clase PersonaUSA que herede Persona tendremos que redefinir el método getApellidos para que nos devuelva los apellidos en el orden correcto (suponiendo que en USA primero se ponga el 2º apellido y después el 1º). class Persona { public $nombre;

La palabra reservada extends indica que la nueva clase creada será una extensión (heredará) de la clase que se escribe justo a la derecha de la definición. El ejemplo anterior muestra una forma de definición de Persona muy genérica, con propiedades universales (o casi, suponiendo que en todas

public $apellido1; public $apellido2; function setNombre($nombre) { $this->nombre = $nombre; } function getNombre() {

5

return $this->nombre;

$luisMiguel->setNombre("Luis Miguel");

}

$luisMiguel->setApellidos("Cabezas", "Granado");

function setApellidos($apellido1, $apellido2) {

$luisMiguel->setId("66612345");

$this->apellido1 = $apellido1;

?>

$this->apellido2 = $apellido2;

}

Datos de

}

ID:

class PersonaUSA extends Persona {

public $id;

function setId($id) { $this->id = $id; } function getId() { return $this->id; } function getApellidos() { return $this->apellido2 . " " . $this->apellido1; } }

Herencia encadenada Algunos lenguajes de programación permiten heredar de varias clases a la vez; esto es conocido como herencia múltiple. PHP no permite herencia múltiple, pero sí herencia encadenada, es decir, permite heredar de varias clases padres correlativamente. Un ejemplo es: class A { } class B extends A {

Para ejecutar el código tendremos que modificar el archivo ejemplo1.php de esta forma:



} class C extends B { } class D extends C { }

2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/

encoding/" xmlns:tns="urn:holamundowsdl"

xmlns:soap="http://schemas.xmlsoap.