Sie sind auf Seite 1von 112

Curso: "Programacin Orientada a Objetos PHP5" 2010

Lenguaje PHP 5 Bsico

En sta primera parte veremos una


introduccin bsica del lenguaje, recordaremos
las caractersticas bsicas, sintaxis y
estructuras de PHP5.

Profesor y Autor: Andrs Guzmn F. 1


Curso: "Programacin Orientada a Objetos PHP5" 2010

Qu es PHP?
PHP es un lenguaje de programacin interpretado, diseado originalmente para la creacin de pginas
web dinmicas. Es usado principalmente en interpretacin del lado del servidor (server-side scripting)
pero actualmente puede ser utilizado desde una interfaz de lnea de comandos o en la creacin de otros
tipos de programas incluyendo aplicaciones con interfaz grfica usando las bibliotecas Qt o GTK+.

PHP es un acrnimo recursivo que significa PHP Hypertext Pre-processor (inicialmente PHP Tools, o,
Personal Home Page Tools). Fue creado originalmente por Rasmus Lerdorf en 1994; sin embargo la
implementacin principal de PHP es producida ahora por The PHP Group y sirve como el estndar de
facto para PHP al no haber una especificacin formal. Publicado bajo la PHP License, la Free Software
Foundation considera esta licencia como software libre.

PHP es un lenguaje interpretado de propsito general ampliamente usado y que est diseado
especialmente para desarrollo web y puede ser incrustado dentro de cdigo HTML. Generalmente se
ejecuta en un servidor web, tomando el cdigo en PHP como su entrada y creando pginas web como
salida. Puede ser desplegado en la mayora de los servidores web y en casi todos los sistemas
operativos y plataformas sin costo alguno. PHP se encuentra instalado en ms de 20 millones de sitios
web y en un milln de servidores, aunque el nmero de sitios en PHP ha compartido algo de su
preponderante sitio con otros nuevos lenguajes no tan poderosos desde agosto de 2005. Este mismo
sitio web de Wikipedia est desarrollado en PHP. Es tambin el mdulo Apache ms popular entre las
computadoras que utilizan Apache como servidor web. La versin ms reciente de PHP es la 5.3.0 (for
Windows) del 30 de Junio de 2009.

El gran parecido que posee PHP con los lenguajes ms comunes de programacin estructurada, como C
y Perl, permiten a la mayora de los programadores crear aplicaciones complejas con una curva de
aprendizaje muy corta. Tambin les permite involucrarse con aplicaciones de contenido dinmico sin
tener que aprender todo un nuevo grupo de funciones.

Aunque todo en su diseo est orientado a facilitar la creacin de pgina web, es posible crear
aplicaciones con una interfaz grfica para el usuario, utilizando la extensin PHP-Qt o PHP-GTK.
Tambin puede ser usado desde la lnea de rdenes, de la misma manera como Perl o Python pueden
hacerlo, a esta versin de PHP se la llama PHP CLI (Command Line Interface).

Cuando el cliente hace una peticin al servidor para que le enve una pgina web, el servidor ejecuta el
intrprete de PHP. ste procesa el script solicitado que generar el contenido de manera dinmica (por
ejemplo obteniendo informacin de una base de datos). El resultado es enviado por el intrprete al

Profesor y Autor: Andrs Guzmn F. 2


Curso: "Programacin Orientada a Objetos PHP5" 2010
servidor, quien a su vez se lo enva al cliente. Mediante extensiones es tambin posible la generacin de
archivos PDF, Flash, as como imgenes en diferentes formatos.

Permite la conexin a diferentes tipos de servidores de bases de datos tales como MySQL, Postgres,
Oracle, ODBC, DB2, Microsoft SQL Server, Firebird y SQLite.

PHP tambin tiene la capacidad de ser ejecutado en la mayora de los sistemas operativos, tales como
UNIX (y de ese tipo, como Linux o Mac OS X) y Windows, y puede interactuar con los servidores de web
ms populares ya que existe en versin CGI, mdulo para Apache, e ISAPI.

PHP es una alternativa a las tecnologas de Microsoft ASP y ASP.NET (que utiliza C# VB.NET como
lenguajes), a ColdFusion de la compaa Adobe (antes Macromedia), a JSP/Java de Sun Microsystems,
y a CGI/Perl. Aunque su creacin y desarrollo se da en el mbito de los sistemas libres, bajo la licencia
GNU, existe adems un IDE (entorno de desarrollo integrado) comercial llamado Zend Studio.
Recientemente, CodeGear (la divisin de lenguajes de programacin de Borland) ha sacado al mercado
un entorno integrado de desarrollo para PHP, denominado Delphi for PHP. Existe un mdulo para
Eclipse, uno de los IDE ms populares.

Profesor y Autor: Andrs Guzmn F. 3


Curso: "Programacin Orientada a Objetos PHP5" 2010

Historia
Fue originalmente diseado en Perl, en base a la escritura de un grupo de CGI binarios escritos en el
lenguaje C por el programador dans-canadiense Rasmus Lerdorf en el ao 1994 para mostrar su
currculum vitae y guardar ciertos datos, como la cantidad de trfico que su pgina web reciba. El 8 de
junio de 1995 fue publicado "Personal Home Page Tools" despus de que Lerdorf lo combinara con su
propio Form Interpreter para crear PHP/FI.

PHP 3

Dos programadores israeles del Technion, Zeev Suraski y Andi Gutmans, reescribieron el analizador
sintctico (parser en ingls) en el ao 1997 y crearon la base del PHP3, cambiando el nombre del
lenguaje a la forma actual. Inmediatamente comenzaron experimentaciones pblicas de PHP3 y fue
publicado oficialmente en junio del 1998.

Para 1999, Suraski y Gutmans reescribieron el cdigo de PHP, produciendo lo que hoy se conoce como
motor Zend. Tambin fundaron Zend Technologies en Ramat Gan, Israel.

PHP 4

En mayo de 2000 PHP 4 fue lanzado bajo el poder del motor Zend Engine 1.0. El da 13 de julio de 2007
se anunci la suspensin del soporte y desarrollo de la versin 4 de PHP,[1] a pesar de lo anunciado se
ha liberado una nueva versin con mejoras de seguridad,la 4.4.8 publicada el 13 de enero del 2008 y
posteriormente la versin 4.4.9 publicada el 7 de agosto de 2008.[2] Segn esta noticia [1] se dar
soporte a fallos crticos hasta el 2008-08-08...

PHP 5

El 13 de julio de 2004, fue lanzado PHP 5, utilizando el motor Zend Engine 2.0 (o Zend Engine 2). La
versin ms reciente de PHP es la 5.3.0 (30 de junio de 2009), que incluye todas las ventajas que provee
el nuevo Zend Engine 2 como:

Mejor soporte para la Programacin Orientada a Objetos, que en versiones anteriores era
extremadamente rudimentario, con PHP Data Objects.
Mejoras de rendimiento.
Mejor soporte para MySQL con extensin completamente reescrita.
Mejor soporte a XML ( XPath, DOM, etc. ).
Soporte nativo para SQLite.
Soporte integrado para SOAP.

Profesor y Autor: Andrs Guzmn F. 4


Curso: "Programacin Orientada a Objetos PHP5" 2010
Iteradores de datos.
Manejo de excepciones.

PHP 6

Est previsto el lanzamiento en breve de la rama 6 de PHP. Cuando se lance esta nueva versin
quedarn solo dos ramas activas en desarrollo (PHP 5 y 6), pues se abandon el desarrollo y soporte de
PHP 4 el 13 de julio de 2007.

Las diferencias que encontraremos frente a PHP 5.* son:

soportar Unicode;
limpieza de funcionalidades obsoletas como register_globals, safe_mode, etc.;
PECL;
mejoras en orientacin a objetos;
etc.

Profesor y Autor: Andrs Guzmn F. 5


Curso: "Programacin Orientada a Objetos PHP5" 2010

Ventajas

Es un lenguaje multiplataforma.
Completamente orientado a la web.
Capacidad de conexin con la mayora de los motores de base de datos que se utilizan en la
actualidad, destaca su conectividad con MySQL y PostgreSQL.
Capacidad de expandir su potencial utilizando la enorme cantidad de mdulos (llamados ext's o
extensiones).
Posee una amplia documentacin en su pgina oficial ([2]), entre la cual se destaca que todas
las funciones del sistema estn explicadas y ejemplificadas en un nico archivo de ayuda.
Es libre, por lo que se presenta como una alternativa de fcil acceso para todos.
Permite las tcnicas de Programacin Orientada a Objetos.
Biblioteca nativa de funciones sumamente amplia e incluida.
No requiere definicin de tipos de variables aunque sus variables se pueden evaluar tambin por
el tipo que estn manejando en tiempo de ejecucin.
Tiene manejo de excepciones (desde PHP5).

Si bien PHP no obliga a quien lo usa a seguir una determinada metodologa a la hora de programar
(muchos otros lenguajes tampoco lo hacen), aun estando dirigido a alguna en particular, el programador
puede aplicar en su trabajo cualquier tcnica de programacin y/o desarrollo que le permita escribir
cdigo ordenado, estructurado y manejable. Un ejemplo de esto son los desarrollos que en PHP se han
hecho del patrn de diseo Modelo Vista Controlador (o MVC), que permiten separar el tratamiento y
acceso a los datos, la lgica de control y la interfaz de usuario en tres componentes independientes (ver
ms abajo Frameworks en PHP).

Profesor y Autor: Andrs Guzmn F. 6


Curso: "Programacin Orientada a Objetos PHP5" 2010

Profesor y Autor: Andrs Guzmn F. 7


Curso: "Programacin Orientada a Objetos PHP5" 2010

Caractersticas de PHP
Lenguaje de scripting

Ejecutado en el servidor

Es Open Source

Especialmente diseado para el desarrollo de aplicaciones Web

Apto para la lnea de comandos

Aplicaciones graficas con PHP-GTK

Combina la programacin procedural y la programacin orientada a objetos.

Multiplataforma (Mac OSX, Windows, Linux)

Paradigmas de Programacin

Un paradigma de programacin representa un enfoque particular o filosofa para la construccin del


software. No es mejor uno que otro sino que cada uno tiene ventajas y desventajas. Tambin hay
situaciones donde un paradigma resulta ms apropiado que otro.

Procedural

Poca separacin de presentacin y lgica

Tambin llamada Espaguetti o Estructural

Programacin Orientada a Objetos

Sobre uso de clases y objetos

Profesor y Autor: Andrs Guzmn F. 8


Curso: "Programacin Orientada a Objetos PHP5" 2010

Componentes del servidor

El acrnimo LAMP se refiere a un conjunto de subsistemas de software necesarios para alcanzar una
solucin global, en este caso configurar sitios web o Servidores dinmicos con un esfuerzo reducido.

En las tecnologas LAMP esto se consigue mediante la unin de las siguientes tecnologas:

Linux, el sistema operativo


Apache, el servidor web
MySQL, el gestor de bases de datos
PHP, lenguajes de programacin.

La combinacin de estas tecnologas es usado primariamente para definir la infraestructura de un


servidor web, utilizando un paradigma de programacin para desarrollo.

A pesar de que el origen de estos programas de cdigo abierto no han sido especficamente diseado
para trabajar entre s, la combinacin se populariz debido a su bajo coste de adquisicin y ubicuidad de
sus componentes (ya que vienen pre-instalados en la mayora de las distribuciones linux). Cuando son
combinados, representan un conjunto de soluciones que soportan servidores de aplicaciones.

Tags de PHP
Como PHP fue diseado para ser incorporado en el HTML, el intrprete necesita distinguir entre
cdigo PHP y etiquetas HTML.

Los tags ms comunes son y recomendados son:

Apertura: <?php

Cierre: ?>

Comentarios
Los buenos programadores comentan su cdigo, PHP permite varias formas de hacerlo:

// esta es una lnea

# Esta tambin

/*
mltiples lneas
*/

