Вы находитесь на странице: 1из 49

Por : Roy Alvear Aguirre racl@gulix.cl http://www.gulix.cl Bajo licencia : CC BY-SA Documento Versin 1.

Introduccin
La programacin como tal, es una tarea creativa, regida por normas claras de construccin, mediante las cuales el programador crea nuevos sistemas y da vida a los proyectos. Es sabido que los cambios de paradigma son complejos inicialmente para el ser humano, pero el desafo de dominar nuevos conceptos es un incentivo suficiente para las mentalidades inquietas e investigadoras que normalmente tienen los desarrolladores de grandes sistemas. En la presente gua nos centraremos en la programacin orientada a objetos en el lenguaje PHP5, describiendo para ello el paradigma de la Orientacin a Objetos, sus componentes y normas tericas, para luego ir a la prctica. Tambin revisaremos algunas reglas de sintaxis y funciones de PHP, estudiaremos algunas clases ya creadas, para finalmente llegar a construir Programas Orientados a Objetos con PHP5. Se pretende abarcar en esta gua las funcionalidades bsicas e intermedias que todo desarrollador de sitios web en PHP debe conocer. No se trata de un manual de funcionalidades en donde se describe cada una de ellas, sino ms bien un instructivo prctico para lograr un correcto desarrollo de sistemas Orientados a Objetos en PHP5, respetando las leyes de Demeter y aplicando cada uno de los conceptos que implica. Finalmente, se espera que en el desarrollo del curso, el estudiante practique y pruebe las diversas funcionalidades entregadas y descritas, plantee sus dudas y escriba sus propios cdigos en PHP o mejore los ya entregados, pues no hay mejor maestro que la experiencia.

PHP5 Orientado a Objetos

RAcl gulix.cl

Qu es la programacin Orientada a Objetos?


La Programacin Orientada a Objetos (POO) es un Paradigma de Programacin que se enfoca en la representacin lo ms cercana posible de los objetos de nuestro mundo real. Es as como por ejemplo, para representar o modelar un automvil en vez de tomarlo como un todo con sus respectivas funcionalidades, se puede descomponer en objetos funcionales que interactan entre s, por ejemplo, motor, chasis, etc, a su vez el motor se puede descomponer en pistn, distribuidor, buja, etc... Los conceptos de la programacin orientada a objetos tienen origen el ao 1967, con el lenguaje simula67, sin embargo este paradigma no se hizo popular hasta que se propag C++ a fines de los '80 y principios de los '90.

Conceptos Bsicos
Existen algunas diferencias conceptuales entre distintos tericos referente a lo que debe cumplir un lenguaje orientado a objetos, sin embargo nos concentraremos en los siguientes cinco conceptos:

HERENCIA
La herencia es uno de los mecanismos de la programacin orientada a objetos, por medio del cual una clase se deriva de otra, llamada entonces superclase a la clase padre y subclase a la clase hija, de manera que la superclase extiende su funcionalidad segn una especializacin.

ENCAPSULAMIENTO
La utilidad del encapsulamiento es que facilita el manejo de la complejidad, ya que tendremos a las clases como cajas negras donde slo se conoce el comportamiento pero no los detalles internos, y esto es conveniente porque lo que nos interesar ser conocer qu hace la clase pero no ser necesario saber cmo lo hace.

SOBRECARGA
Se refiere a la posibilidad de tener dos o ms mtodos con el mismo nombre pero funcionalidad diferente dentro de un mismo objeto.

POLIMORFISMO
Es la capacidad que tienen distintos objetos para tener mtodos con un mismo nombre y obedecer a estas instancias, en muchas definiciones, la sobrecarga se incluye dentro del polimorfismo, sin embargo, dentro de la presente definicin las tomaremos por aparte marcando las diferencias diciendo que la sobrecarga sucede dentro de un mismo objeto mientras que el polimorfismo entre distintos objetos.

PHP5 Orientado a Objetos

RAcl gulix.cl

ABSTRACCIN
La abstraccin consiste en aislar un elemento de su contexto o del resto de los elementos que lo acompaan, es decir, rescatamos las caractersticas de la esencia que nos interesan, atributos y funcionalidades con que podemos representar un objeto dentro del sistema.

Algunas definiciones

CLASE
Es el tipo de dato abstracto que define los atributos y mtodos de un tipo de objeto.

OBJETO
Es una instancia a una clase.

ATRIBUTO
Es una caracterstica o propiedad de un objeto.

MTODO
Es una accin o funcionalidad de un objeto.

Ventajas y Desventajas frente a la Programacin Estructurada


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, reutilizar y volver a utilizar.

VENTAJAS
Reutilizacin directa de cdigo en abstracciones similares. Gracias a que el cdigo est encapsulado los errores quedan aislados haciendo ms fcil la correccin de estos. La mantencin del cdigo suele ser ms fcil dado a que al modificar una superclase todos los hijos adquieren la nueva funcionalidad. La sobrecarga y polimorfismo nos proveen de la posibilidad de usar un mismo nombre de mtodo haciendo ms natural e intuitiva la programacin, logrando as por ejemplo, implementar mostrar para botn, ventana, barra, etc... Al estar las variables temporales dentro de cada mtodo que la requiere, hay menos posibilidades que al modificar un trozo de cdigo se pase a daar otro de forma involuntaria. Mejor adaptabilidad ante nuevas situaciones. 3 RAcl gulix.cl

PHP5 Orientado a Objetos

SI ES TAN BUENA LA POO PORQUE NO SE US ANTES?


Debido a la multitud de llamadas (invocaciones) tiende a ser ms lenta (en ejecucin) que la programacin estructurada. Debido a que el ser humano se resiste al cambio de paradigmas.

Ley de Demeter
La ley de Demeter, o del buen estilo y elegancia en POO est resumido en los siguientes puntos: Cada atributo y mtodo de un objeto debe pertenecer a ste. Cada variable temporal que sea necesaria se debe crear dentro del mtodo que la invoque (mbito de la variable) y no de forma global o como atributo del objeto. La nica forma de acceso externo a los atributos de un objeto es a travs de sus mtodos. Cada mtodo invoca a otro de su entorno cercano hasta llegar al que debe invocarse en ltimo extremo.

Cmo se aplica la ley de Demeter?


Bsicamente los puntos anteriores se pueden resumir en habla slo con tus amigos, pues sto hace que para la programacin de cada mtodo, slo sea necesario un conocimiento del entorno inmediato del mtodo. Aunque a primera vista esto pudiera parecer poco eficiente, en realidad no lo es, pues al seguir rgidamente esta ley, conseguimos un mejor acoplamiento, una simplicidad de los mtodos y una mejor adaptabilidad a nuevas situaciones. As por ejemplo, podemos decir que el humano presiona el pedal, el pedal tensa una piola girando una vlvula, la vlvula deja pasar ms combustible generando una explosin con ms fuerza en el pistn, etc. dando como resultado la aceleracin del vehculo. Cada objeto segn su accin va afectando de alguna forma a los objetos que lo rodean (como girar la vlvula) cambiando sus atributos internos (como cantidad de combustible).

PHP5 Orientado a Objetos

RAcl gulix.cl

Programando en PHP5
Es PHP5 100% orientado a objetos?
No, PHP5 soporta los cdigos antiguos estructurados de PHP, pudiendo programar PHP de forma estructurada u Orientada a Objetos.

CARACTERSTICAS QUE CUMPLE PHP


PHP cumple con la abstraccin, encapsulamiento, polimorfismo y herencia, sin embargo no es capaz de cumplir la sobrecarga.

COMO PUEDO LLEGAR A SUPLIR EL NO TENER SOBRECARGA?


PHP puede suplir la sobrecarga gracias a que posee el manejo de parmetros opcionales.

Declaracin de Variables
En PHP las variables se representan con un signo de peso ($) seguido por el nombre de la variable. El nombre de la variable es sensible a minsculas y maysculas. Un nombre de variable vlido tiene que empezar con una letra o un carcter de subrayado (underscore), seguido de cualquier nmero de letras, nmeros y caracteres de subrayado. Como expresin regular se podra expresar como: '[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*' 1

