Академический Документы
Профессиональный Документы
Культура Документы
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.
RAcl gulix.cl
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.
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
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
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.
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.
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).
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.
RAcl gulix.cl
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
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;
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; }
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);
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 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' );
10
RAcl gulix.cl
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);
11
RAcl gulix.cl
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
echo
explode
htmlentities
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
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
printf
str_replace
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;
13
RAcl gulix.cl
stripslashes
strlen
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
array_merge
array_sum
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
in_array
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);
15
RAcl gulix.cl
regresar
Array ( [edad] => 34 [nombre] => Juan Perez [rut] => 12.312.312-3 )
list
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
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
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
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
17
RAcl gulix.cl
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
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();
18
RAcl gulix.cl
setcookie
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
feof
fgetc
file_exist
19
RAcl gulix.cl
filesize
fopen
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
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
unlink
21
RAcl gulix.cl
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.
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.
OPERADOR INSTANCEOF
Se utiliza para saber si un objeto es una instancia de una clase determinada.
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; }
24
RAcl gulix.cl
25
RAcl gulix.cl
Se utilizarn las clases ya creadas anteriormente template y database, el diseo ser bsico pero funcional, se puede siempre mejorar.
Capa de diseo HTML:
26
RAcl gulix.cl
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(); ?>
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 );
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>";
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> "; $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
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á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; }
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']; } } ?>
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="© 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### </span>Hoy : ###fecha### </td></tr> <tr><td class="esqTL"></td><td class="marcoH"></td><td class="esqTR"></td></tr> <tr><td class="marcoV"> </td><td id="central"> <!-- inicio mensaje -->###mensaje###<!-- fin mensaje --><br/> <!-- inicio contenido -->###contenido###<!-- fin contenido --> </td><td class="marcoV"> </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 ©®</td></tr> </table> </body> </html>
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í:<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; }
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; }
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; }
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; }
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; }
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; }
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; }
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; }
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`) ) ;
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);
43
RAcl gulix.cl
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.
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
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
46
RAcl gulix.cl
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 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
47
RAcl gulix.cl
48
RAcl gulix.cl