Profesor y Autor: Andrs Guzmn F. 9


Curso: "Programacin Orientada a Objetos PHP5" 2010

Sintaxis bsica
PHP es sensible a las maysculas

Cmo se incrusta en la pgina web?

<?php ... ?> (recomendado, siempre disponible)

<?= $expresion ?> (no recomendado)

Lo anterior equivale a <? echo $expresion ?> (no recomendado)

<?php echo $expresion ?> (recomendado)

Las instrucciones se separan con un ;

Inclusin de ficheros externos:


1. include()

2. Include_once()

3. require()

4. require_once()

Ambos incluyen y evalan el fichero especificado

Diferencia: en caso de error include() produce un warning y require() un error fatal

Se usar require() si al producirse un error debe interrumpirse la carga de la pgina

El termino ONCE Revisa si el archivo ya ha sido incluido, y si es as, no lo incluye de nuevo.

Profesor y Autor: Andrs Guzmn F. 10


Curso: "Programacin Orientada a Objetos PHP5" 2010

Salida en Pantalla

Para imprimir: echo y print


echo: muestra una o ms cadenas

echo cadena1 [, cadena2]; // no es una funcin

Ejemplos:
echo Hola mundo;
echo Hola , mundo;

print: muestra una cadena

print cadena; // no es una funcin

Ejemplos:
print Hola mundo;
print Hola . mundo;

Ejemplo:
<html>
<head>
<title>Mi primer programa en PHP</title>
</head >
<body>
<?php echo Hola mundo;?>
</body >
</html>

Profesor y Autor: Andrs Guzmn F. 11


Curso: "Programacin Orientada a Objetos PHP5" 2010

Variables y Tipos de Datos

Las variables son las partes importantes de un lenguaje de programacin: ellas son las entidades
(valores, datos). Una declaracin de variable siempre contiene dos componentes, el tipo de dato de la
variable y su nombre.

En la declaracin de variable el tipo se omite ya que es un lenguaje NO Fuertemente Tipado. Es decir si


asigna un valor tipo string a la variable $var , $var se convierte en una cadena. Si luego asigna un valor
integer a $var , sta se convierte en un entero.

Por convencin, los nombres de las variables empiezan con el smbolo de peso $ seguido de una letra
minscula o underscore [ _ ], siendo los siguientes caracteres letras o dgitos.

Debe ser un identificador legal de PHP comprendido en una serie de caracteres Unicode. Por legibilidad
no se recomienda el mismo nombre que una palabra clave (reservadas del lenguaje) o el nombre de un
valor booleano (true or false). No deben tener el mismo nombre que otras variables cuyas declaraciones
aparezcan en el mismo mbito.

Si una variable est compuesta de ms de una palabra, como 'nombreDato' las palabras se ponen juntas
y cada palabra despus de la primera empieza con una letra mayscula, este tipo de escritura se conoce
como CamelCase.

El tipo de la variable determina los valores que la variable puede contener y las operaciones que se
pueden realizar con ella. Existen dos categoras de datos principales en el lenguaje: los tipos primitivos y
los tipos referenciados. Los tipos primitivos contienen un slo valor e incluyen los tipos como los enteros,
flotante, los caracteres, boleanos etc.Tenemos los arrays, las clases y los interfaces como tipos de datos
referenciados.

Profesor y Autor: Andrs Guzmn F. 12


Curso: "Programacin Orientada a Objetos PHP5" 2010

Tipos de Datos

Concepto propio de la informtica, ms especficamente de los lenguajes de programacin, aunque


tambin se encuentra relacionado con nociones similares de las matemticas y la lgica.

En lenguajes de programacin un tipo de dato es un atributo de una parte de los datos que indica al
ordenador (y/o el programador) algo sobre la clase de datos sobre los que se va a procesar. Esto incluye
imponer restricciones en los datos, como qu valores pueden tomar y qu operaciones se pueden
realizar. Tipos de datos comunes son: enteros, nmeros de coma flotante (decimales), cadenas
alfanumricas, fechas, horas, colores, coches o cualquier cosa que se nos ocurra.

En un sentido amplio, un tipo de datos define un conjunto de valores y las operaciones sobre estos
valores. Casi todos los lenguajes de programacin explcitamente incluyen la notacin del tipo de datos,
aunque lenguajes diferentes pueden usar terminologa diferente. La mayor parte de los lenguajes de
programacin permiten al programador definir tipos de datos adicionales, normalmente combinando
mltiples elementos de otros tipos y definiendo las operaciones del nuevo tipo de dato. Por ejemplo, un
programador puede crear un nuevo tipo de dato llamado "Persona" que especifica que el dato
interpretado como Persona incluir un nombre y una fecha de nacimiento.

Un tipo de dato puede ser tambin visto como una limitacin impuesta en la interpretacin de los datos
en un sistema de tipificacin, describiendo la representacin, interpretacin y la estructura de los valores
u objetos almacenados en la memoria del ordenador. El sistema de tipificacin usa informacin de los
tipos de datos para comprobar la verificacin de los programas que acceden o manipulan los datos.

Profesor y Autor: Andrs Guzmn F. 13


Curso: "Programacin Orientada a Objetos PHP5" 2010
PHP soporta ocho tipos primitivos

Cuatro tipos escalares:

Boolean

Integer

Float (nmero de punto flotante, tambin conocido como double)

String

Dos tipos compuestos:

Array

Object

Dos tipos especiales

Resource

NULL

Profesor y Autor: Andrs Guzmn F. 14


Curso: "Programacin Orientada a Objetos PHP5" 2010

Booleanos

El tipo de dato lgico o booleano es en computacin aquel que puede representar valores de
lgica binaria, esto es, valores que representen falso o verdadero. Se utiliza normalmente en la
programacin, estadstica, electrnica, matemticas (lgebra booleana), etc...

Para generar un dato o valor lgico a partir de otros tipos de datos, tpicamente, se emplean los
operadores relacionales (u operadores de relacin), por ejemplo: 0 es igual a falso y 1 es igual
a verdadero

Entonces Tenemos que:

Este es el tipo ms simple. Un boolean expresa un valor de verdad. Puede ser TRUE or
FALSE
Para especificar un literal boolean, use alguna de las palabras clave TRUE o FALSE. Ambas
son insensibles a maysculas y minsculas
Como estndar se prefiere escritas en minsculas

Profesor y Autor: Andrs Guzmn F. 15


Curso: "Programacin Orientada a Objetos PHP5" 2010

Enteros

Un tipo de dato entero en computacin es un tipo de dato que puede representar un subconjunto finito de
los nmeros enteros. El nmero mayor que puede representar depende del tamao del espacio usado
por el dato y la posibilidad (o no) de representar nmeros negativos. Los tipos de dato entero disponibles
y su tamao dependen del lenguaje de programacin usado as como la arquitectura en cuestin.

Un integer es un nmero del conjunto Z = {..., -2, -1, 0, 1, 2, ...}.

Profesor y Autor: Andrs Guzmn F. 16


Curso: "Programacin Orientada a Objetos PHP5" 2010

Nmeros Reales

El tipo de dato real define un conjunto de nmeros que pueden ser representados con la notacin de
coma flotante.

Al igual que los nmeros enteros, el tipo real est limitado superior e inferiormente segn la cantidad de
memoria que haya disponible para almacenarlo. Otro elemento importante a tener en cuenta en este tipo
de datos es la precisin con que pueden representar nmero con decimales (cuantos decimales se
pueden representar), esta caracterstica tambin est directamente relacionada con la cantidad de
memoria disponible para almacenar un valor real.

Los nmeros de punto flotante (tambin conocidos como "flotantes", "dobles" o "nmeros reales")

Pueden ser especificados usando cualquiera de las siguientes sintaxis:

Profesor y Autor: Andrs Guzmn F. 17


Curso: "Programacin Orientada a Objetos PHP5" 2010

Cadenas

En matemticas o en programacin, una cadena de caracteres, palabra, ristra de caracteres o frase


(string en ingls) es una secuencia ordenada de longitud arbitraria (aunque finita) de elementos que
pertenecen a un cierto alfabeto. En general, una cadena de caracteres es una sucesin de caracteres
(letras, nmeros u otros signos o smbolos).

En matemticas es habitual usar las letras w, x, y,... para referirnos a las cadenas. Por ejemplo, si
tenemos un alfabeto S = {a, b, c}, una cadena podra ser: x = aacbbcba.

Desde un punto de vista de la programacin, si no se ponen restricciones al alfabeto, una cadena podr
estar formada por cualquier combinacin finita de todo el juego caracteres disponibles (las letras de la 'a'
a la 'z' y de la 'A' a la 'Z', los nmeros del '0' al '9', el espacio en blanco ' ', smbolos diversos '!', '@', '%',
etc). En este mismo mbito (el de la programacin), se utilizan normalmente como un tipo de dato
predefinido, para palabras, frases o cualquier otra sucesin de caracteres. En este caso, se almacenan
en un vector de datos, o matriz de datos de una sola fila (array en ingls). Las cadenas se pueden
almacenar fsicamente:

Seguidas.
Enlazados letra a letra.

Generalmente son guardados un carcter a continuacin de otro por una cuestin de eficiencia de
acceso.

Un caso especial de cadena es la que contiene cero caracteres, a esta cadena se la llama cadena vaca.

Resumiendo, tenemos que:

Un valor string es una serie de caracteres.


PHP no tiene soporte nativo de Unicode hasta PHP6.
Las cadenas de texto pueden ser encerradas de tres maneras.
' Comillas simples, estas cadenas son mostradas tal cual son
" Comillas dobles, variables y secuencias de escape son reemplazadas por su valor

Profesor y Autor: Andrs Guzmn F. 18


Curso: "Programacin Orientada a Objetos PHP5" 2010

Sintaxis HEREDOC

Similar a las comillas dobles, pero permite mltiples lneas, y no necesita proteger las comillas.

Profesor y Autor: Andrs Guzmn F. 19


Curso: "Programacin Orientada a Objetos PHP5" 2010

Profesor y Autor: Andrs Guzmn F. 20


Curso: "Programacin Orientada a Objetos PHP5" 2010

Variables predefinidas:
PHP tiene un gran nmero de variables predefinidas que se pueden utilizar desde cualquiera de tus
scripts de PHP, por las cuales puedes sacar informacin til, como el navegador del usuario, del
servidor, nmero de argumentos pasados al script, entre otros.

Aunque tambin cabe decir que muchas de esas variables no pueden estar completamente
documentadas ya que dependen de sobre qu servidor se est ejecutando, la versin y configuracin de
dicho servidor, y otros factores. Para una lista de variables predefinidas y mucha ms informacin til,
por favor, vea y use phpinfo().

$_SERVER, Un array asociativo de variables con informacin del servidor: Path o rutas
fsicas.Header, direccin IP y nombre de servidor y dominio.
$_GET Un array asociativo de variables pasadas al script actual mediante el mtodo HTTP GET.
$_POST Un array asociativo de variables pasadas al script actual mediante el mtodo HTTP
POST.
$_COOKIES Un array asociativo de variables pasadas al script actual mediante cookies HTTP.,
$_FILES Un array asociativo de variables pasadas al script actual mediante el mtodo HTTP
POST FILE.
$_ENV.
$_REQUEST Un array asociativo de variables pasadas al script actual mediante el mtodo HTTP
POST, GET y COOKIES.
$_SESSION Un array asociativo de variables pasadas al script actual mediante el mtodo HTTP
SESSION.

Profesor y Autor: Andrs Guzmn F. 21


Curso: "Programacin Orientada a Objetos PHP5" 2010

Identificadores

Un identificador es un nombre que le damos a un elemento, es decir, una clase, una interface, un
mtodo, una propiedad o variable y objetos. PHP distingue entre maysculas y minsculas.

Los identificadores pueden comenzar por una letra, un subrayado o un smbolo de dlar, siendo los
siguientes caracteres letras o dgitos. No debe ser el mismo que una palabra clave.