Declaracin de Clases
Cada definicin de clase empieza con la palabra "class", seguida por un nombre de clase, el cual puede ser cualquier nombre que no est en la lista de palabras reservadas en PHP. Seguida por un par de llaves curvas, las cuales contienen la definicin de los miembros de la clase y los mtodos. Una pseudo variable $this 2 est disponible cuando un mtodo es llamado dentro del contexto de un objeto. $this es una referencia al objeto que se est usando (usualmente el objeto al que el mtodo pertenece, pero puede ser otro objeto si un mtodo es llamado estticamente desde el contexto de un objeto secundario).

Declaracin de Arreglos y Matrices


Una valor array en PHP es en realidad un mapa ordenado. Un mapa es un tipo de datos que asocia valores con claves. 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. Ya que los valores de una matriz pueden ser otras matrices, tambin es posible crear rboles y matrices multidimensionales.

1 Para los propsitos de este manual, una letra es a-z, A-Z, y los bytes del 127 al 255 (0x7f-0xff). 2 $this es una variable especial que no puede ser asignada. Existen otras variables reservadas que se analizarn ms adelante.

PHP5 Orientado a Objetos

RAcl gulix.cl

Variables especiales reservadas


PHP proporciona una gran cantidad de variables predefinidas a cualquier script que se ejecute. Muchas de stas, sin embargo, no pueden ser completamente documentadas ya que dependen del servidor que est corriendo, la versin y configuracin de dicho servidor, y otros factores. Algunas de estas variables no estarn disponibles cuando se ejecute PHP desde la lnea de comandos. Una lista de de las variables especiales estndar es:
$GLOBALS Referencia todas las variables disponibles en el mbito global $_SERVER Informacin del servidor y el entorno de ejecucin $_GET Variables HTTP GET $_POST Variables HTTP POST $_FILES Variables de Carga de Archivos HTTP $_REQUEST Variables de peticin HTTP $_SESSION Variables de sesin $_ENV Variables de entorno $_COOKIE Cookies HTTP $php_errormsg El mensaje de error previo $HTTP_RAW_POST_DATA Datos POST puros $http_response_header Cabeceras de respuesta HTTP $argc nmero de argumentos pasados al script $argv arreglo de argumentos pasados al script

Operadores
Operador
+ * / . % < > ! && || =

Significado
Suma Resta Multiplicacin Divisin Concatenacin Mdulo Menor Mayor No Y O Asignacin

Operador
+= -= *= /= .= %= <= >= != == ++ --

Significado
Suma y asigna Resta y asigna Multiplica y asigna Divide y asigna Concatena y asigna Mdulo y asigna Menor o Igual Mayor o Igual Distinto Igual Incremento Decremento

Los comentarios dentro de PHP estn dados de igual forma que en C++, por /* comentario de 0 o ms lineas */ // comentario desde el doble / al final

PHP5 Orientado a Objetos

RAcl gulix.cl

Sentencias de Control

DE DECISIN
if

Su uso es bsicamente cuando deseamos ejecutar un conjunto de sentencias slo si cumple con una condicin determinada. Sintaxis:
if (condicin) { Sentencias cuando cumple condicin; }

if-else

Su uso es para ejecutar un conjunto de sentencias cuando cumple una condicin y otro conjunto si no la cumple. Sintaxis:
if (condicin) { Sentencias cuando cumple condicin; } else{ Sentencias cuando no cumple la condicin; }

?:

Es un if-else abreviado, con la diferencia que retorna el valor de la o las sentencias que ejecuta, logrando as ser posible una asignacin de este valor. Sintaxis:
(Condicin)?valor_o sentencia_Verdadero:Valor_o_sentencia_Falso;

Ejemplo: Guardar el signo de un nmero.


$signo = ($num<0)?-1:1;

Que es equivalente a decir:


if ($num<0) { $signo = -1; } else{ $signo = 1; }

PHP5 Orientado a Objetos

RAcl gulix.cl

switch-case

Normalmente se usa cuando hay una serie de if-else anidados en donde se evala una misma expresin. Sintaxis:
switch($variable_a_evaluar){ case valor1: sentencias si cumple con el valor1; break; case valor2: sentencias si cumple con el valor2; break; default: sentencias que ejecuta si no cumple ninguna anterior;

} Nota 1: Los casos son quebrados con break, en caso de no ir, continua ejecutando las lneas posteriores, por ejemplo, si tenemos los conceptos de nota, MB, B, S e I, y queremos mostrar azules y rojos simplemente, podramos escribir el siguiente cdigo:
switch($concepto){ case MB: case B: case S: echo la nota es un azul; break; case I: echo la nota es un rojo; break; default: echo no existe ese concepto; }

Nota 2: El uso de default no es obligatorio, es slo para cuando se necesita especificar algo en el caso no que cumpla ninguna condicin anterior, por lo que el cdigo del ejemplo podra quedar simplemente as:
switch($concepto){ case MB: case B: case S: echo la nota es un azul; break; case I: echo la nota es un rojo; }

PHP5 Orientado a Objetos

RAcl gulix.cl

Nota 3: Los casos se aplican de forma simple en caso de igualdad, sin embargo, es posible especificar otro tipo de reglas como por ejemplo:
switch($nota){ case ($nota<4): echo "I"; break; case ($nota<5): echo "S"; break; case ($nota<6): echo "B"; break; case ($nota>=6): echo "MB"; }

Nota 4: La sentencia break no quiebra solamente los switch, sino que es capaz de quebrar los bucles, sin embargo no quiebra sentencias if e if-else.

BUCLES O CCLICAS
while

Ejecuta un conjunto de sentencias mientras una condicin es verdadera, el conjunto de sentencias puede ser ejecutada 0 ms veces. Sintaxis:
while(Condicin){ Sentencias que ejecuta mientras la condicin sea verdadera; }

do-while

Ejecuta un conjunto de sentencias mientras una condicin es verdadera, como la condicin se pregunta al final, el conjunto de sentencias puede ser ejecutada 1 ms veces. Sintaxis:
do{ Sentencias que ejecuta mientras la condicin sea verdadera; }while(Condicin);

PHP5 Orientado a Objetos

RAcl gulix.cl

for

Es una de las sentencias cclicas ms complejas pero ms potente, su utilizacin puede reemplazar a cualquiera de las expresiones cclicas anteriores, permite mltiples opciones debido a que ninguna de sus partes es obligatoria y a la vez pueden ser mltiples expresiones en cada una de sus partes. Es idntico a como funciona el for en C. Sintaxis:
for(expresin_de_inicializacin;expresin_de_comparacin;expresin_de_variacin){ Sentencias a ejecutar si cumple la expresin_de_comparacin; }

Ejemplo 1, mostrar los nmeros de 1 a 10


for($i=1; $i<=10; $i++){ echo $i; }

Ejemplo 2, si una persona avanza el doble por cada paso que da, que otra que est 10 pasos ms adelante, en que momento la alcanza?
for($i=0, $j=10 ; $i<$j ; $i+=2, $j++){ echo $i . - . $j; }

En este ejemplo, tanto la expresin de inicializacin como la de variacin es doble, cuando existe ms de una expresin, como en el ejemplo; sta va separada por una coma ',' tal cual como se puede apreciar.
foreach

sta simplemente se ejecuta recorriendo cada una de los componentes de un arreglo, funciona de forma idntica a como es en Perl. Sintaxis 1:
foreach($arreglo as $valor){ sentencias; }

Sintaxis 2:
foreach($arreglo as $clave => $valor){ sentencias; }

A quienes estn familiarizados con C, esta sentencia puede resultar algo extraa, sin embargo, como se coment en la declaracin de arreglos una clave se asocia a un valor. Esta clave puede ser un nmero de ndice, pero perfectamente puede ser una palabra descriptiva, as por ejemplo se puede definir el siguiente arreglo:
$persona = array( 'nombre' => 'Juan Perez', 'edad' => 34, 'rut' => '12.312.312-3' );

PHP5 Orientado a Objetos

10

RAcl gulix.cl

y mostrar sus datos recorriendo con foreach sus elementos


foreach($persona as $indice => $valor){ echo $indice : $valor<br>; }

cuya salida es:


nombre : Juan Perez edad : 34 rut : 12.312.312-3

Esta caracterstica de foreach es que permite manejar los arreglos de una forma bastante ms amigable que en C u otros lenguajes de programacin.