Profesor y Autor: Andrs Guzmn F. 22


Curso: "Programacin Orientada a Objetos PHP5" 2010

Operadores
Aritmticos

Los operadores sirven para unir identificadores y literales para formar expresiones, que son el resultado
de una operacin.

Los operadores aritmticos se usan para realizar clculos de aritmtica de nmeros reales y de
aritmtica de punteros.

PHP dispone de los operadores aritmticos clsicos:

Tambin tenemos a los operadores combinados:

Ejemplos:
-=, +=, /= .*= etc. a = 3; a += 5; a vale 8

a /= b es equivalente a a = a / b

Profesor y Autor: Andrs Guzmn F. 23


Curso: "Programacin Orientada a Objetos PHP5" 2010

Aritmticos - incremento y decremento

Ejemplo Nombre Efecto

++$a Pre-incremento Incrementa a en uno, y luego devuelve a.

$a++ Post-incremento Devuelve a, y luego incrementa a en uno.

--$a Pre-decremento Decrementa a en uno, luego devuelve a.

$a-- Post-decremento Devuelve a, luego decrementa a en uno.

Los operadores de incremento y decremento se pueden colocar tanto antes como despus de la
expresin que deseemos modificar pero slo devuelven el valor modificado si estn delante.

$a = 1; $b = ++$a; En este primer caso, a valdr 2 y b 2 tambin.

$a = 1; $b = $a++; Ahora, a sigue valiendo 2, pero b es ahora 1.

Profesor y Autor: Andrs Guzmn F. 24


Curso: "Programacin Orientada a Objetos PHP5" 2010

Comparacin

Los operadores de comparacin toman dos variables / valores y las comparan. Devuelven un valor lgico
que ser true si la comparacin fue exitosa y false en caso contrario.

El smbolo ===, ejemplo $encontrado === true. Significa que son idnticos y adems de tener el mismo
valor tienen el mismo tipo de datos.

Lo mismo con $a !== $b, son NO idnticos.

Profesor y Autor: Andrs Guzmn F. 25


Curso: "Programacin Orientada a Objetos PHP5" 2010

Lgicos

Los operadores lgicos permiten evaluar expresiones lgicas complejas

Existen otros operadores La concatenacin de cadenas, por ejemplo, se realiza con el smbolo +
y el operador condicional

El operador condicional tiene esta estructura: condicion ? valor1 : valor2

Si la condicin se cumple devuelve el primer valor y, en caso contrario, el segundo. El siguiente


ejemplo asignara a la variable a un 2:

int a = 2 > 3 ? 1 : 2

Profesor y Autor: Andrs Guzmn F. 26


Curso: "Programacin Orientada a Objetos PHP5" 2010

Constantes
Constantes permiten crear un identificador especial que no puede ser cambiado una vez creado.

Funcin define()

Definicin de constantes:

define(CONSTANTE, hola);

print CONSTANTE;

No llevan $ delante

Slo se pueden definir constantes de los tipos escalares (boolean, integer, double, string)

Separadores
Existen otros caracteres con significado especial en PHP. Son los separadores:

Separador Descripcin

Contienen listas de parmetros, tanto en la definicin de un mtodo como en la


() llamada al mismo. Tambin se utilizan para modificar la precedencia en una expresin,
contener expresiones para control de flujo y realizar conversiones de tipo.

Se utilizan para definir bloques de cdigo, definir mbitos y contener los valores
{}
iniciales de los vectores.

Se utiliza tanto para declarar vectores o matrices como para referenciar valores dentro
[]
de los mismos.

; Separa sentencias.

Separa identificadores consecutivos en la declaracin de variables y en las listas de


,
parmetros. Tambin se utiliza para encadenar sentencias dentro de una estructura for.

Separa un nombre de propiedad o mtodo de una variable de referencia. Tambin


->
separa nombre de una clase.

Profesor y Autor: Andrs Guzmn F. 27


Curso: "Programacin Orientada a Objetos PHP5" 2010

Flujo de Control
If Else

Esta es la versin ms sencilla de la sentencia if: la sentencia gobernada por if se ejecuta si alguna
condicin es verdadera.

Generalmente, la forma sencilla de if se puede escribir as.

Si la expresin es falsa podemos hacer uso de else :

Serie de comparaciones else if y una setencia else :

Profesor y Autor: Andrs Guzmn F. 28


Curso: "Programacin Orientada a Objetos PHP5" 2010

Switch

La sentencia switch se utiliza para realizar sentencias condicionalmente basadas en alguna expresin.

La sentencia switch evala su expresin, y ejecuta la sentencia case apropiada.

La sentencia break hace que el control salga de la sentencia switch y contine con la siguiente lnea.

Si no existe coincidencia, se ejecuta la sentencia default.

Profesor y Autor: Andrs Guzmn F. 29


Curso: "Programacin Orientada a Objetos PHP5" 2010

Sin embargo, hay ciertos escenarios en los que querrs que el control proceda secuencialmente

Profesor y Autor: Andrs Guzmn F. 30


Curso: "Programacin Orientada a Objetos PHP5" 2010

While
La sentencia while es la ms sencillas de las estructuras de iteracin. La sentencia while realiza una
accin mientras se cumpla una cierta condicin.

Esto es, mientras la expresin sea verdadera, ejecutar la sentencia. La condicin tiene que tomar un
valor booleano (verdadero o false).

Es una estructura de iteracin pre-prueba, primero evala la expresin antes de ejecutar cualquiera
sentencia.

Do While
Es similar al bucle while que se vi anteriormente, excepto en que la expresin se avala al final del
bucle.

Es conveniente utilizar la sentencia do-while cuando el bucle debe ejecutarse al menos una vez. Es una
estructura de iteracin post-prueba, primero ejecutar la sentencia y al final evala la expresin
continuar con el loop.

Profesor y Autor: Andrs Guzmn F. 31


Curso: "Programacin Orientada a Objetos PHP5" 2010

For

Puedes utilizar este bucle cuando conozcas los lmites del bucle (su instruccin de inicializacin, su
criterio de terminacin y su instruccin de incremento).

Por ejemplo, el bucle for se utiliza frecuentemente para iterar sobre los elementos de un array, o los
caracteres de una cadena.

Inicializacin es la sentencia que inicializa el bucle -- se ejecuta una vez al iniciar el bucle. Terminacin es
una sentencia que determina cuando se termina el bucle. Esta expresin se evala al principio de cada
iteracin. Cuando la expresin se evala a false el bucle se termina.

Finalmente, incremento es una expresin que se invoca en cada interaccin del bucle

Profesor y Autor: Andrs Guzmn F. 32


Curso: "Programacin Orientada a Objetos PHP5" 2010

Operador new

El operador new reserva memoria dinmica para un objeto, tambin hace que se invoque el constructor
de la clase. Si el constructor recibe parmetro se debe indicar entre los parntesis.

Al crear un objeto estamos ejemplarizando una clase. El operador new ejemplariza una clase mediante
la asignacin de memoria para el objeto nuevo de ese tipo.

new necesita un slo argumento una llamada al mtodo constructor

Esta sentencia realmente realiza tres acciones: declaracin, ejemplarizacin e inicializacin.

Profesor y Autor: Andrs Guzmn F. 33


Curso: "Programacin Orientada a Objetos PHP5" 2010

Matrices
Un arreglo en PHP es un mapa ordenado, es decir tipo de datos que asocia valores con claves. sta toma
un cierto nmero de parejas clave => valor separadas con coma. Clave puede ser un integer o string,
valor puede ser cualquier valor.

Este tipo es optimizado para varios usos diferentes; puede ser usado como una matriz real, una lista
(vector), tabla asociativa (caso particular de implementacin de un mapa), diccionario, coleccin, pila,
cola y probablemente ms. Los valores de una matriz pueden ser otras matrices, tambin es posible
crear rboles y matrices multidimensionales.

Se puede acceder al nmero de elementos mediante la funcin count().

Se puede acceder a los elemento con los corchetes [] y un ndice que vara de 0 a length-1.

Como todos los objetos los arreglos se pasan como argumentos a los mtodos por referencia.

Profesor y Autor: Andrs Guzmn F. 34


Curso: "Programacin Orientada a Objetos PHP5" 2010
Dado que el valor de una matriz puede ser cualquier cosa, tambin puede ser otra matriz. De esta forma
es posible crear matrices recursivas y multi-dimensionales.

Iterador Foreach

Es una estructura que nos permite de un modo fcil iterar sobre matrices.

Foreach slo funciona en los arrays, y emitir un mensaje de error al intentar utilizar una variable de
otro tipo. Hay dos sintaxis, la segunda es una pequea pero til extensin de la primera:

Profesor y Autor: Andrs Guzmn F. 35


Curso: "Programacin Orientada a Objetos PHP5" 2010

Lenguaje PHP 5 POO

En ste captulo veremos la Programacin


orientada a objetos en PHP5, cuales son las
caractersticas y principios bsico de este
paradigma..

Profesor y Autor: Andrs Guzmn F. 36


Curso: "Programacin Orientada a Objetos PHP5" 2010

Nuestros Principios como


Desarrolladores

Peor que usar un mal estndar o un estndar incorrecto es no seguir ninguno, de la misma forma, no
tener ningn criterio para enfrentar los desarrollos. Para aumentar la productividad, tanto
individualmente como en equipo, debemos siempre seguir estndares y fijar criterios.

Profesor y Autor: Andrs Guzmn F. 37


Curso: "Programacin Orientada a Objetos PHP5" 2010

La sencillez es la mejor arquitectura


Los objetos como concepto -fuera de la informtica- existen desde antes de la programacin
(obviamente).

Qu es lo que intenta hacer entonces la Programacin Orientada a los Objetos (POO)?

Lisa y llanamente intentar simplificar la complejidad (simplificar las abstracciones) y tratar de


representar de forma simple lo que vemos y manejamos todos los das los objetos que nos rodean.

Entonces, la Programacin Orientada a Objetos no es ms que eso, detectar los objetos existentes en
nuestro contexto y construirlos, dndoles un comportamiento y que estos sepan solos cmo reaccionar
ante la interaccin con otros objetos (ms adelante a esa actividad le llamaremos diseo).

Nada ms y nada menos... y hemos logrado empezar a hablar del tema sin mostrar -hasta el momento -
una sola lnea de cdigo.

Profesor y Autor: Andrs Guzmn F. 38


Curso: "Programacin Orientada a Objetos PHP5" 2010

Nuestros Principios

RTFM: Lee el Maldito Manual


RTFM es una sigla que significa lee el maldito manual, algo muy usado en los foros como respuesta
hacia los novatos que lo ltimo que hacen es leerlos (lamentablemente *todo* se encuentra ah) .

http://es.wikipedia.org/wiki/RTFM

DRY: No Te Repitas
No te repitas significa algo muy simple: si cuando desarrollas ves que al programar copias un cdigo
para pegarlo en otro lado, es muy probable que ests haciendo algo mal, ya que ese cdigo debera
estar aislado y ser usado de a travs de parmetros.

Generalmente no existe razn para tener que duplicar el cdigo, si estamos muy apurados, seguro, lo
pagaremos muy caro dentro de poco.

http://es.wikipedia.org/wiki/DRY

KISS: Mantenlo Simple


Hay una frase que dice la mejor arquitectura es la sencillez. La sencillez es escalable, si resolvemos
pequeos problemas y luego los unimos, ser ms fcil que hacer un sistema complejo de entrada.

http://es.wikipedia.org/wiki/Principio_KISS

ZEND: Estndar de Codificacin PHP


El lenguaje PHP y su comunidad, por aos, no ha tenido ningn referente nico para seguir un estndar,
por consiguiente los desarrolladores usan o inventan el que ms le quede cmodo.

En la actualizada la empresa Zend Technologies, creadora de PHP y Zend Framework, ha tomado cada
vez ms protagonismo (principalmente por su framework), por lo que debera ser de ahora en ms
nuestra referencia a seguir. Evita crear un estndar propio, usa el definido por Zend.

http://framework.zend.com/manual/en/coding-standard.html

Profesor y Autor: Andrs Guzmn F. 39


Curso: "Programacin Orientada a Objetos PHP5" 2010

"Un sistema complejo que funciona resulta invariablemente de la evolucin de un sistema simple que
funcionaba. Un sistema complejo diseado desde cero nunca funciona y no puede ser arreglado para que
funcione. Tienes que comenzar de nuevo con un sistema simple que funcione." John Gall

Profesor y Autor: Andrs Guzmn F. 40


Curso: "Programacin Orientada a Objetos PHP5" 2010

Caractersticas de la POO
Abstraccin
Denota las caractersticas esenciales de un objeto, donde se capturan sus comportamientos.

Cada objeto en el sistema sirve como modelo de un "agente" abstracto que puede realizar trabajo,
informar y cambiar su estado, y "comunicarse" con otros objetos en el sistema sin revelar cmo se
implementan estas caractersticas. Se refiere al nfasis en el "qu hace?" ms que en el "cmo lo
hace?"

Encapsulamiento
Significa reunir a todos los elementos que pueden considerarse pertenecientes a una misma entidad, al
mismo nivel de abstraccin. Cada objeto es nico y diferenciable de los dems.

Esto permite aumentar la cohesin de los componentes del sistema. Algunos autores confunden este
concepto con el principio de ocultacin, principalmente porque se suelen emplear conjuntamente.

Principio de ocultacin
Cada objeto est aislado del exterior. Cada tipo de objeto expone una interfaz a otros objetos que
especfica cmo pueden interactuar con los objetos de la clase.

El aislamiento protege a las propiedades de un objeto contra su modificacin por quien no tenga
derecho a acceder a ellas, solamente los propios mtodos internos del objeto pueden acceder a su
estado. Esto asegura que otros objetos no pueden cambiar el estado interno de un objeto de maneras
inesperadas, eliminando efectos secundarios e interacciones inesperadas.

Polimorfismo
Comportamientos diferentes, asociados a objetos distintos, pueden compartir el mismo nombre, al
llamarlos por ese nombre se utilizar el comportamiento correspondiente al objeto que se est usando.
O dicho de otro modo, las referencias y las colecciones de objetos pueden contener objetos de
diferentes tipos, y la invocacin de un comportamiento en una referencia producir el comportamiento
correcto para el tipo real del objeto referenciado.

Lo vemos en la herencia e interfaces y en sobre escritura de mtodos entre otras tcnicas.

Profesor y Autor: Andrs Guzmn F. 41


Curso: "Programacin Orientada a Objetos PHP5" 2010

Herencia
Las clases no estn aisladas, sino que se relacionan entre s, formando una jerarqua de clasificacin. Los
objetos heredan las propiedades y el comportamiento de todas las clases a las que pertenecen.

La herencia facilita el polimorfismo y el encapsulamiento permitiendo a los objetos ser definidos y


creados como tipos especializados de otros objetos. Estos pueden compartir (y extender) su
comportamiento sin tener que volver a implementarlo.

Cuando un objeto hereda de ms de una clase se dice que hay herencia mltiple

Profesor y Autor: Andrs Guzmn F. 42


Curso: "Programacin Orientada a Objetos PHP5" 2010

Tipos de entidades
Clases y Objetos

La POO es un paradigma que tiene sus orgenes desde antes de 1990 (a partir de este ao se empieza a
popularizar). Por lo tanto no es ninguna excusa (menos como Desarrollador PHP) seguir a la fecha
desconociendo cmo trabajar con POO.

La programacin orientada a objetos expresa un programa como un conjunto de estos objetos, que
colaboran entre ellos para realizar tareas. Esto permite hacer los programas y mdulos ms fciles de
escribir, mantener y reutilizar.

Una CLASE es un proyecto, o prototipo, que define las variables y los mtodos comunes a un cierto tipo
de objetos. Son las plantillas de las que luego se pueden crear mltiples objetos del mismo tipo, cada
objeto tendr sus propios valores y compartirn las mismas funciones.

Los objetos son entidades que combinan estado (los datos), comportamiento e identidad nica que lo
diferencia del resto.De esta forma, un objeto contiene toda la informacin que permite definirlo e
identificarlo frente a otros objetos pertenecientes a otras clases e incluso frente a objetos de una misma
clase

Primero deberemos crear una clase antes de poder crear objetos o ejemplares de esa clase.

Profesor y Autor: Andrs Guzmn F. 43


Curso: "Programacin Orientada a Objetos PHP5" 2010

Declarar una Clase

Como mnimo, la declaracin de una clase debe contener la palabra clave class y el nombre de la clase
que est definiendo. El nombre de la clase no puede llamarse igual que una palabra reservada del
lenguaje.

La implementacin de una clase comprende dos componentes: la declaracin y el cuerpo de la clase.

Por convencin, deben empezar por una letra mayscula y debe ser llamada igual que el nombre de su
archivo.

Muchas veces, todo lo que se necesitar ser una declaracin mnima. Sin embargo, la declaracin de
una clase puede decir ms cosas sobre la clase.

En PHP, todas las clases pueden tener una superclase. Una clase puede heredar mtodos y miembros de
otra clase utilizando la palabra reservada extends en su declaracin.

Ms especficamente, dentro de la declaracin de la clase se puede.

1. Declarar cual es la superclase de la clase.


2. Listar los interfaces implementados por la clase
3. Declarar si la clase es abstracta o final

"La complejidad es destructiva. Absorbe la sangre de los desarrolladores, hace que los productos sean
difciles de planificar, construir y probar, introduce problemas de seguridad y provoca la frustracin de
usuarios finales y administradores" -- Ray Ozzie

Profesor y Autor: Andrs Guzmn F. 44


Curso: "Programacin Orientada a Objetos PHP5" 2010

Modificadores de las Clase

Se puede utilizar uno de estos dos modificadores en una declaracin de clase para declarar que esa clase
es abstracta o final. Los modificadores van delante de la palabra clave class y son opcionales.

El modificador abstract declara que la clase es una clase abstracta. Una clase abstracta podra contener
mtodos abstractos (mtodos sin implementacin). Una clase abstracta est diseada para ser una
superclase y no puede ejemplarizarse.

Utilizando el modificador final se puede declarar que una clase es final, que no puede tener subclases.
Existen (al menos) dos razones por las que se podra querer hacer esto: razones de seguridad y razones
de diseo.

En suma, una declaracin de clase se parecera a esto:

Modificadores declaran si la clase es abstracta o final.

NombredeClase selecciona el nombre de la clase que est declarando comenzando con


mayscula

NombredeSuperClase es el nombre de la superclase de NombredeClase

NombredeInterface es una lista delimitada por comas de los interfaces implementados por
NombredeClase

De todos estos tems, slo la palabra clave class y el nombre de la clase son necesarios. Los otros
son opcionales

Profesor y Autor: Andrs Guzmn F. 45


Curso: "Programacin Orientada a Objetos PHP5" 2010

Cuerpo de una Clase

La pgina anterior describe todos los componentes de la declaracin de una clase. Esta pgina describe
la estructura general y la organizacin del cuerpo de la clase.

El cuerpo de la clase compone la implementacin de la propia clase y contiene dos secciones diferentes:

la declaracin de variables
y la de mtodos

Una variable miembro de la clase representa un estado de la clase, sus mtodos implementa el
comportamiento de la clase.

Dentro del cuerpo de la clase se definen todas las variables miembros y los mtodos soportados por la
clase. Tpicamente, primero se declaran las variables miembros de la clase y luego se proporcionan las
declaraciones e implementaciones de los mtodos, aunque este orden no es necesario.

Tpicamente, y como un estndar en Zend los nombres de los mtodos y miembros/variables comienzan
con minscula. En las Clases el tag ?> de cierre no va (Estndar Zend)

Como estndar en PHP5 y Zend los nombres de clase siempre comienzan con mayscula, mientras que
los nombre de variables y mtodos comienzan en minscula.

Cuando son nombres compuesto se debe separar con una letra Mayscula en la primera letra de la
palabra compuesta. El estilo de escritura de palabra compuesta se le conoce con el nombre CamelCase.
De esta forma el nombre de una clase podra ser MiClaseDeUpperCamelCase y de un mtodo o variable
miMetodoDeLowerCamelCase().

El nombre del archivo php de la clase se tiene que llamar de la misma manera que el nombre de la
misma clase que la contiene. Siempre debe haber una clase por archivo.

"Hay dos maneras de disear software: una es hacerlo tan simple que sea obvia su falta de deficiencias,
y la otra es hacerlo tan complejo que no haya deficiencias obvias" -- C.A.R. Hoare

Profesor y Autor: Andrs Guzmn F. 46


Curso: "Programacin Orientada a Objetos PHP5" 2010

Los atributos son siempre protegidos o privados y se acceden/modifican mediante los mtodos
getter/setter. Ej getNombre(). Uno de los principios bsico de Programacin orientada a objetos
"Principio de ocultacin.

Adems de las variables miembros y los mtodos que se declaran explcitamente dentro del cuerpo de la
clase, una clase puede heredar algo de su superclase.

Declarar Variables de una Clase


Como mnimo, una declaracin de variable miembro tiene dos componentes: el modificador de acceso y
el nombre de la variable, por convencin empieza con una letra minscula. Junto con el nombre, se
pueden especificar la visibilidad de la variable, tipos de acceso son:public, private o protected.

En general los atributos private y protected siempre inician con "_" (underscore).

Adems especificar si la variable es una variable de clase o una variable de ejemplar, y si la variable es
una constante.

Una declaracin de variable miembro define los siguientes aspectos de la variable:

especificadordeAcceso define si otras clases tienen acceso a la variable


static indica que la variable es una variable miembro de la clase en oposicin a una variable
miembro del ejemplar
const indica que la variable es una constante

Profesor y Autor: Andrs Guzmn F. 47


Curso: "Programacin Orientada a Objetos PHP5" 2010

"Mucho software hoy da es en cierta medida como una pirmide egipcia con millones de piedras
apiladas una encima de otra, sin integridad estructural, construido por fuerza bruta y miles de esclavos."

Por Alan Kay (cientfico de la computacin)

Profesor y Autor: Andrs Guzmn F. 48


Curso: "Programacin Orientada a Objetos PHP5" 2010

Implementar Mtodos

La implementacin de un mtodo consiste en dos partes, la declaracin y el cuerpo del mtodo.

Los nicos elementos necesarios para una declaracin de mtodo son el nombre y el tipo de
modificador de acceso o visibilidad. Respecto a la visibilidad del mtodo, los tipos de acceso son
public, private o protected.

Junto con el nombre del mtodo y el modificador, la declaracin lleva informacin como el nmero y el
tipo de los argumentos.

Los mtodos utilizan el operador return para devolver un valor. Todo mtodo que no sea declarado
como void debe contener una sentencia return.

Por convencin empieza con una letra minscula. En general los mtodos private y protected siempre
inician con "_" (underscore)

Mtodos Abstractos y Finales


Una clase abstracta puede contener mtodos abstractos, esto es, mtodos que no tienen
implementacin. De esta forma, una clase abstracta puede definir un interface de programacin
completo, incluso proporciona a sus subclases la declaracin de todos los mtodos necesarios para
implementar el interface de programacin.

El Cuerpo de un Mtodo
Junto a los elementos normales del lenguaje, se puede utilizar this en el cuerpo del mtodo para
referirse a los miembros del objeto actual. Tambin se puede utilizar this para llamar a uno de los
mtodos del objeto actual.

Se utiliza parent para referirse a los miembros y mtodos de la superclase que el objeto actual haya
ocultado mediante la sobre escritura.

Un cuerpo de mtodo tambin puede contener declaraciones de variables que son locales de ese
mtodo.

Profesor y Autor: Andrs Guzmn F. 49