Ejemplos bsicos

DE VARIABLES
$i = 5; // aqu i es un entero de valor 5 $saludo = Hola mundo; // aqu se declara un string $vocales = array( 'a', 'e', 'i', 'o', 'u' ); // declaracin de un arreglo

DE OPERADORES
$a=0; $a += 5; // esta sentencia es equivalente a $a = $a + 5; $saludo = <h1> . $saludo . </h1>;

DE SENTENCIAS DE CONTROL
if ( $i == 5 ){ echo $saludo; } else{ echo las vocales son:; foreach( $vocales as $v) echo $v ; } while($a>0){ echo $a--; } do{ $a++; echo $a; }while($a<5);

PHP5 Orientado a Objetos

11

RAcl gulix.cl

Herramientas o funciones ms comunes en PHP


Funciones de String en PHP
Las funciones de manejo de string en PHP son numerosas, el presente manual no pretende abarcar todas las funciones, sin embargo nos concentraremos en un pequeo grupo de ellas comentando su funcionalidad.
addslashes

Agrega un slash \ entes de cada smbolo especial de quiebre, convirtiendo por ejemplo O'Higgins en O\'Higgins. Esta funcin es muy til para evitar, por ejemplo, los SQL Injection. Ejemplo:
$apellido = addslashes( $apellido );

chr

Convierte un nmero en su respectivo carcter ascii. Ejemplo:


$letra = chr(65);

echo

Muestra por pantalla uno o ms string. Ejemplo:


echo este es un ejemplo , con varios parmetros y ms de una linea;

explode

Divide un string a partir de un cierto delimitador. Ejemplo:


$string = "foo:*:1023:1000::/home/foo:/bin/sh"; $arreglo = explode(:,$string);

htmlentities

Convierte los caracteres especiales a su respectivo cdigo HTML. Ejemplo:


$string = El presente ao, l ser presidente; $string = htmlentities( $string ); // el string final es: El presente a&ntilde;o, &eacute;l ser&aacute; presidente

PHP5 Orientado a Objetos

12

RAcl gulix.cl

implode

Es la funcin opuesta a explode, agregando un delimitador a un array para convertirlo en un string. Se destaca que el delimitador puede ser un string de ms de un carcter. Ejemplo:
$arreglo = array( hola, mundo ); $string = implode( , $arreglo);

md5

Retorna el md5 hash de un string usando RFC1321.


nl2br

Transforma todos los \n en <br> o en <br/> dependiendo del parmetro opcional final. Ejemplo
$frase = este es un ejemplo.\nTexto de dos lineas.; echo nl2br($frase); //imprime: este es un ejemplo.<br>Texto de dos lineas echo nl2br($frase,true); //imprime: este es un ejemplo.<br/>Texto de dos lineas

ord

Retorna el nmero ascii de un caracter. Ejemplo:


$ascii = ord('A');

printf

Crea una salida pre-formateada, al igual como en C. Ejemplo:


printf(%d\n, (4/3) );

str_replace

Busca y remplaza un texto dentro de un texto mayor. Ejemplo:


$texto = str_replace(php4, php5, no hay nada mejor que php4);

strcmp

Compara dos string para ver si su contenido es igual o no, retorna cero (0) si son iguales, menor a cero si el primer string es menor (alfabticamente hablando), mayor si es mayor. Ejemplo:
if ( ! strcmp ($clave1, $clave2)) echo las claves son iguales;

PHP5 Orientado a Objetos

13

RAcl gulix.cl

stripslashes

Es la funcin opuesta a addslashes, quitando los \ del string. Ejemplo:


echo stripslashes( $nombre );

strlen

Retorna la longitud de un string. Ejemplo:


echo strlen(Hola); // muestra 4

substr

Recorta un substring desde un string mayor. Los parmetros son el string fuente, la posicin inicial y la longitud del texto recortado. Ejemplo:
echo substr(Hola mundo,1,3); // muestra ola

Funciones de Array en PHP


Otro tipo de datos muy utilizado en PHP son los arreglos, cuya profundizacin es recomendada. Al igual como en los String no tomaremos todas las funciones, sino que nos concentraremos en un conjunto de ellas.
array

Crea un arreglo, se puede especificar un indice o no. Ejemplo:


$arreglo = array( Domingo Lunes Martes Miercoles Jueves Viernes => => => => => => 0, 1, 2, 3, 4, 5);

array_merge

Mezcla dos arreglos regresando el arreglo resultante. Ejemplo:


$arreglo1 = array_merge($array1,$array2);

array_sum

Suma los valores del contenido de un array. Ejemplo


$suma = array_sum( array( 2, 3, 4, 5, 6 ));

PHP5 Orientado a Objetos

14

RAcl gulix.cl

array_unique

Elimina todos los valores repetidos de un arreglo, retornando un arreglo con valores nicos.
asort

Ordena un arreglo segn sus valores de menor a mayor, conservando cada clave su valor. Ejemplo:
$persona = array( 'nombre' => 'Juan Perez', 'edad' => '34', 'rut' => '12.312.312-3' ); asort($persona); print_r($persona);

regresar
Array ( [rut] => 12.312.312-3 [edad] => 34 [nombre] => Juan Perez )

count

Regresa el nmero de cuantos elementos tiene un arreglo. Ejemplo


echo count( $persona); // mostrar 3

in_array

Comprueba si un valor existe en un arreglo. Ejemplo


$SL = array ( Linux , OpenOffice, PHP, MySQL, KDE, Gnome); if ( in_array(PHP , $SL) ) echo est&aacute;;

ksort

Ordena un arreglo segn sus claves de menor a mayor, conservando cada clave su valor. Ejemplo:
$persona = array( 'nombre' => 'Juan Perez', 'edad' => '34', 'rut' => '12.312.312-3' ); ksort($persona); print_r($persona);

PHP5 Orientado a Objetos

15

RAcl gulix.cl

regresar
Array ( [edad] => 34 [nombre] => Juan Perez [rut] => 12.312.312-3 )

list

Asigna variables provenientes de un arreglo. Ejemplo:


list($nombre, $edad, $rut) = $persona;

Funciones de MySQL
PHP maneja conexin con mltiples bases de datos de forma nativa y por medio de ODBC accede a muchas ms, sin embargo, una de las ms frecuentes es MySQL, dado a que los servidores LAMP han tenido mucho xito en su trabajo conjunto. Al igual como en los puntos anteriores, solamente mencionaremos algunas funciones de inters que usaremos ms adelante.
mysql_affected_rows

En caso de una sentencia insert, update, delete o replace se puede obtener la informacin de cuantos registros afect.
mysql_close

Cierra un enlace a una base de datos abierta.


mysql_connect

Crea un enlace a una base de datos, para ello necesita el nombre del servidor, usuario y clave. Ejemplo:
$link = mysql_connect($host, $user,$pwd);

mysql_fetch_array

Retorna un arreglo asociativo clave-valor o un arreglo de indice numrico o ambos. Ejemplo:


while($row = mysql_fetch_array($result,MYSQL_ASSOC)){ printf("rut:%s nombre:%s", $row["rut"], $row["nombre"]); }

PHP5 Orientado a Objetos

16

RAcl gulix.cl

Nota: Los valores posibles son las constantes MYSQL_ASSOC, MYSQL_BOTH y MYSQL_NUM, siendo la predeterminada MYSQL_BOTH.
mysql_fetch_row

Regresa lo mismo que mysql_fetch_array( $result, MYSQL_NUM), es decir, una arreglo con un ndice de lista numerada.
mysql_field_name

Obtiene el nombre de un campo del resultado de una consulta a partir de su ndice numrico. Ejemplo:
printf(El campo %s tiene por valor: %d , mysql_field_name($result, 2), $row[2]);

mysql_free_result

Libera toda la memoria asociada a un resultado de una consulta.


mysql_num_rows

Regresa el nmero de registros obtenidos de una consulta.


mysql_insert_id

Regresa el nmero de identificador autoincrementado de un registro recin aadido.


mysql_query

Ejecuta un query en MySQL, los mltiples query no estn soportados, en caso de un SELECT puede ver cantos registros obtuvo a travs de mysql_num_rows, en caso de una actualizacin o insercin, utilice mysql_affected_rows. Ejemplo:
$result = mysql_query(Select * from tabla, $link);

mysql_select_db

Selecciona una base de datos sobre la cual se va a trabajar. Ejemplo:


mysql_select_db(empleados,$link);

PHP5 Orientado a Objetos

17

RAcl gulix.cl

Manejo de Cookies y Sesiones


Las cookies y variables de sesin son muy utilizadas, en especial cuando se quiere mantener cierta informacin durante la ejecucin de un sitio o entre visitas, por ejemplo, supongamos que queremos recordar qu lenguaje prefiere un usuario dado, que no necesariamente ingresa a un sistema, para que no haga esta seleccin una y otra vez, cada vez que visita el sitio. La solucin es almacenar una cookie en el computador del visitante, recordando su propia eleccin de idioma del sitio. De forma contraria, las variables de sesin se almacenan en el servidor y son creadas cada vez que llega un usuario a un determinado sistema, y una vez que lo abandona, se eliminan, por ejemplo, cuando accede al banco.
session_cache_expire

Lee o fija el tiempo en que el cach de la variable de sesin expirar, de forma predeterminada el valor es 180 minutos. Se debe invocar antes de un session_start(). Ejemplo
session_cache_expire(2); // el cach durar solo 2 minutos.

session_destroy

Destruye todos los datos contenidos en una sesin. No posee ningn parmetro.
session_register

Registra un nuevo campo en el arreglo de sesin. Ejemplo:


session_register(id_usuario); $_SESSION['id_usuario'] = $id;

session_start

Inicia o actualiza una sesin, se usa cada vez que uno quiera trabajar con las variables del arreglo de sesin. No posee ningn parmetro.
session_unset

Libera todas las variables de una sesin, no la destruye, pero elimina todas sus variables. Ejemplo: Proceso para destruir una sesin.
session_start(); session_unset(); session_destroy();

PHP5 Orientado a Objetos

18

RAcl gulix.cl

setcookie

Enva una cookie. Ejemplo:


$valor = es; setcookie( idioma, $valor, time() + (60*60*24*30) ); /* crea una cookie llamada idioma con el valor que se encuentra en la variable $valor por treinta das a partir de ahora. */ echo idioma es . $_COOKIE['idioma'];

Manejo de Archivos
Nombraremos aqu algunas funciones comunes de manejo de archivos, al igual que con funciones anteriores no se nombrarn todas, solamente las de mayor utilizacin. Muchos creen que el manejo de archivos est obsoleto y desplazado por las bases de datos, sin embargo la utilizacin de estos es an vigente y de uso frecuente.
fclose

Cierra un enlace a un archivo. Ejemplo:


fclose($arch);

feof

Retorna verdadero si se llega al final de un archivo Ejemplo:


while(!feof($arch)) echo fgetc($arch);

fgetc

Obtiene un carcter ledo desde el enlace a un archivo. Ver ejemplo anterior.


fgets

Obtiene una linea desde el enlace al archivo.


while(!feof($arch)) echo fgets($arch);

file_exist

Retorna Verdadero si el archivo o directorio con un determinado nombre existe. Ejemplo:


echo file_exist($file)? existe : no existe;

PHP5 Orientado a Objetos

19

RAcl gulix.cl

filesize

Obtiene el tamao de un archivo. Ejemplo


echo El archivo pesa . filesize($file);

fopen

Abre un enlace a un archivo, segn un determinado modo. Ejemplo:


$arch = fopen($file,rt);

Modo 'r' 'r+' 'w' 'w+' 'a' 'a+'

Descripcin Abrir para slo lectura; coloca el puntero del archivo en el inicio del Archivo. Abrir para lectura y escritura; coloca el puntero del archivo en el inicio del Archivo. Apertura para slo escritura; coloque el puntero del archivo en el inicio del Archivo. Trunca el archivo con longitud cero. Si el archivo no existe, intenta crearlo. Apertura para la lectura y la escritura; coloca el puntero del archivo en el comienzo del archivo y trunca el archivo a cero Si el archivo no existe, intenta crearlo. Apertura para slo escritura; Coloca el puntero de archivo al final del archivo. Si el archivo no existe, intenta crearlo. Apertura para lectura y escritura; Coloca el puntero de archivo al final del archivo. Si el archivo no existe, intenta crearlo.

Adems, se usa 't' para modo texto traducido y 'b' para binario, el modo de texto traducido automticamente reconoce \n, \r\n y \r como fin de linea dependiendo del sistema en que se encuentre.
fread

Lectura binaria de archivos. Ejemplo:


<?php $filename = "algo.jpg"; $handle = fopen($filename, "rb"); $contents = fread($handle, filesize($filename)); fclose($handle); ?>

PHP5 Orientado a Objetos

20

RAcl gulix.cl

fseek

Mueve la posicin de un enlace a un archivo en una cantidad dada de bytes de desplazamiento desde una posicin dada, donde los valores de posicin son los siguientes: SEEK_SET - posicin igual a desplazamiento de bytes. SEEK_CUR - Ajuste de la posicin a la ubicacin actual ms desplazamiento. SEEK_END - Ajuste de la posicin de final de archivo ms desplazamiento. Si no se especifica, se supone que es SEEK_SET. Ejemplo:
fseek($archi, 0, SEEK_END); // ir al final del archivo

fwrite

Escritura binaria de archivo, los parmetros son idnticos a los de fread.


rename

Renombra un archivo. Ejemplo:


rename(viejo.txt,actual.txt);

unlink

Borra un archivo. Ejemplo:


unlink($filename);

PHP5 Orientado a Objetos

21

RAcl gulix.cl

Creando clases en PHP5


Antes de comenzar a crear clases daremos algunas definiciones finales de constructor, destructor y otros elementos claves en una clase en PHP5.

Definiciones

CONSTRUCTOR Y DESTRUCTOR
Un constructor es la funcin o mtodo que se llama cuando se crea un objeto del tipo, mientras que el destructor se encarga de regresar la memoria cuando ste se destruye. Los mtodos se llaman __construct() y __destruct() respectivamente.

ACCESO A PROPIEDADES Y MTODOS


El acceso a las propiedades o mtodos puede ser: private, protected o public, determinando en la prctica la accesibilidad de ellos.

INTERFAZ Y ABSTRACCIN
Las interfaces se utilizan en la POO para suplir la herencia mltiple, definiendo un conjunto de mtodos que deben ser implementados. De forma similar la abstraccin se utiliza para declarar mtodos o clases sin definir su cdigo.

MTODO Y CLASES TIPO FINAL


Se puede especificar la palabra clave final para decir que un mtodo no puede sobrescribirse o que una clase no puede especializarse.

ATRIBUTOS Y MTODOS STATIC


Son aquellos que pueden invocarse desde la clase sin necesidad de haber sido instanciada por un objeto.

OPERADOR INSTANCEOF
Se utiliza para saber si un objeto es una instancia de una clase determinada.

Creando clases de uso comn


En esta seccin se crearn algunas clases a modo de ejemplo, dichas clases son frecuentemente utilizadas en los desarrollos del autor del manual para simplificar desarrollos, no son nicas y son perfeccionables. Algunas de ellas se han ido modificando en el tiempo y adaptando al pasar de una versin a otra de PHP.

CLASE DE ACCESO A DATOS