Curso: "Programacin Orientada a Objetos PHP5" 2010

Constructor

Los constructores se utilizan para inicializar el objeto. Cuando se crea un objeto (se instancia una clase)
es posible definir un proceso de inicializacin que prepare el objeto para ser usado. Esta inicializacin se
lleva a cabo invocando un mtodo especial denominado constructor.

El constructor en PHP5 se escribe como: __construct

Esta invocacin es implcita y se realiza automticamente cuando se utiliza el operador new. Entonces
los constructores slo pueden ser llamados con el operador new.

Puede recibir cualquier nmero de argumentos de cualquier tipo, como cualquier otro mtodo. No
devuelve ningn valor (void).

El constructor no es un miembro ms de una clase. Slo es invocado cuando se crea el objeto (con el
operador new). No puede invocarse explicitamente en ningn otro momento.

Si no se define explcitamente uno, PHP5 crea uno por defecto, sin argumentos.

Cuando se instancia un objeto, se tienen que realizar varios pasos en su inicializacin, por ejemplo dar
valores a sus atributos, abrir una conexin a la base de datos etc.

Profesor y Autor: Andrs Guzmn F. 50


Curso: "Programacin Orientada a Objetos PHP5" 2010

Destructor

Tambin tenemos a los destructores: __destruct

Los destructores son funciones que se encargan de realizar las tareas que se necesita ejecutar cuando
un objeto deja de existir. Cuando un objeto ya no est referenciado por ninguna variable, deja de tener
sentido que est almacenado en la memoria, por tanto, el objeto se debe destruir para liberar su
espacio. En el momento de su destruccin se llama a la funcin destructor, que puede realizar las tareas
que el programador estime oportuno realizar.

La creacin del destructor es opcional. Slo debemos crearlo si deseamos hacer alguna cosa cuando un
objeto se elimine de la memoria.

"Depurar cdigo es dos veces ms difcil que escribir cdigo, por lo tanto si escribes el cdigo tan
inteligentemente como te sea posible, por definicin no sers lo suficientemente inteligente como para
depurarlo"

Profesor y Autor: Andrs Guzmn F. 51


Curso: "Programacin Orientada a Objetos PHP5" 2010

Sobrescritura de mtodos
Una clase puede sobrescribir un mtodo de sus superclases. El mtodo que sobrescribe debe tener el
mismo, nombre, tipo de retorno y lista de parmetros que el mtodo al que ha sobrescrito

La sobrescritura de mtodos es algo bastante comn en mecanismos de herencia, puesto que los
mtodos que fueron creados para una clase "padre" no tienen por qu ser los mismos que los definidos
en las clases que heredan.

Polimorfismo puro, comportamientos diferentes, asociados a objetos distintos.

Clase Abstracta
Algunas veces, una clase que se ha definido representa un concepto abstracto y como tal, no debe ser
ejemplarizado.

Es decir cuando se desarrolla un jerarqua de clases en que algn comportamiento est presente en
todas ellas peo se materializa de distintas formas para cada una.

Por ejemplo, la comida en la vida real. Has visto algn ejemplar de comida? No. Lo que has visto son
ejemplares de manzanas, pan, y chocolate. Comida representa un concepto abstracto de cosas que son
comestibles. No tiene sentido que exista un ejemplar de comida.

Por ejemplo, la clase Number del paquete java.lang representa el concepto abstracto de nmero. Otros
ejemplos Clase ElementForm, Figuras Geomtricas, Personas, Mamferos, Automvil etc.

"Medir el progreso de programacin en lneas de cdigo es como medir el progreso de construccin de


un avin en peso: Bill Gates

Profesor y Autor: Andrs Guzmn F. 52


Curso: "Programacin Orientada a Objetos PHP5" 2010

Lenguaje PHP 5

Caractersticas Avanzadas

De la POO

En ste captulo veremos otras


caractersticas avanzadas de la Programacin
Orientada a Objetos en PHP5, Herencia,
Abstraccin e Interfaces.

Profesor y Autor: Andrs Guzmn F. 53


Curso: "Programacin Orientada a Objetos PHP5" 2010

"Hay dos formas de disear software: la primera es hacerlo tan simple que obviamente no hay
deficiencias y la segunda es hacerlo tan complicado que no hay deficiencias obvias. La primera forma es
mucho ms difcil.".

C.A.R. Hoare

Profesor y Autor: Andrs Guzmn F. 54


Curso: "Programacin Orientada a Objetos PHP5" 2010

Modificadores
De acceso

Uno de los benficos de las clases es que pueden proteger sus variables y mtodos miembros frente al
acceso de otros objetos.

En PHP5 se pueden utilizar los especificadores de acceso para proteger tanto las variables como los
mtodos de la clase cuando se declaran.

Soporta tres niveles de acceso para las variables y mtodos miembros: private, protected y public.

Public: Todo el mundo puede acceder al elemento. Si es un dato miembro todos pueden ver el
elemento, usarlo y modificarlo.
Private: Solo se puede acceder desde los mtodos de la clase, es decir, solo puede invocarse el
mtodo desde otro mtodo de la clase.
Protected: Slo se puede acceder la misma clase y sus hijas, las que la heredan.

La primera columna indica si la propia clase tiene acceso al miembro definido por el especificador de
acceso. La segunda columna indica si las subclases de la clase tienen acceso a los miembros. La tercera
columna indica si todas las clases tienen acceso a los miembros.

Profesor y Autor: Andrs Guzmn F. 55


Curso: "Programacin Orientada a Objetos PHP5" 2010

Los mtodos "getter / setter" o


"accesores"
Ahora bien, si queremos que el "estudiante" no pueda modificar nuestros datos, podemos pasar a
colocar todos los atributos como "private":

Listo, ahora cuando el "estudiante" quiera ver o modificar un atributo, el sistema le enviar un error. El
problema ahora es que nosotros queremos que:

La edad se pueda saber y cambiar en todo momento.


Se pueda saber el nombre del usuario, pero no modificarlo
No nos interesa que se sepa el nombre real del mismo
Pero queremos que pueda colocar una nueva clave si el usuario se la olvida, pero no
saber la que existe actualmente

Cmo se hace entonces?

Por un tema de principios de la POO los atributos de los objetos deben ser siempre "privados" (concepto
"encapsulacin": no son accesibles desde fuera del objeto, solo el objeto tiene la potestad de usarlos
directamente) y se debern crear mtodos pblicos que sustituya una u otra operacin, o ambas, cada
vez que la situacin lo amerite:

un mtodo "setter" para "cargar un valor" (asignar un valor a una variable)


un mtodo "getter" para "retornar el valor" (solo devolver la informacin del atributo
para quin la solicite).

Veamos cmo se resuelve, paso a paso.

Profesor y Autor: Andrs Guzmn F. 56


Curso: "Programacin Orientada a Objetos PHP5" 2010
La edad se puede acceder y modificar en todo momento, por consiguiente se deben agregar los dos
mtodos, un "get" y un "set" para ese atributo.

Poder saber el nombre del usuario pero no modificarlo, para eso hay que agregar solo un mtodo get
para ese atributo.

No nos interesa que se sepa el nombre real del usuario. Lo dejamos como est y queda inaccesible
desde fuera del objeto.

Queremos que pueda colocar una nueva clave si el usuario se la olvida, pero no saber la que existe
actualmente. Para eso, hacemos lo contrario que con el atributo nombre, agregamos un mtodo "set"
pero no el "get.

Pronto, usando simples mtodos podemos reforzar el diseo de nuestro objeto, restringiendo segn
nuestra necesidad el acceso a sus atributos.

Profesor y Autor: Andrs Guzmn F. 57


Curso: "Programacin Orientada a Objetos PHP5" 2010

Modificadores: Final, Static, Abstract


Final: En un atributo: no modificable-> Contante. En un mtodo no se puede sobrescribir en un
heredero. En una clase no se puede heredar.

Static: Pertenece a la clase no a la instancia. Se puede acceder a el sin necesidad de crear un objeto
concreto.

Abstract: Permite declarar una clase abstracta. Si la clase contiene al menos un metodo abstracto, ella
se debe declarar como abstracta.

VEAMOS UN EJEMPLO DE MIEMBRO ESTATICO

Profesor y Autor: Andrs Guzmn F. 58


Curso: "Programacin Orientada a Objetos PHP5" 2010
CLASE USUARIO:

El Mtodo __toString(): Convierte el objeto especificado en una cadena y devuelve dicha cadena. A
veces es conveniente o necesario convertir un objeto a una cadena o String porque se necesitar pasarlo
a un mtodo que slo acepta Strings o bien imprimir un detalle del objeto.

toString es un mtodo pblico, pero que no hace falta ejecutar literalmente, ya que lo hace de forma
automticamente con cualquier operacin que obligue/necesite hacer que un objeto deba comportarse
como un String (cadena de texto).

"Programar sin una arquitectura o diseo en mente es como explorar una gruta slo con una linterna: no
sabes dnde ests, dnde has estado ni hacia dnde vas" -- Danny Thorpe

Profesor y Autor: Andrs Guzmn F. 59


Curso: "Programacin Orientada a Objetos PHP5" 2010