La ventaja de usar una clase de acceso a datos es que en caso de migrar la base de datos, al tener sentencias de uso estndar, slo deber cambiar esta clase por otra que se relacione con otro motor de datos.
<?php /************************************************************************** * Archivo : database.class.php * Descripcion : Clase para manejar base de datos a traves de una sentencias * SQL liberando la conexion a la base de datos. * Autor : Roy Alvear * Fecha : 2006-12-18 * Licencia : GPL *************************************************************************** * Metodos Publicos *************************************************************************** * __construct Funcion: constructor * Parametros: el Host, el Usuario y Clave y la base de * datos, todos ellos opcionales * Retorna: Nada * * insert Funcion: ingresa usando una sentencia SQL retornando * el valor del registro creado. * Parametros : String con el SQL * Retorna : Integer con el numero de registro, null si falla * * update Funcion: actualiza usando una sentencia SQL retornando * el valor verdadero si tiene exito. * Parametros : String con el SQL * Retorna : vardadero si tiene exito, null si falla * * select Funcion : retorna un arreglo con el resultado de una * sentencia SQL * Parametros: String SQL * Retorna : Array con el resultado o null * ***************************************************************************/ class database{ private $host; private $user; private $pwd; private $bd; private $link; function __construct($host=null,$user=null,$pwd=null,$bd=null){ $this->init(); if($host) $this->host=$host; if($user) $this->user=$user; if($pwd) $this->pwd =$pwd; if($bd) $this->bd =$bd; }

PHP5 Orientado a Objetos

23

RAcl gulix.cl

private function init(){ $this->host = ""; $this->user = ""; $this->pwd = ""; $this->bd = ""; private function connect(){ $this->link = mysql_connect($this->host, $this->user,$this->pwd); mysql_select_db($this->bd, $this->link); } private function close(){ mysql_close($this->link); } public function insert($strsql){ $this->connect(); if(!mysql_query($strsql)) return null; $id = mysql_insert_id($this->link); $this->close(); return $id; } public function update($strsql){ $this->connect(); if(!mysql_query($strsql)) return null; $ok = true; $this->close(); return $ok; } public function select($qry){ $this->connect(); $arr = array(); $selec = mysql_query($qry,$this->link); if (!$selec) { return null; } if (mysql_num_rows($selec) > 0){ $x=0; while($row = mysql_fetch_row($selec)){ foreach($row as $i => $value) { $column = mysql_field_name($selec,$i); $data["$column"] = $value; $arr[$x] = $data; } $x++; } } mysql_free_result($selec); $this->close(); return $arr; }

PHP5 Orientado a Objetos

24

RAcl gulix.cl

CLASE DE MANEJO BSICO DE TEMPLATES


Maneja templates html con etiquetas tipo ###etiqueta### reemplazando la etiqueta por un contenido en un arreglo cuyo indice contiene las etiquetas y los valores el texto a ser cambiado.
/************************************************************************** * Archivo : template.class.php * Descripcion : Clase para manejar templates html * Autor : Roy Alvear * Fecha : 2008-12-15 * Licencia : GPL ***************************************************************************/ <?php class template{ private $template; //constructor de la clase public function __construct($archi=null){ $this->template = ""; if($archi) $this->leeTmplt($archi); } //llena un template con el arreglo public function llena($arreglo){ if(count($arreglo)) foreach($arreglo as $var => $val) $this->template=str_replace($var,$val,$this->template); //elimina etiquetas no llenadas $this->template = eregi_replace("(\#\#\#)[a-z]+(\#\#\#)","",$this->template); } //lee un archivo de template y lo carga public function leeTmplt($archi){ if(file_exists($archi)){ $fil = fopen($archi,"r"); $cont=""; while(!feof($fil)){ $cont .= fgets($fil); } fclose($fil); $this->template=$cont; } else die("No existe ".$archi." inconsistencia... avise el error al webmaster"); } //regresa el codigo public function getCode(){ return $this->template; } }

PHP5 Orientado a Objetos

25

RAcl gulix.cl

Utilizando las clases, programando con objetos.


Normalmente una de las tcnicas muy utilizadas en la programacin web es la programacin en tres capas, mediante la programacin orientada a objetos, el manejo de esta tcnica se hace ms fcil.

PROGRAMACIN EN TRES CAPAS


Para llevar a cavo la programacin en tres capas se crean de forma separada la capa de datos de la interfaz grfica de la inteligencia del negocio o capa de programacin dura. Mediante la clase de manejo de template y la clase de base de datos, podemos hacer el vnculo de dos de estas capas con el controlador central que se encuentra en la capa de programacin.
Ejemplo de tres capas para mostrar o ingresar fotografas.

Se utilizarn las clases ya creadas anteriormente template y database, el diseo ser bsico pero funcional, se puede siempre mejorar.
Capa de diseo HTML:

En esta capa se encuentra tambin la hoja de estilos, javascript y similares.


<html><!-- muestra.html --> <head> <title>###titulo###</title> </head> <body> <h1>###titulo###</h1> <img src='###foto###' alt='###foto###'><br> ###comentario### </body> </html> <html><!-- ingresa.html --> <head> <title>Ingresa nueva foto</title> </head> <body> <h1>Ingresa nueva foto</h1> <form action='#' method='post'> T&iacute;tulo de la foto : <input type='text' name='titulo'><br> URL de la foto : <input type='text' name='foto'><br> Comentario: <input type='text' name='comentario'><br> <input type='submit' value='Agregar'> </form> </body> </html>

PHP5 Orientado a Objetos

26

RAcl gulix.cl

Capa de Cdigo PHP:


<?php // controlador.class.php include("template.class.php"); include("database.class.php"); class controlador{ private $code; function __construct($pid,$data){ $array = array(); $db = new database('localhost','user','pass123','ejemplo'); if(!count($data) && $pid != 0){ $array = $db->select('SELECT * FROM pict WHERE id=\''.$pid.'\''); $template = 'muestra.html'; } else if ($pid == 0) { $id=$db->insert("INSERT INTO pict (id,titulo,foto,comentario) VALUES (NULL,'".$data['titulo']."','".$data['foto']."','".$data['comentario']."'"); $mensaje = 'ingreso id:' . $id; $template = 'ingresa.html'; } else die('No existe ese id'); $tpl = new template($template); $tpl->llena($array); $this->code = $tpl->getCode(); } public function getCode(){ return $this->code; } } ?> <?php // index.php include("controlador.class.php"); $pid = 0;

if(isset($_GET['id'])){ $pid = $_GET['id']; $pid = 1 * $pid; } $data = array(); foreach($_POST as $i => $v){ $data[$i] = addslashes($v); //addslashes para evitar intentos de inyeccion de SQL } $page = new controlador($pid,$data); echo $page->getCode(); ?>

PHP5 Orientado a Objetos

27

RAcl gulix.cl

Capa de Datos

En esta capa se encuentra la base de datos, la cual, para este ejemplo est creada con el siguiente cdigo.
CREATE DATABASE ejemplo; CREATE TABLE `ejemplo`.`pict` ( `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY , `titulo` TINYTEXT NOT NULL , `foto` TINYTEXT NOT NULL , `comentario` TEXT NOT NULL );

UTILIZANDO CLASES Y OBJETOS EN UN PEQUEO SITIO


El siguiente es un ejemplo en donde se encuentra la informacin de los templates en la base de datos y esta informacin es manejada por la clase de control. Se utilizan ademas de las clases ac expuestas, las clases anteriores de template y de base de datos.
Capa de cdigo:
<?php class consulta{ private $conexion=null; public function __construct($conexion=null){ if($conexion) $this->conexion=$conexion; } public function setConexion($conexion){ $this->conexion=$conexion; } public function setMenu($texto,$template,$idnivel=3){ $strSQL="INSERT INTO menu (id_menu,texto,template,id_nivel) VALUES (NULL,'$texto','$template',$idnivel);"; return $this->conexion->insert($strSQL); } public function getMenu($id=null){ if($id==NULL) $strSQL="SELECT * FROM menu"; else $strSQL="SELECT * FROM menu WHERE id_menu='$id'"; return $this->conexion->select($strSQL); } public function addContenido($pid,$label,$contenido){ $strSQL="INSERT INTO contendo (id_contenido,label,contenido,pid) VALUES (NULL,'$label','$contenido',$pid);"; return $this->conexion->insert($strSQL); }

PHP5 Orientado a Objetos

28

RAcl gulix.cl

public function getContenido($pid){ $strSQL="SELECT * FROM contendo WHERE pid='$pid'"; return $this->conexion->select($strSQL); } public function createUser($login,$passwd,$uname){ $strSQL="INSERT INTO usuario (id_usuario,login,clave,nombre,activo,id_nivel) VALUES (NULL,'$login','$passwd','$uname','1','3')"; return $this->conexion->insert($strSQL); } public function getUser($login){ $strSQL="SELECT id_usuario,login,clave,nombre,activo,id_nivel FROM usuario WHERE login='$login'"; return $this->conexion->select($strSQL); } } ?> <?php include("template.class.php"); include("database.class.php"); include("consulta.class.php"); include("usuario.class.php"); class control{ private $code=""; private $consulta; private $usr; private $marker; /** * @param $pid id de pagina * @param $data arreglo de datos de la pagina */ public function __construct($pid,$data){ $link=new mysqlDB("localhost","roal","pwd.roal.2009","roal"); $this->consulta = new consulta($link); $this->usr = new usuario($this->consulta); $template = new template("html/indice.html"); $marca['###titulo###'] = "Prueba PHP5"; if($this->usr->logged()){ $marca['###clase###'] = 'visible'; $marca['###menu###'] = $this->menu(); $marca['###contenido###'] = $this->contenido($pid,$data); } else{ $marca['###clase###'] = 'oculto'; $marca['###menu###'] =""; $marca['###contenido###'] = $this->contenido(-1,$data); } if($this->marker['###mensaje###']!="") /* si existe un mensaje */ $this->marker['###mensaje###'] = "<div class=\"destacado\">" . $this>marker['###mensaje###'] . "</div>";

PHP5 Orientado a Objetos

29

RAcl gulix.cl

if(count($this->marker)) foreach($this->marker as $i => $v) $marca[$i]=$v; $marca['###fecha###'] = date("d/m/Y"); $template->rellena($marca); $this->code = $template->getCode(); if(isset($_SESSION['debug'])){ /* debug --- activar en index.php */ echo "<pre>"; echo "<p>------------------------------</p>"; print_r($_SESSION); echo "<p>------------------------------</p>"; print_r($data); echo "<p>------------------------------</p>"; echo "</pre>"; } } public function menu(){ $this->marker['###LOGNAME###'] = $this->usr->getName(); $data = $this->consulta->getMenu(); $text=""; if(count($data)) foreach($data as $i => $row) if($this->usr->getId()<=$row['id_nivel']) $text.="<a href='?id=".$row['id_menu']."'>". $row['texto']."</a>&nbsp;&nbsp;&nbsp;"; $text.="<a href='?id=-2'>Salir</a>"; return $text; } public function contenido($pid,$data){ $template = new template(); $marca = array(); $mensaje = ""; switch($pid){ case -2: //logout $this->usr->logout(); header("Location: index.php"); break; case -1: //logeo o registro if(isset($data['que'])){ if($data['que']=="logeo"){ $uid=$this->usr->login($data['user'],$data['pwd']); } elseif($data['que']=="registro"){ if($data['pwd1']==$data['pwd2']){ $uid = $this->usr->create($data['user'],$data['pwd1'], $data['nombre']); } else{ $mensaje = "Clave no coincide..."; break; } } header("Location: index.php"); }else{ // mostrar pagina

PHP5 Orientado a Objetos

30

RAcl gulix.cl

$template->setTemplate("html/login.html"); } break; default: $dato = $this->consulta->getMenu($pid); if(count($dato)){ if($this->usr->getNivel()<=$dato[0]['id_nivel']){ $template->setTemplate("html/".$dato[0]['template']); $datoCont = $this->consulta->getContenido($pid); if(count($datoCont)){ foreach($datoCont as $reg) $marca['###' . $reg['label'] . '###'] =$reg['contenido']; } } else $mensaje = "Ud. no tiene el permiso necesario"; } else $mensaje = "Ops esta p&aacute;gina no existe..."; } $this->marker['###mensaje###'] $template->rellena($marca); return $template->getCode(); } public function getCode(){ return $this->code; } public function show(){ echo $this->code; } = $mensaje;

} ?>

<?php class usuario{ private $id; private $db; public function __construct($db){ $this->db=$db; $this->id=0; } public function create($login,$passwd,$uname){ $this->id=$this->db->createUser($login,md5($passwd),$uname); @session_start(); session_register('id_user'); session_register('name_user'); session_register('id_nivel'); $_SESSION['id_user'] = $this->id; $_SESSION['name_user'] = $uname; $_SESSION['id_nivel'] = 2; }

PHP5 Orientado a Objetos

31

RAcl gulix.cl

public function login($login,$passwd){ $user=$this->db->getUser($login); if(count($user)){ $user=$user[0]; if(md5($passwd)==$user['clave']){ $this->id=$user['id_usuario']; @session_start(); session_register('id_user'); $_SESSION['id_user'] = $this->id; session_register('name_user'); $_SESSION['name_user'] = $user['nombre']; session_register('id_nivel'); $_SESSION['id_nivel'] = $user['id_nivel']; return $this->id; } } $this->id=0; return $this->id; } public function logged(){ @session_start(); if(isset($_SESSION['id_user'])) if($_SESSION['id_user']!=0) return true; return false; } public function logout(){ @session_start(); //session_unregister('id_user'); session_unset(); session_destroy(); } public function getId(){ return $this->id; } public function getName(){ return $_SESSION['name_user']; } public function getNivel(){ return $_SESSION['id_nivel']; } } ?>

PHP5 Orientado a Objetos

32

RAcl gulix.cl

Capa de diseo:

indice.html
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" lang="es"> <head> <title>###titulo###</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta http-equiv="Content-Language" content="es" /> <meta name="Robots" content="index, follow" /> <meta name="copyright" content="&copy; 2008 MIDEPLAN." /> <meta name="distribution" content="global" /> <meta http-equiv="Pragma" content="no-cache/cache" /> <meta http-equiv="Cache-Control" content="no-cache" /> <meta name="Title" lang="es" content="###titulo###" /> <link rel="stylesheet" type="text/css" href="css/estilo1.css" media="screen" /> <link rel="stylesheet" type="text/css" href="css/estiloPrint.css" media="print" /> </head> <body> <table width="800" cellspacing="0" cellpadding="0" align="center" id="principal" lang="es" xml:lang="es"> <tr><td id="fondoCabecera" colspan="3"><table cellspacing="0" cellpadding="0" id="cabecera" style="width:100%;height:100%;"><tr><td><img alt="logotipo" src="img/logoEducatic.jpg"/></td><td id="tbmenuprin"><!-- inicio menu -->###menu###<!-- fin menu --></td></tr></table></td></tr> <tr><td id="menu" colspan="3" class="center"> <span class="###clase###">Bienvenido(a) ###LOGNAME###&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>Hoy : ###fecha### </td></tr> <tr><td class="esqTL"></td><td class="marcoH"></td><td class="esqTR"></td></tr> <tr><td class="marcoV">&nbsp;&nbsp;</td><td id="central"> <!-- inicio mensaje -->###mensaje###<!-- fin mensaje --><br/> <!-- inicio contenido -->###contenido###<!-- fin contenido --> </td><td class="marcoV">&nbsp;&nbsp;</td></tr> <tr><td class="esqBL"></td><td class="marcoH"></td><td class="esqBR"></td></tr> <tr><td id="pie" colspan="3"> Prueba de PHP5 Orientado a Objetos - EducaTIC 2009 &copy;&reg;</td></tr> </table> </body> </html>

PHP5 Orientado a Objetos

33

RAcl gulix.cl

login.html
<h1 class="center">Ingrese al Sistema</h1><hr/><br/> <form method="post"> <div class="center">Si ud. ya esta registrado:</div> <input type="hidden" name="que" value="logeo"/> <table align="center" cellpadding="2" cellspacing="0"> <tr><td>Usuario :</td><td><input type="text" name="user"/></td></tr> <tr><td>Clave :</td><td><input type="password" name="pwd"/></td></tr> <tr><td></td><td><input type="submit" value="Entrar"/></td></tr> </table> </form> <hr/><br/><br/> <form method="post"> <div class="center">Si ud. no esta registrado, registrese aqu&iacute;:<input type="hidden" name="que" value="registro"/></div> <table cellspacing="0" cellpadding="2" align="center"> <tr><td>Usuario :</td><td><input type="text" name="user"/></td></tr> <tr><td>Clave :</td><td><input type="password" name="pwd1"/></td></tr> <tr><td>Repita Clave :</td><td><input type="password" name="pwd2"/></td></tr> <tr><td>Su nombre :</td><td><input type="text" name="nombre"/></td></tr> <tr><td></td><td><input type="submit" value="Registrarse"/></td></tr> </table> <br/> </form>

menu.html
menu <br> <hr>

wellcome.html
<h1 class="center">###titulo###</h1> <img src="img/###imagen###" align="right" border="0" alt="" style="margin:15px;" /><div>###texto###</div>

estilo1.css
body { margin:0; background-image: url(../img/fondoDeg0.jpg); background-repeat: repeat-x; background-color: #5391B8; font-family: Verdana,sans-serif; font-size:12px; color:#003366; } table { font-family: Verdana,sans-serif; font-size:12px; color:#003366; }

PHP5 Orientado a Objetos

34

RAcl gulix.cl

td { vertical-align:top; } h1, caption { margin:0px; margin-top:3px; margin-bottom:3px; font-size:16px; color:#003366; } a { font-size:12px; color:#404000; font-weight:bold; text-decoration: none; } a:link { } a:visited { } a:hover { color:#880000; } a:active { color:#FF0000; } input[TYPE="text"], input[TYPE="password"], select, textarea { border: 2px inset #6795D6; background-color: #C7D4F0; color:#3A4A8E; font-size:12px; font-weight:bold; } input[TYPE="text"]:focus, input[TYPE="password"]:focus, select:focus, textarea:focus { background-color:#FFFFFF; }

PHP5 Orientado a Objetos

35

RAcl gulix.cl

input[TYPE="submit"], input[TYPE="reset"], input[TYPE="button"] { border: 2px outset #0569A5; background-color: #4690C0; color:#FFFFFF; font-size:11px; font-weight:bold; } input[TYPE="submit"]:hover, input[TYPE="reset"]:hover, input[TYPE="button"]:hover { border: 2px solid #0569A5; } input[TYPE="submit"]:active, input[TYPE="reset"]:active, input[TYPE="button"]:active { border: 2px inset #0569A5; background-color:#CCD8E6; color:#CC0001; } #overDiv { text-align:justify; } #principal { background-color:#66A1C9; width:90%; min-height:547px; border:0px; border-left:1px solid #0569A5; border-right:1px solid #0569A5; background-image: url(../img/fondopie.jpg); background-repeat: repeat-x; background-position:bottom; } #cabecera { background-image: url(../img/logoAsociados.jpg); background-repeat: no-repeat; background-position:top right; height: 140px; width: 100%; vertical-align:middle; } #fondoCabecera{ background-image: url(../img/logoFondoEducatic.jpg); background-repeat: repeat-x; height: 140px; width: 100%; vertical-align:middle; }

PHP5 Orientado a Objetos

36

RAcl gulix.cl

#menu { background-color:#66A1C9; color:#FFFFFF; height: 20px; width: 800px; padding-left:10px; vertical-align:middle; font-size:11px; } #pie { padding-left:20px; height: 50px; width: 100%; font-size:10px; letter-spacing:1px; vertical-align:middle; text-align:center; } #central { background-color:#f0f0f0; min-height: 400px; vertical-align:top; width: 100%; padding-left:13px; padding-right:17px; padding-top:0px; padding-bottom:5px; text-align:justify; } #tbmenu { width:350px; padding:6px; background-color:#FFFFFF; border:3px outset #66A1C9; margin:0; margin-right:220px; font-size:8px; } #tbmenu a { font-size:8px; } #tbmenuprin { margin-bottom:0px; vertical-align:bottom; height:140px; }

PHP5 Orientado a Objetos

37

RAcl gulix.cl

#tbmenuprin a{ background-color:#66A1C9; border:1px solid #FFFFFF; border-bottom:0px; padding:4px; padding-bottom:1px; font-size:14px; } #tbmenuprin a:hover{ background-color:#FFFFFF; } .submenu { width:150px; border:3px double #66A1C9; padding:3px; } .submenu ul { padding-left:15px; } .contenido { text-align:justify; vertical-align:top; padding:5px; } .blanco_negro { /*background-color:#FFFFFF; */ color:#333333; font-weight:bold; padding-left:3px; padding-right:3px; } .border0 { border: 0px; } .center { text-align:center; } .right { text-align:right; } .alto50 { height:50px; vertical-align:middle; }

PHP5 Orientado a Objetos

38

RAcl gulix.cl

#form1 { border:1px solid #f5f5fd; border-top:0px; } .marco { width:100%; height:100%; border: 0px; } .cabeceraInterna { height:40px; font-size:14px; font-weight:bolder; border-bottom:12px solid #CCD8E6; padding-left:5px; vertical-align:middle; font-style:italic; } .cabeceraInterna:first-letter { font-size:18px; } .destacado { color:#333333; background-color:#2BFF39; font-weight:bold; margin:5px; padding:3px; border:3px groove gray; text-align:center; font-size:14px; } .hw100 { width:100%; height:100%; } .hw100_1 { width:100%; height:100%; background-position:top right; background-repeat: no-repeat; background-image: url(../img/welcome.jpg); } .marcoH { background-image: url(../img/marcoH.jpg); background-repeat: repeat-x; height:10px; font-size:5px; }

PHP5 Orientado a Objetos

39

RAcl gulix.cl

.marcoV { background-image: url(../img/marcoV.jpg); background-repeat: repeat-y; width: 10px; } .esqTL { background-image: url(../img/esqTL.jpg); background-repeat: no-repeat; height:10px; width: 10px; font-size:5px; } .esqTR { background-image: url(../img/esqTR.jpg); background-repeat: no-repeat; height:10px; width: 10px; font-size:5px; } .esqBL { background-image: url(../img/esqBL.jpg); background-repeat: no-repeat; height:10px; width: 10px; font-size:5px; } .esqBR { background-image: url(../img/esqBR.jpg); background-repeat: no-repeat; height:10px; width: 10px; font-size:5px; } .ayuda { border:0px; cursor:help; } .vinculo{ border:0px; cursor:pointer; } .padding5 { padding:5px; } .w450 { width:450px; }

PHP5 Orientado a Objetos

40

RAcl gulix.cl

.bordecelda { background-color:#ffffff; border:1px dotted #66A1C9; padding:5px; } .textoPre{ width:98%; height:150px; border:1px solid #66A1C9; padding:10px; padding-bottom:15px; text-align: justify; overflow:auto; } .oculto { display:none; } .visible { display : inline; } .centerchico{ font-size:9px; text-align:center; }

PHP5 Orientado a Objetos

41

RAcl gulix.cl

Capa de datos:
CREATE TABLE IF NOT EXISTS `contendo` ( `id_contenido` int(11) NOT NULL AUTO_INCREMENT, `label` tinytext NOT NULL, `contenido` text NOT NULL, `pid` int(11) NOT NULL, PRIMARY KEY (`id_contenido`) ) ; CREATE TABLE IF NOT EXISTS `menu` ( `id_menu` int(11) NOT NULL AUTO_INCREMENT, `texto` tinytext NOT NULL, `template` tinytext NOT NULL, `id_nivel` int(11) NOT NULL, PRIMARY KEY (`id_menu`) ) ; CREATE TABLE IF NOT EXISTS `nivel` ( `id_nivel` int(11) NOT NULL AUTO_INCREMENT, `nivel` tinytext NOT NULL, PRIMARY KEY (`id_nivel`) ) ;

PHP5 Orientado a Objetos

42

RAcl gulix.cl

CREATE TABLE IF NOT EXISTS `usuario` ( `id_usuario` int(11) NOT NULL AUTO_INCREMENT, `login` tinytext NOT NULL, `clave` tinytext NOT NULL, `nombre` tinytext NOT NULL, `id_nivel` int(11) NOT NULL, `activo` tinyint(4) NOT NULL, PRIMARY KEY (`id_usuario`) ) ; INSERT INTO `nivel` (`id_nivel`, `nivel`) VALUES(1, 'Administrador'); INSERT INTO `nivel` (`id_nivel`, `nivel`) VALUES(2, 'Moderador'); INSERT INTO `nivel` (`id_nivel`, `nivel`) VALUES(3, 'Usuario'); INSERT INTO `menu` (`id_menu`, `texto`, `template`, `id_nivel`) VALUES(1, 'Bienvenido', 'welcome.html', 1); INSERT INTO `contendo` (`id_contenido`, `label`, `contenido`, `pid`) VALUES(1, 'imagen', 'logoEducatic.jpg', 1); INSERT INTO `contendo` (`id_contenido`, `label`, `contenido`, `pid`) VALUES(2, 'titulo', 'Bienvenido a la Intranet', 1); INSERT INTO `contendo` (`id_contenido`, `label`, `contenido`, `pid`) VALUES(3, 'texto', '<p>si dejas 5 espacios en blanco y despues escribes, ejemplo, asi al principio de cada parrafo</p>', 1);

PHP5 Orientado a Objetos

43

RAcl gulix.cl

EJERCICIO FINAL PROPUESTO


Tome el cdigo anterior y cree Cree una clase llamada admin.class.php, con los mtodos: activaUsuario(id_usuario) marca usuario como activo desactivaUsuario(id_usuario) marca usuario como inactivo (no se puede logear) permisoUsuario(id_usuario, id_nivel) cambia el nivel de un usuario addPage(texto_link, template, id_nivel_minimo) agrega una pgina al menu editPage(texto) modifica el texto del link de la pagina permisoPage(id_nivel_minimo) cambia el nivel de acceso a una pgina addLabel(etiqueta_de_pagina,texto_a_mostrar,id_pagina) agrega una etiqueta para un template. editLabel(texto_a_mostrar,id_pagina) edita el contenido de una etiqueta para un template.

Modifique control.php tal que pueda usar admin.class.php para administrar usuarios y pginas. Cree la(s) interfaz(ces) o template(s) html compatible con las tareas anteriores. Modifique usuario.class.php tal que pueda procesar las llamadas de admin.class.php, que corresponden a activaUsuario, desactivaUsuario y permisoUsuario. Cree la clase pagina.class.php tal que satisfaga las llamadas de admin.class.php Modifique consulta.class.php tal que satisfaga todo lo necesario relacionado con la insercin y consulta de los datos.

PHP5 Orientado a Objetos

44

RAcl gulix.cl

Bibliografa
Mehdi Achour, Friedhelm Betz , Antony Dovgal and Others : PHP Manual 1997-2009 the PHP Documentation Group, http://www.php.net/manual/en/ Noviembre 2009 Bert Bos, Hkon Wium Lie, Chris Lilley, Ian Jacobs : Hojas de Estilo en Cascada, nivel 2 Traduccin en Sidar http://www.sidar.org/recur/desdi/traduc/es/css/cover.html Noviembre 2009

PHP5 Orientado a Objetos

45

RAcl gulix.cl

ndice de contenido
Introduccin__________________________________________________________________________1 Qu es la programacin Orientada a Objetos?_______________________________________________2
Conceptos Bsicos__________________________________________________________________________2 Herencia___________________________________________________________________________________2 Encapsulamiento_____________________________________________________________________________2 Sobrecarga_________________________________________________________________________________2 Polimorfismo_______________________________________________________________________________2 Abstraccin_________________________________________________________________________________3 Algunas definiciones_________________________________________________________________________3 Clase______________________________________________________________________________________3 Objeto_____________________________________________________________________________________3 Atributo____________________________________________________________________________________3 Mtodo____________________________________________________________________________________3 Ventajas y Desventajas frente a la Programacin Estructurada________________________________________3 Ventajas___________________________________________________________________________________3 Si es tan buena la POO porque no se us antes?____________________________________________________4 Ley de Demeter_____________________________________________________________________________4 Cmo se aplica la ley de Demeter?_____________________________________________________________4

Programando en PHP5__________________________________________________________________5
Es PHP5 100% orientado a objetos?____________________________________________________________5 Caractersticas que cumple PHP_________________________________________________________________5 Como puedo llegar a suplir el no tener sobrecarga?_________________________________________________5 Declaracin de Variables_____________________________________________________________________5 Declaracin de Clases________________________________________________________________________5 Declaracin de Arreglos y Matrices_____________________________________________________________5 Variables especiales reservadas________________________________________________________________6 Operadores________________________________________________________________________________6 Sentencias de Control________________________________________________________________________7 De decisin_________________________________________________________________________________7
if____________________________________________________________________________________________7 if-else________________________________________________________________________________________7 ?:____________________________________________________________________________________________7 switch-case____________________________________________________________________________________8

Bucles o cclicas_____________________________________________________________________________9
while_________________________________________________________________________________________9 do-while______________________________________________________________________________________9 for__________________________________________________________________________________________10 foreach______________________________________________________________________________________10

Ejemplos bsicos___________________________________________________________________________11 De variables_______________________________________________________________________________11 De operadores______________________________________________________________________________11 De sentencias de control______________________________________________________________________11

Herramientas o funciones ms comunes en PHP_____________________________________________12


Funciones de String en PHP__________________________________________________________________12
addslashes___________________________________________________________________________________12 chr__________________________________________________________________________________________12 echo________________________________________________________________________________________12 explode______________________________________________________________________________________12 htmlentities___________________________________________________________________________________12 implode______________________________________________________________________________________13 md5_________________________________________________________________________________________13 nl2br________________________________________________________________________________________13

PHP5 Orientado a Objetos

46

RAcl gulix.cl

ord_________________________________________________________________________________________13 printf________________________________________________________________________________________13 str_replace___________________________________________________________________________________13 strcmp_______________________________________________________________________________________13 stripslashes__________________________________________________________________________________14 strlen________________________________________________________________________________________14 substr_______________________________________________________________________________________14

Funciones de Array en PHP__________________________________________________________________14


array________________________________________________________________________________________14 array_merge__________________________________________________________________________________14 array_sum___________________________________________________________________________________14 array_unique_________________________________________________________________________________15 asort________________________________________________________________________________________15 count________________________________________________________________________________________15 in_array_____________________________________________________________________________________15 ksort________________________________________________________________________________________15 list__________________________________________________________________________________________16

Funciones de MySQL_______________________________________________________________________16
mysql_affected_rows___________________________________________________________________________16 mysql_close__________________________________________________________________________________16 mysql_connect________________________________________________________________________________16 mysql_fetch_array_____________________________________________________________________________16 mysql_fetch_row______________________________________________________________________________17 mysql_field_name_____________________________________________________________________________17 mysql_free_result______________________________________________________________________________17 mysql_num_rows______________________________________________________________________________17 mysql_insert_id_______________________________________________________________________________17 mysql_query__________________________________________________________________________________17 mysql_select_db_______________________________________________________________________________17

Manejo de Cookies y Sesiones________________________________________________________________18


session_cache_expire__________________________________________________________________________18 session_destroy_______________________________________________________________________________18 session_register_______________________________________________________________________________18 session_start_________________________________________________________________________________18 session_unset________________________________________________________________________________18 setcookie____________________________________________________________________________________19

Manejo de Archivos________________________________________________________________________19
fclose_______________________________________________________________________________________19 feof_________________________________________________________________________________________19 fgetc________________________________________________________________________________________19 fgets________________________________________________________________________________________19 file_exist_____________________________________________________________________________________19 filesize_______________________________________________________________________________________20 fopen_______________________________________________________________________________________20 fread________________________________________________________________________________________20 fseek________________________________________________________________________________________21 fwrite________________________________________________________________________________________21 rename______________________________________________________________________________________21 unlink_______________________________________________________________________________________21

Creando clases en PHP5________________________________________________________________22


Definiciones______________________________________________________________________________22 Constructor y Destructor______________________________________________________________________22 Acceso a propiedades y mtodos_______________________________________________________________22 Interfaz y abstraccin________________________________________________________________________22 Mtodo y clases tipo final_____________________________________________________________________22 Atributos y Mtodos static____________________________________________________________________22 Operador instanceof_________________________________________________________________________22 Creando clases de uso comn_________________________________________________________________22 Clase de acceso a datos_______________________________________________________________________23 Clase de manejo bsico de templates____________________________________________________________25

PHP5 Orientado a Objetos

47

RAcl gulix.cl

Utilizando las clases, programando con objetos.__________________________________________________26 Programacin en tres capas____________________________________________________________________26


Ejemplo de tres capas para mostrar o ingresar fotografas._____________________________________________26 Capa de diseo HTML:________________________________________________________________________________26 Capa de Cdigo PHP:__________________________________________________________________________________27 Capa de Datos________________________________________________________________________________________28

Utilizando clases y objetos en un pequeo sitio____________________________________________________28


Capa de cdigo:______________________________________________________________________________________28 Capa de diseo:______________________________________________________________________________________33 Capa de datos:_______________________________________________________________________________________42

Ejercicio final propuesto______________________________________________________________________44

PHP5 Orientado a Objetos

48

RAcl gulix.cl

Вам также может понравиться