Herencia
Es una relacin de parentesco entre dos entidades (una es padre de la otra, una es hija de la otra. No
puede existir herencia si no existe alguna relacin familiar entre ambas entidades. Es decir una
subclase es una clase que desciende de otra clase.

Una subclase hereda el estado y el comportamiento de todos sus ancestros. El trmino superclase se
refiere a la clase que es el ancestro ms directo, as como a todas las clases ascendentes.

Es una de las bases de reutilizacin de cdigo y polimorfismo. Hereda aquellos mtodos declarados
como public o protected.

No hereda un mtodo de la superclase si la subclase declara un mtodo que utiliza el mismo nombre. Se
dice que el mtodo de la subclase sobrescribe al mtodo de la superclase.

No hereda los mtodos private.

En PHP, como ya vimos, la herencia se especifica agregando la clasula extends despus del nombre de
la clase.

Profesor y Autor: Andrs Guzmn F. 60


Curso: "Programacin Orientada a Objetos PHP5" 2010

Sobre-escritura de mtodos

Otro elemento del lenguaje es poder sobre escribir un mtodo que heredamos de nuestro padre. Esto se
puede hacer simplemente volviendo a definir en la case hija un mtodo con el mismo tipo de retorno,
nombre y nmero de parmetros con su tipo.

Si quisiramos usar el comportamiento original y solo modificar parte en la clase hija, aadiendo mayor
funcionalidad, deberamos hacer lo mismo que mencionamos arriba pero, invocando primero al mtodo
padre mediante el uso de la palabra reservada parent .

VEAMOS UN EJEMPLO

Profesor y Autor: Andrs Guzmn F. 61


Curso: "Programacin Orientada a Objetos PHP5" 2010

CLASE EJECUTIVO:

Profesor y Autor: Andrs Guzmn F. 62


Curso: "Programacin Orientada a Objetos PHP5" 2010
CLASE EMPLEADO

Profesor y Autor: Andrs Guzmn F. 63


Curso: "Programacin Orientada a Objetos PHP5" 2010

Generalizacin versus Especializacin

El trmino es muy usado para definir la herencia. La explicacin ms simple es que cada trmino es
usado para referirse a la misma herencia, pero de acuerdo a la lectura que le queramos dar a la relacin
o al anlisis de diseo que estemos haciendo.

Por ejemplo, imaginemos que solo contamos con la clase Persona y descubrimos que necesitamos una
clase Usuario, podemos decir entonces que a partir de Persona hicimos una especializacin al crear la
clase Usuario, ya que tomamos un comportamiento ms genrico y lo adecuamos a una clase mucho
ms concreta y aplicable a entornos ms particulares.

Imaginemos lo contrario, contamos con dos clases que estn al mismo nivel, sin relaciones entre ellas,
que son Usuario y Admin, ambas clases repiten muchos atributos y mtodos (como nombre y apellido),
por lo que decidimos hacer una generalizacin y creamos una clase Persona haciendo un factorizacin
de todo lo comn entre ambas clases.

En resumen: podemos decir que son dos formas distintas de referirnos a la relacin de herencia.

Profesor y Autor: Andrs Guzmn F. 64


Curso: "Programacin Orientada a Objetos PHP5" 2010

Entonces, qu es Polimorfismo?

En s la palabra solo refiere a muchas formas y aplicado a la POO es la capacidad de poder tomar varias
clases que tiene operaciones iguales y poder invocar a cualquier instancia el mismo mtodo comn.

Ventajas: Poder hacer un diseo genrico que se apliquen a varios objetos que tienen operaciones
comunes.

Otra forma de decirlo es la capacidad del lenguaje de responder a un mismo mensaje de diferentes
maneras. Adecundose a la situacin actual.

En PHP5 NO slo se presenta en la Herencia (mediante jerarqua) y sobre-escrituras de mtodos y


atributos que vimos recientemente, sino que tambin estn presente en las implementaciones de
Interfaces.

"Si la depuracin es el proceso de eliminar errores, entonces la programacin debe ser el proceso de
introducirlos" -- Edsger W. Dijkstra

Profesor y Autor: Andrs Guzmn F. 65


Curso: "Programacin Orientada a Objetos PHP5" 2010

Interfaces
Por ejemplo una clase Hoja que tendra toda la informacin base para cualquier documento que
quiera imprimirse. Por defecto la hoja sabe imprimirse, y en caso de necesitar modificar el
comportamiento, sobre-escribiremos el mtodo imprime en la clase concreta (Currculum, contrato o
Informe).

Ahora bien, el diseo se nos complicara si queremos poder imprimir cosas que no necesariamente son
Hojas, como un Libro, una revista, una etiqueta, etc.

Qu hacemos? Creamos tantas impresoras como temas distintos enfrentemos?

Siguiendo el problema anterior, ahora tenemos varios tipos de elementos que no necesariamente son
simples hojas.

Hasta ahora venamos bien, pero si entendimos todo lo expuesto anteriormente, no podemos modificar
la herencia para que un Libro sea hijo de Hoja (incorrecto), o que la Impresora ahora controle libros y
que todo herede de Libro (incorrecto), o todas las variantes que se nos ocurran el problema es que la
herencia no cubre estos casos, la herencia solo se aplica cuando hay parentesco, si no lo hay, no sirve

a menos que usemos las interfaces!

Un interface es una coleccin de definiciones de mtodos (sin implementaciones) y de valores


constantes. Interfaz es como una clase abstracta pero no permite que ninguno de sus mtodos est
implementado. Es como una clase abstracta pero en estado ms puro y cristalino

Se declaran sustituyendo class por interface. Los interfaces se utilizan para definir un protocolo de
comportamiento que puede ser implementado por cualquier clase del rbol de clases

Capturar similitudes entre clases no relacionadas sin forzar una relacin entre ellas (comportamiento
similar). Declarar mtodos que una o varias clases necesitan implementar

En PHP5, un interface es un tipo de dato de referencia, y por tanto, puede utilizarse para forzar
parmetros a un cierto tipo (como en un argumento de mtodos), a esto se le llama Type Hinting
(Contol de Tipo).

Las herencias de clases definen el "qu son" y las de interfaces agrupan clases que definen el "qu
hacen", es decir las interfaces describen algunas de las caractersticas de una clase.

Cuando agrupamos por herencia hay una relacin de parentesco, pero con las interfaces agrupamos
objetos que "hacen cosas similares" como una interfaz "imprimible" que todos nuestros objetos
debieran de implementar para poder pasar por la impresora (les estamos diciendo de alguna forma que
deben cumplir con un "contrato de implementacin" para poder ser "imprimibles").

Profesor y Autor: Andrs Guzmn F. 66


Curso: "Programacin Orientada a Objetos PHP5" 2010
Ejemplo, hacer una interfaz "Pelable" para que la implementen las bananas, las manzanas y una
multiprocesadora. Esta ltima no es pariente de "frutas", pero puede hacer la misma accin que es
"pelar".

Esto se relaciona con el polimorfismo, en el sentido que vas a tener un mtodo de una clase, como por
ejemplo, cocinero, que pueda pelar cualquier cosa que le den, mientras estas sean "pelables".

El "contrato de implementacin" se hace cuando hacemos control de tipo: Type Hinting.

Por convencin, los nombres de interfaces empiezan con una letra mayscula al igual que las clases.
Frecuentemente los nombres de interfaces terminan en "able" o "ible".

Cada declaracin de mtodo est seguida por un punto y coma (;) porque un interface no proporciona
implementacin para los mtodos declarados dentro de l.

PHP5 no tiene herencia mltiple, es aqu donde entran las interfaces. Se pueden implementar cuantas
interfaces se requieran.

Una interface sirve para establecer un 'protocolo' entre clases. Todos los mtodos que declara una
interface son siempre public.

Diseo Orientado a la Interfaz

En entornos como Java, las interfaces permiten pasar del estilo de diseo "orientado a la
implementacin" a uno "orientado a la interfaz.

Donde todas las clases acceden a servicios a travs de interfaces que son implementadas por clases
concretas.

Y al no depender de clases concretas (solo de entidades abstractas) nuestro diseo ser ms reutilizable
que el anterior.

Con interfaces bien aplicadas robustece el diseo.

Profesor y Autor: Andrs Guzmn F. 67


Curso: "Programacin Orientada a Objetos PHP5" 2010
VEAMOS UN EJEMPLO

Ahora, todo quin quiera imprimir deber implementar esta interfaz, o conceptualmente, "cumplir con el
contrato establecido para poder usar la impresora".

Los interfaces tienen como misin en esta vida llevar el concepto de clase abstracta un poco ms lejos,
nos permite algo parecido a la herencia mltiple.

Sin embargo, la mayor utilidad de los interfaces consiste en permitir la existencia de herencia mltiple a
nivel de interfaces, que consiste en que una clase sea heredera de ms de una clase (que tenga varios
paps, vamos).

En C++ exista pero daba enormes problemas, al poder estar implementado un mismo mtodo de
distinta forma en cada una de las clases padre.

En PHP5 no existe ese problema. Slo podemos heredar de una sola clase, pero podemos a su vez
heredar de uno o varios interfaces (que no tienen implementacin).

"Codifica siempre como si la persona que finalmente mantendr tu cdigo fuera un psicpata violento
que sabe dnde vives"

-- Martin Golding

Profesor y Autor: Andrs Guzmn F. 68


Curso: "Programacin Orientada a Objetos PHP5" 2010
Forma de probarlo:

Profesor y Autor: Andrs Guzmn F. 69


Curso: "Programacin Orientada a Objetos PHP5" 2010

Estndar PHP Class

stdClass es una clase que como su propio significado dice, nos permite crear objetos estndar

De tal modo que podamos tratar una variable como un objeto y asignarle valores, borrarlos (unset).

No tiene atributos ni mtodos propios, tampoco hereda alguna clase ni implementa interfaces.

Se puede definir una clase que extiende stdClass, pero no tiene ningn beneficio, ya que stdClass no
hace nada.

Profesor y Autor: Andrs Guzmn F. 70


Curso: "Programacin Orientada a Objetos PHP5" 2010

Lenguaje PHP 5

Caractersticas Avanzadas

Standard PHP Library

En ste captulo veremos otras


caractersticas avanzadas de la Programacin
Orientada a Objetos en PHP5 Standard PHP
Library.

Profesor y Autor: Andrs Guzmn F. 71


Curso: "Programacin Orientada a Objetos PHP5" 2010
SPL es una coleccin de clases e interfaces hechas con la intencin de solucionar problemas comunes.

Porque utilizamos SPL y no un simple array? Buena pregunta, las APIs de colecciones son una de las
herramientas ms poderosas de un lenguaje de POO que se pueden poner en manos de un
desarrollador.

SPL es una API que pretende dar soluciones a las operaciones de colecciones y de datos a nivel de
Objetos, es una respuesta frente al API de Coleccin de Java (Java Collection), por lo que PHP5 OOP no
se poda quedar atrs.

Por lo tanto SPL ofrece una coleccin de clases e interfaces para PHP5 que ya forman parte del estndar
desde PHP5.

El objetivo de SPL es hacer eficiente, robusto y sencillo las operaciones y lgica de negocio orientado al
acceso de los datos y Agrupaciones de Objetos.

Funcionalmente est diseado para recorrer las estructuras de coleccin (a lo largo de bucle). Estos
pueden incluir colecciones, iteradores, patrones de diseo, conjuntos de resultados, xml, rboles,
listados de directorios o de cualquier lista, etc.

Resumiendo, nos permite disear sistemas robustos 100% Orientados a Objetos.

Profesor y Autor: Andrs Guzmn F. 72


Curso: "Programacin Orientada a Objetos PHP5" 2010

ArrayObject
Nos permite manejar un array como si fuera un objeto (y un objeto como un array). Implementa las
interface ArrayAccess, Countable, IteratorAggregate y Traversable.

Nos permite usar la formula $objeto['variable'], contar cuantos parmetros tenemos count($objeto),
recorrer el array-objeto.

Profesor y Autor: Andrs Guzmn F. 73


Curso: "Programacin Orientada a Objetos PHP5" 2010

Profesor y Autor: Andrs Guzmn F. 74


Curso: "Programacin Orientada a Objetos PHP5" 2010

ArrayIterator

Utilizado para recorrer un array, implementa la Interface Iterator.

RecursiveArrayIterator
RecursiveArrayIterator es parecido solo que nos dice si el elemento hijo es otro array para que podamos
seguir recorrindolo.

Profesor y Autor: Andrs Guzmn F. 75


Curso: "Programacin Orientada a Objetos PHP5" 2010

Interface ArrayAccess
La interfaz ArrayAccess nos permite acceder a nuestro objeto como si fuese un array. Veamos un
Ejemplo.

Profesor y Autor: Andrs Guzmn F. 76


Curso: "Programacin Orientada a Objetos PHP5" 2010

Profesor y Autor: Andrs Guzmn F. 77


Curso: "Programacin Orientada a Objetos PHP5" 2010

Interface Iterators
El patrn de diseo Iterador, define una interfaz que declara los mtodos necesarios para acceder
secuencialmente a un grupo de objetos de una coleccin.

Algunos de los mtodos que podemos definir en la interfaz Iterador son: Primero(), Siguiente(),
HayMas() y ElementoActual().

Este patrn de diseo permite recorrer una estructura de datos sin que sea necesario conocer la
estructura interna de la misma.

Profesor y Autor: Andrs Guzmn F. 78


Curso: "Programacin Orientada a Objetos PHP5" 2010

Interface Countable
La interface countable nos proporciona un mtodo para saber cuntos elementos contiene nuestro
objeto o, podemos, como en el caso anterior, definir nosotros que nos contar (debe devolver siempre
un entero). Simplemente vamos a modificar la clase anterior:

Interface Traversable
Esta interface es implementada en todos los iteradores y sirve para reconocer un iterador dado el caso.

Es el contrato de implementacin de todas las clases iteradoras.

Profesor y Autor: Andrs Guzmn F. 79


Curso: "Programacin Orientada a Objetos PHP5" 2010

SplObjectStorage
Permite almacenar objetos en una coleccin de datos nicos, o sea, al querer guardar un objeto que ya
est almacenado lo ignorar.

Las interfaces que implementa esta clase a partir de PHP5.3 son Iterator, Countable, Traversable,
Serialize y ArrayAccess.

Profesor y Autor: Andrs Guzmn F. 80


Curso: "Programacin Orientada a Objetos PHP5" 2010

Profesor y Autor: Andrs Guzmn F. 81


Curso: "Programacin Orientada a Objetos PHP5" 2010

DirectoryIterator
DirectoryIterator para recorrer fcilmente una estructura de directorios.

Profesor y Autor: Andrs Guzmn F. 82


Curso: "Programacin Orientada a Objetos PHP5" 2010
Desde ah es que empec a usar el DirectoryIterator para recorrer fcilmente una estructura de
directorios de forma recursiva.

O bien

Profesor y Autor: Andrs Guzmn F. 83


Curso: "Programacin Orientada a Objetos PHP5" 2010

SplObserver
El patrn Observador (en ingls: Observer) tambin conocido como "spider" define una dependencia del
tipo uno-a-muchos entre objetos, de manera que cuando uno de los objetos cambia su estado, el
observador se encarga de notificar este cambio a todos los otros dependientes.

Este patrn suele observarse en los frameworks de interfaces grficas orientados a objetos, en los que la
forma de capturar los eventos es suscribir 'listeners' a los objetos que pueden disparar eventos.

En PHP se puede heredar la funcionalidad del patrn Observer de la clase SplSubject y los observadores
pueden implementar la interfaz SplObserver y por lo tanto redefinir el mtodo update().

Profesor y Autor: Andrs Guzmn F. 84


Curso: "Programacin Orientada a Objetos PHP5" 2010

Profesor y Autor: Andrs Guzmn F. 85


Curso: "Programacin Orientada a Objetos PHP5" 2010

Profesor y Autor: Andrs Guzmn F. 86


Curso: "Programacin Orientada a Objetos PHP5" 2010

Profesor y Autor: Andrs Guzmn F. 87


Curso: "Programacin Orientada a Objetos PHP5" 2010

Lenguaje PHP 5

Caractersticas Avanzadas

Manejo de Excepciones

En ste captulo veremos otras


caractersticas avanzadas de la Programacin
Orientada a Objetos en PHP5 Manejo de
Excepciones.

Profesor y Autor: Andrs Guzmn F. 88


Curso: "Programacin Orientada a Objetos PHP5" 2010

Introduccin
Existe una regla de oro en el mundo de la programacin: en los programas ocurren errores.

Esto es sabido. Pero qu sucede realmente despus de que ha ocurrido el error? Cmo se maneja el
error? Quin lo maneja?, Puede recuperarlo el programa?

PHP5 utiliza excepciones para proporcionar capacidades de manejo de errores. En esta leccin
aprenderemos qu es una excepcin, cmo lanzar y capturar excepciones, qu hacer con una excepcin
una vez capturada, y cmo hacer un mejor uso de las excepciones heredadas de las clases
proporcionadas por el entorno de desarrollo de PHP5.

Una excepcin es un evento que ocurre durante la ejecucin del programa que interrumpe el flujo
normal de las sentencias

Entonces una excepcin es una situacin anormal que ocurre durante la ejecucin de un sistema que no
est contemplada en el flujo esperado de nuestro cdigo.

Separar el Manejo de Errores del Cdigo "Normal"


En la programacin tradicional, la deteccin, el informe y el manejo de errores se convierten en un
cdigo muy liado. Por ejemplo, supongamos que tenemos una funcin que lee un fichero completo
dentro de la memoria. En pseudocdigo, la funcin se podra parecer a esto:

leerFichero {

abrir el fichero;

determinar su tamao;

asignar suficiente memoria;

volcar el fichero a la memoria;

cerrar el fichero;

Profesor y Autor: Andrs Guzmn F. 89


Curso: "Programacin Orientada a Objetos PHP5" 2010
A primera vista esta funcin parece bastante sencilla, pero ignora todos aquellos errores potenciales.

Qu sucede si no se puede abrir el fichero?


Qu sucede si no se puede determinar la longitud del fichero?
Qu sucede si no hay suficiente memoria libre?
Qu sucede si la lectura o volcado a memoria falla?
Qu sucede si no se puede cerrar el fichero?

Para responder a estas cuestiones dentro de la funcin, tendramos que aadir mucho cdigo para la
deteccin y el manejo de errores.

El aspecto final de la funcin se parecera esto:

Profesor y Autor: Andrs Guzmn F. 90


Curso: "Programacin Orientada a Objetos PHP5" 2010
Con la deteccin de errores, las 7 lneas originales (en negrita) se han convertido en 29 lneas de cdigo--
a aumentado casi un 400 %.

Lo peor, existe tanta deteccin y manejo de errores y de retorno que en las 7 lneas originales y el
cdigo est totalmente atestado. Y an peor, el flujo lgico del cdigo tambin se pierde, haciendo difcil
poder decir si el cdigo hace lo correcto (si se cierra el fichero realmente si falla la asignacin de
memoria?) .

Incluso es difcil asegurar que el cdigo contine haciendo las cosas correctas cuando se modifique la
funcin tres meses despus de haberla escrito.

PHP5 proporciona una solucin elegante al problema del tratamiento de errores: Las Excepciones.

Las excepciones permiten escribir el flujo principal del cdigo y tratar los casos excepcionales en otro
lugar. Si la funcin leerFichero utilizara excepciones en lugar de las tcnicas de manejo de errores
tradicionales se podra parecer a esto.

Observa que las excepciones no evitan el esfuerzo de hacer el trabajo de detectar, informar y manejar
errores. Lo que proporcionan las excepciones es la posibilidad de separar los detalles oscuros de qu
hacer cuando ocurre algo fuera de la normal.

Adems, el factor de aumento de cdigo de este es programa es de un 250% -- comparado con el 400%
del ejemplo anterior.

Profesor y Autor: Andrs Guzmn F. 91


Curso: "Programacin Orientada a Objetos PHP5" 2010

Usando Excepciones
Las excepciones son la manera que ofrece PHP5 de manejar los errores en tiempo de ejecucin.

Muchos lenguajes imperativos, cuando tenan un error de esta clase lo que hacan era detener la
ejecucin del programa. Las excepciones nos permiten escribir cdigo que nos permita manejar ese
error y continuar (si lo estimamos conveniente) con la ejecucin del programa.

Por ejemplo, una parte de nuestro sistema tiene la responsabilidad de listar los usuarios actualmente
existentes. Esa es la funcionalidad esperada y as lo implementamos.

Necesariamente a bajo nivel vamos a requerir operaciones de persistencia, es decir, conectarnos a la


base de datos, requerir los datos y desconectarnos. Ese es el flujo normal y se espera que todo salga
bien.

Lamentablemente debemos contemplar todas las situaciones que no son esperadas / no son normales
para que nuestro sistema sepa cmo proceder en caso de fallas:

El servidor de base de datos est fuera de servicio,

Cambi la clave del usuario que usamos para conectarnos,

No existe la tabla de usuarios,

Algn campo de la tabla cambi de nombre,

Etc.

En la programacin tradicional, haramos algo como esto (extracto del manual oficial):

Profesor y Autor: Andrs Guzmn F. 92


Curso: "Programacin Orientada a Objetos PHP5" 2010

Aqu solo estamos controlando que se pudo hacer la conexin a la base de datos, pero no los dems
casos.

Profesor y Autor: Andrs Guzmn F. 93


Curso: "Programacin Orientada a Objetos PHP5" 2010
Podramos agregarle entonces:

Si somos observadores nos iremos dando cuenta que el cdigo para validar todas las situaciones
anmales empieza a crecer y superar en extensin al verdadero cdigo funcional, donde muy
probablemente entraremos a anidar "if/else/elseif" y/o "switchs", y as seguir creciendo en complejidad
y aumentando la posibilidad de fallos.

Profesor y Autor: Andrs Guzmn F. 94


Curso: "Programacin Orientada a Objetos PHP5" 2010

Try...Catch
Existe una estructura que nos permitir capturar excepciones, es decir, reaccionar a un error de
ejecucin, de este modo podremos imprimir mensajes de error "a la medida" y continuar con la
ejecucin del programa si consideramos que el error no es demasiado grave.

El Bloque try: El primer paso en la escritura de una manejador de excepciones es poner la sentencia PHP
dentro de la cual se puede producir la excepcin dentro de un bloque try. Se dice que el bloque try
gobierna las sentencias encerradas dentro de l y define el mbito de cualquier manejador de
excepciones (establecido por el bloque catch subsecuente) asociado con l.

Los bloques catch: Despus se debe asociar un manejador de excepciones con un bloque try
proporcionndole uno o ms bloques catch directamente despus del bloque try.

Si quisiramos emular una situacin donde si falla simplemente enve un mensaje en pantalla,
podramos hacer lo siguiente:

Profesor y Autor: Andrs Guzmn F. 95


Curso: "Programacin Orientada a Objetos PHP5" 2010
Dentro del bloque que sigue a try colocamos el cdigo a ejecutar. Es como si dijramos que vamos a
intentar ejecutar dicho cdigo a ver qu pasa.

Despus de try deberemos colocar al menos un bloque catch, pudiendo tener ambos e incluso ms de
un bloque catch anidado.

Clase Exception
Estructura interna de una clase Exception

Cuando se lanza una excepcin en PHP5, en nuestro mundo orientado objetos lo que se hace es lanzar
una instancia de Exception o de una clase derivada de l. Normalmente las clases derivadas no aaden
mucha funcionalidad (muchas veces ninguno en absoluto), pero al ser distintas nos permiten distinguir
entre los distintos tipos de excepciones.

Esta clase tiene como cosas interesantes dos constructores y dos mtodos (tiene ms mtodos pero slo
vamos a ver stos):

$e = new Exception() Crea una excepcin si ningn mensaje especfico.

$e = new Exception ( $string ) Crea una excepcin con un mensaje que detalla el tipo de excepcin.

$e.getMessage() Devuelve el mensaje detallado si existe o null en caso contrario.

Profesor y Autor: Andrs Guzmn F. 96


Curso: "Programacin Orientada a Objetos PHP5" 2010
$e.getTrace() Escribe por la salida de error estndar una traza que nos permitir localizar donde se
gener el error. Es muy til para depurar, pero no es conveniente que lo usuarios finales vean este tipo
de cosas.

Capturar excepciones
Ahora sabemos lo suficiente como para entender cmo funcionan los catch.

Entre los parntesis, como parmetro se declara el tipo y la variable (del objeto de la excepcin a
capturar), es decir, el nombre de una clase derivada de Exception (o la misma Exception) seguido por el
nombre de la variable.

Si se lanza una excepcin que es la que deseamos capturar o una derivada de la misma, se ejecutar el
cdigo que contiene el bloque. As, por ejemplo:

Se ejecutar siempre que se produzca una excepcin del tipo que sea, ya que todas las excepciones
derivan de Exception. No es recomendable utilizar algo as ya que estamos capturando cualquier tipo de
excepciones. Se pueden colocar varios bloques catch. En ese caso, se comprobar en orden si la
excepcin lanzada es la que deseamos capturar y si no pasa a comprobar la siguiente.

Eso s, slo se ejecuta un bloque catch. En cuanto captura la excepcin deja de comprobar los dems
bloques.

Profesor y Autor: Andrs Guzmn F. 97


Curso: "Programacin Orientada a Objetos PHP5" 2010
Hay que tener en cuenta el orden de las excepciones dentro del catch, ya que debe ir primero la
excepcin ms especfica e ir bajando a la excepcin ms genrica. Si colocamos la excepcin genrica
primero, todos los fallos entrarn ah y no a la excepcin acorde al tipo de error.

PHP no tiene excepciones por defecto


Una de las ventajas que viene directamente por el paradigma POO, como las excepciones se
representan con objetos, podemos extender la clase Exception y crear nuestras propias excepciones de
acuerdo a nuestras necesidades.

En lenguajes como Java ya existen por defecto cientos de clases agrupadas por temas como base de
datos, manejo de archivos, para problemas matemticos, arrays, etc. Y lo ms importante, todo retorna
por defecto una excepcin, algo que no sucede en PHP5!

Aunque en realidad hay algunas excepciones en APIs de PHP5, como por ejemplo en PDO y SPL. Pero
son las menos en relacin a otros lenguajes como Java.

En PHP5 debemos crearnos nuestras propias excepciones a partir de la nica clase que nos provee el
lenguaje: Exception.

Todo lo que atrapemos debemos asegurarnos que retorne una Excepcin, y como el lenguaje no lo hace
por defecto, debemos hacerlo a nivel de clases propias, validando internamente de la forma tradicional
(if/else/switch), pero al subir de nivel el resto podr hacer uso normal de los try/catch.

VEAMOS UN EJEMPLO:

Profesor y Autor: Andrs Guzmn F. 98


Curso: "Programacin Orientada a Objetos PHP5" 2010

Se podra decir que el "throw" es similar a "return algo", lo que hace es "lanzar la excepcin" a un nivel
ms arriba, donde se invoc originalmente la rutina, para que tomen el control de la situacin anmala y
procedan en consecuencia. Por lo tanto, si todo el cdigo anterior queremos atraparlo en un "try"
para tenerlo controlado en caso de fallas, deberamos hacer lo siguiente:

Profesor y Autor: Andrs Guzmn F. 99


Curso: "Programacin Orientada a Objetos PHP5" 2010

Zend Framework tiene Excepciones Predefinidas y por Defecto

Una de las ventajas de este framework es que todos sus componentes tiene manejo de excepciones, es
decir, incorpora desde Zend_Exception (algo ms completo que Exception estndar de PHP) y muchas
ms clases para cada situacin, muy similar a Java.

Crear Clases de Excepciones

Escribir nuestra propia clase Exception usando Herencia:

Profesor y Autor: Andrs Guzmn F. 100


Curso: "Programacin Orientada a Objetos PHP5" 2010

Lenguaje PHP 5

Caractersticas Avanzadas

Accesos a Datos

En ste captulo veremos otras


caractersticas avanzadas de la Programacin
Orientada a Objetos en PHP5 Acceso a Datos
utilizando PDO - PHP Data Objects.

Profesor y Autor: Andrs Guzmn F. 101


Curso: "Programacin Orientada a Objetos PHP5" 2010

Introduccin
PHP Data Objects (o PDO) es una extensin que provee una capa de abstraccin de acceso a datos para
PHP 5, escrita en C, con lo cual se consigue hacer uso de las mismas funciones para hacer consultas y
obtener datos de distintos manejadores de bases de datos.

Est implementada con tecnologa orientada a objetos. La conexin a una base de datos se realiza
creando una instancia de la clase base PDO. Algunos mtodos son: prepare, execute, exec,
beginTransaction, bindParam, commit.

La extensin PHP Data Objects (PDO) define una interfaz ligera y consistente para acceder a bases de
datos en PHP. Cada driver de bases de datos que implementa la interfaz PDO puede exponer
caractersticas especficas de la base de datos.

PHP Data Objects, ms conocida por sus siglas PDO, es una API que permite la ejecucin de operaciones
sobre bases de datos desde el lenguaje de programacin PHP5. Independientemente del sistema
operativo donde se ejecute o de la base de datos a la cual se accede.

El API PDO se presenta como una coleccin de interfaces y mtodos de gestin de manejadores de
conexin hacia cada modelo especfico de base de datos.

Para utilizar una base de datos particular, el usuario ejecuta su programa junto con la librera de
conexin apropiada al modelo de su base de datos, por medio de extensiones en php.ini, y accede a ella
estableciendo una conexin, a partir de all puede realizar con cualquier tipo de tareas con la base de
datos: consulta, creacin, modificacin y borrado de tablas, etc.

Profesor y Autor: Andrs Guzmn F. 102


Curso: "Programacin Orientada a Objetos PHP5" 2010

Drivers
Los siguientes controladores actualmente implementan la interfaz PDO:

PDO_DBLIB: FreeTDS / Microsoft SQL Server / Sybase

PDO_FIREBIRD: Firebird / Interbase 6

PDO_IBM: IBM DB2

PDO_INFORMIX: IBM Informix Dynamic Server

PDO_MYSQL: MySQL 3.x/4.x/5.x

PDO_OCI: Oracle Call Interface

PDO_ODBC: ODBC v3 (IBM DB2, unixODBC y win32 ODBC)

PDO_PGSQL: PostgreSQL

PDO_SQLITE: SQLite 3 y SQLite 2

PDO crea bsicamente una capa de abstraccin, que permite al desarrollador abstraerse de la base de
datos de una aplicacin. Y de esa manera, hacer el cdigo portable a otras plataformas y motores de
bases de datos.

Profesor y Autor: Andrs Guzmn F. 103


Curso: "Programacin Orientada a Objetos PHP5" 2010

Cargar los Drivers


Cargar el driver o drivers que queremos utilizar es muy sencillo y slo implica una lnea de directiva en el
php.ini. Si, por ejemplo, queremos utilizar el puente PDO-MySQL, se cargara la siguiente lnea de cdigo

extension=pdo.so

extension=pdo_mysql.so

Verificamos esto, con una llamada a la funcin phpinfo().

Hacer la Conexin
PDO nos ofrece una interfaz orientada a objetos bastante sencilla de utilizar. Para establecer la conexin
a la base de datos, tenemos que crear un nuevo objeto PDO, pasndole como parmetro al constructor
la URL de conexin a la base de datos, el usuario y la clave:

Si uno de los drivers que hemos cargado reconoce la URL suministrada por el mtodo, dicho driver
establecer una conexin con el controlador de base de datos especificado en la URL del PDO.

La clase PDO, maneja todos los detalles del establecimiento de la conexin detrs de la escena. En caso
de error, lanzar una excepcin del tipo PDOException.

Profesor y Autor: Andrs Guzmn F. 104


Curso: "Programacin Orientada a Objetos PHP5" 2010

Uso de Excepciones

Con el atributo PDO::ATTR_ERRMODE asignado a la constante PDO::ERRMODE_EXCEPTION nos permite


usar control y manejo de excepciones en PDO, cuando ocurra un error del tipo:

Connected to database
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'username' in 'field list'

Por defecto PDO::ERRMODE_SILENT.

Profesor y Autor: Andrs Guzmn F. 105


Curso: "Programacin Orientada a Objetos PHP5" 2010

Sentencias PDO
Crear Sentencias
Un objeto de conexin PDO, mediante el mtodo query enva nuestras sentencias SQL al controlador de
la base de datos y nos retorna un objeto PDOStatement con el resultado.

El mtodo query se utiliza para sentencias del tipo SELECT. Para sentencias que crean o modifican
tablas, el mtodo a utilizar es exec.

Se toma un ejemplar de una conexin activa para crear un objeto PDOStatement. En el siguiente
ejemplo, utilizamos nuestro objeto PDO de conexin: conn para crear el objeto PDOStatement: stmt.

El mtodo query devuelve un objeto PDOStatement que contiene los resultados de una peticin al
controlador de la base datos.

Profesor y Autor: Andrs Guzmn F. 106


Curso: "Programacin Orientada a Objetos PHP5" 2010

Ejecutar Sentencias PDO


Las sentencias que crean, modifican o eliminan tablas son todos ejemplos de sentencias DDL y se
ejecutan con el mtodo exec.

Cmo se podra esperar de su nombre, el mtodo exec tambin se utiliza para ejecutar sentencias SQL
que actualizan una tabla: Modificar, Eliminar, Insertar. En la prctica exec se utiliza ms frecuentemente
para actualizar tablas que para crearlas porque una tabla se crea slo una vez, pero se puede actualizar
muchas veces.

El valor devuelto por exec es un int que indica cuntas lneas de la tabla fueron actualizadas.

Obtener Datos desde una Tabla


El mtodo query, como se mencion anteriormente, se utiliza para ejecutar sentencias SELECT, que
comprenden la amplia mayora de las sentencias SQL.

PDO devuelve los resultados en un objeto PDOStatement, por eso necesitamos declarar un ejemplar de
la clase PDOStatement para contener los resultados.

Profesor y Autor: Andrs Guzmn F. 107


Curso: "Programacin Orientada a Objetos PHP5" 2010

Mtodo fetch
La variable result, que es un ejemplar de PDOStatement, contiene cada uno de los registros obtenidos
en la consulta. Para acceder a los datos, iremos a la fila y recuperaremos los valores de acuerdo al
resultado en curso.

El mtodo fetch mueve algo llamado cursor a la siguiente fila y hace que esa fila (llamada fila actual) sea
con la que podamos operar.

Como el cursor inicialmente se posiciona justo encima de la primera fila de un objeto PDOStatement,
primero debemos llamar al mtodo fetch para mover el cursor a la primera fila y convertirla en la fila
actual

Mtodo fetchAll
Nos retorna el resultado completo en un array.

Constantes Fetch Modes


FETCH_ASSOC: Retorna un array indexado por nombre de columna como resultado del result set

FETCH_NUM: Retorna un array indexado por el nmero de columna como resultado del result set ,
comenzando en 0

FETCH_BOTH: Es el valor por defecto, retorna un array indexado por ambos, por el nmero y nombre de
columna como resultado del result set

FETCH_OBJECT: Retorna un objeto con las propiedades que corresponden al nombre de la columna
como resultado del result set

FETCH_LAZY: Combina PDO::FETCH_BOTH and PDO::FETCH_OBJ, crea un objeto tan pronto sean
accedidas

FETCH_CLASS: Crea una instancia de la clase que se especifica y mapea los nombres de columnas a los
atributos/variables de la clase

Profesor y Autor: Andrs Guzmn F. 108


Curso: "Programacin Orientada a Objetos PHP5" 2010

Sentencias Preparadas
Algunas veces es ms conveniente o eficiente utilizar objetos PDOStatement preparados para enviar
sentencias SQL a la base de datos.

Si queremos ejecutar muchas veces un objeto PDOStatement, reduciremos el tiempo de ejecucin si


utilizamos un objeto PDOStatement preparado, en su lugar. Aunque los objetos PDOStatement
preparados se pueden utilizar con sentencias SQL sin parmetros, probablemente nosotros utilizaremos
ms frecuentemente sentencias con parmetros.

La ventaja de utilizar sentencias SQL que utilizan parmetros es que podemos utilizar la misma sentencia
y suministrar distintos valores cada vez que la ejecutemos.

Crear Objeto Sentencia Preparada


Al igual que los objetos PDOStatement, creamos un objeto PDOStatement preparados con un objeto
PDO de conexin.

Utilizando nuestra conexin conn abierta en ejemplos anteriores, podramos escribir lo siguiente para
crear un objeto PDOStatement preparado que tome dos parmetros de entrada.

Asignar Valores para los Parmetros de un Objeto Preparado


Necesitamos suministrar los valores que se utilizarn en los lugares donde estn las marcas de
interrogacin, si hay alguno, antes de ejecutar un objeto PDOStatement preparado.

Podemos hacer esto llamado a uno de los mtodos bindValue o bindParam definidos en la clase
PDOStatement preparado.

El tercer parmetro opcional, fuerza a un determinado tipo, mediante la constante PDO::PARAM_*. Por
defecto es PDO::PARAM_STR.

bindParam el segundo parmetro, el valor, tiene que ser una referencia y no un valor esttico.

bindParam tiene un cuarto parmetro que es el largo del tipo de dato, es opcional.

Profesor y Autor: Andrs Guzmn F. 109


Curso: "Programacin Orientada a Objetos PHP5" 2010

Actualizar Datos en una Tabla Con Objeto de Sentencia Preparada

Obtener Datos desde una Tabla Con Objeto de Sentencia Preparada

Profesor y Autor: Andrs Guzmn F. 110


Curso: "Programacin Orientada a Objetos PHP5" 2010

Transacciones
Casi todos los PDO drivers que soportan transacciones, PDO les provee algunos mtodos para este
propsito.

Metadata

Last Insert Id

Profesor y Autor: Andrs Guzmn F. 111


Curso: "Programacin Orientada a Objetos PHP5" 2010

Connection Information

Herencia

Profesor y Autor: Andrs Guzmn F. 112

Das könnte Ihnen auch gefallen