1 6 ° Encuentro Linux PHP 5 Cambios y nuevas extensiones para hacernos la vida mas simple 6 ° Encuentro Linux 20-22 de Octubre del 2005 Iquique, Chile Jesús M. Castagnetto, Ph.D. http://www.castagnetto.org/
2 6 ° Encuentro Linux 20-22 de Octubre, 2005PHP 5 - Jesús M. Castagnetto2 Agenda ● Visión general de PHP. ● Clases y Objetos en PHP 4. ● Cambios, y nuevas características de lenguaje en PHP 5. ● Nuevas extensiones en PHP 5, y ejemplos de uso.
3 6 ° Encuentro Linux 20-22 de Octubre, 2005PHP 5 - Jesús M. Castagnetto3 ¿Qué es PHP? ● Un lenguaje de programación para Web, que presenta una solución sencilla, pragmática, directa, y escalable. ● Su diseño central es consistente con la conocida Navaja de Occam: “En igualdad de condiciones la solución más sencilla es probable-mente la correcta” [1]. [1] “Entia non sunt multiplicanda praeter necessitatem” http://es.wikipedia.org/wiki/Navaja_de_Occam
4 6 ° Encuentro Linux 20-22 de Octubre, 2005PHP 5 - Jesús M. Castagnetto4 Como funciona ● Una página es pedida al servidor de web (ej. Apache) ● Apache llama a PHP para que procese el archivo. ● PHP genera el contenido, y lo envía al cliente a través de Apache.
5 6 ° Encuentro Linux 20-22 de Octubre, 2005PHP 5 - Jesús M. Castagnetto5 Arquitectura de PHP
6 6 ° Encuentro Linux 20-22 de Octubre, 2005PHP 5 - Jesús M. Castagnetto6 PHP soporta ● Múltiples plataformas (Unix, Linux, Mac OS X, QNX, MS Windows, etc.) ● Muchos servidores de web (Apache, IIS, Netscape, Roxen, thttpd, fhttpd, Java servlet, etc.) ● Una multitud de Bases de Datos (PostgreSQL, MySQL, Informix, Oracle, IBM DB2, MS SQL, etc.) ● Decenas de extensiones
7 6 ° Encuentro Linux 20-22 de Octubre, 2005PHP 5 - Jesús M. Castagnetto7 Algunas extensiones ● GD (GIF, JPEG, PNG, WBMP) ● LDAP ● SNMP ● IMAP (POP, NNTP) ● FTP ● IPTC ● BC/GMP (matemáticas de precisión arbitraria) ● XML, DOM XML, XSLT ● PDF, FDF ● DCOM (sólo Win32) ● Conectividad a Java ● Curl ● Iconv y Recode (conversión de texto: UTF-8, Cirílico, etc.) ● gettext (I18n de GNU) ● zlib (IO comprimido) ● Mcrypt, Mhash ● WDDX ●... y muchas más
8 6 ° Encuentro Linux 20-22 de Octubre, 2005PHP 5 - Jesús M. Castagnetto8 Uso de PHP PHP: 22,167,075 Domains, 1,283,102 IP Addresses Source: Netcraft (www.netcraft.com) Tomado de: http://www.php.net/usage.php
9 6 ° Encuentro Linux 20-22 de Octubre, 2005PHP 5 - Jesús M. Castagnetto9 Modelos de programación usados en PHP ● Procedural estructurada ➢ Definición de funciones ➢ Creación de módulos e inclusión ● Orientada a Objetos (desde PHP 3) ➢ Definición de clases y herencia ➢ Introspección/Reflexión (PHP 4) ➢ Definición de interfaces y clases abstractas (PHP 5) ➢ Visibilidad de entidades (PHP 5) ➢ Componentes estáticos (PHP 5)
10 6 ° Encuentro Linux 20-22 de Octubre, 2005PHP 5 - Jesús M. Castagnetto10 Clases y Objetos en PHP 4 ● El nombre del constructor es el mismo que el de la clase. ● Todos los elementos (propiedades y métodos) son públicos. ● Instancias (objetos) son pasados por valor por defecto. ● No hay elementos de clase, solo de instancia (objetos). ● Pseudo “métodos estáticos”.
11 6 ° Encuentro Linux 20-22 de Octubre, 2005PHP 5 - Jesús M. Castagnetto11 Ejemplo de Clase en PHP 4 articulos[$artnr] += $num; } } class InventarioNombrado extends Inventario { var $dueno; function InventarioNombrado($nombre) { $this->dueno = $nombre; } } $inv = new InventarioNombrado("Nerds'R'Us"); $inv->agregar_articulo(170923, 2); ?>
12 6 ° Encuentro Linux 20-22 de Octubre, 2005PHP 5 - Jesús M. Castagnetto12 Métodos estáticos (PHP 4)
13 6 ° Encuentro Linux 20-22 de Octubre, 2005PHP 5 - Jesús M. Castagnetto13 Pasando objetos (PHP 4)
14 6 ° Encuentro Linux 20-22 de Octubre, 2005PHP 5 - Jesús M. Castagnetto14 Introspección I (PHP 4) ● get_class(): obtiene el nombre de la clase para un objeto dado. ● get_class_methods(): da métodos definidos en una clase u objeto. ● get_class_vars(): variables definidas en la clase dada. ● get_object_vars(): variables definidas en el objeto, usando null para las no asignadas.
15 6 ° Encuentro Linux 20-22 de Octubre, 2005PHP 5 - Jesús M. Castagnetto15 Introspección II (PHP 4) ● get_parent_class(): da el nombre de la clase padre para un objeto o una clase. ● is_a(): prueba si un objeto es instancia de una clase dada o de uno de sus ancestros. ● is_subclass_of(): prueba si un objeto tiene la clase dada como uno de sus ancestros.
16 6 ° Encuentro Linux 20-22 de Octubre, 2005PHP 5 - Jesús M. Castagnetto16 Introspección III (PHP 4) ● get_declared_classes(): obtiene la lista de clases declaradas. ● class_exists(): prueba si una clase ha sido declarada en el ámbito actual. ● method_exists(): prueba si un método determinado existe en una clase dada.
17 6 ° Encuentro Linux 20-22 de Octubre, 2005PHP 5 - Jesús M. Castagnetto17 Problemas con objetos y clases en PHP 4 ● El operador new retorna por defecto una copia de un objeto creado, no una referencia. ● Objetos son pasados por valor (copia) por defecto. ● Comparación de objetos es bien simplista: objetos son iguales si tienen los mismos atributos y valores, y de la misma clase. (Para igualdad ==, e identidad ===)
18 6 ° Encuentro Linux 20-22 de Octubre, 2005PHP 5 - Jesús M. Castagnetto18 Problemas con objetos y clases en PHP 4 (cont.) ● Se puede crear un tipo diferente de instancia en el constructor de una clase asignando a $this. class ClaseMentirosa { function ClaseMentirosa($opt) { $this = new ClasePeligrosa($opt); } } Esto es mal código, sólo posible como efecto secundario de un modelo simplista de objetos.
19 6 ° Encuentro Linux 20-22 de Octubre, 2005PHP 5 - Jesús M. Castagnetto19 Cambios en PHP 5 ● Nuevas palabras reservadas (try, clone, private, interface, final, etc.) ● Funciones de introspección (get_class(), get_parent_class() y get_class_methods()), y constantes mágicas (__CLASS__, __METHOD__ y __FUNCTION__) respetan la capitalización de los nombres. ● Un objeto sin propiedades no es considerado vacío.
20 6 ° Encuentro Linux 20-22 de Octubre, 2005PHP 5 - Jesús M. Castagnetto20 Cambios en PHP 5 (cont.) ● Se agrega un nivel de error: E_STRICT (para interoperatibilidad y compatibilidad futura). ● Cambios (documentados) en el comportamiento de varias funciones: strrpos(), strripos(), array_merge(), ip2long(), etc. ● Nuevos nombres para CLI (php*) y CGI (php-cgi*); y agregado de php-win.exe para la plataforma Win32.
21 6 ° Encuentro Linux 20-22 de Octubre, 2005PHP 5 - Jesús M. Castagnetto21 Cambios en PHP 5 (cont.) ● Propagación de errores mediante excepciones, con la posibilidad de extender la clase básica. ● Sugerencia de tipos (clases) en la definición de parámetros. ● Zend 2 hace mas sencillo el crear una API orientada a objetos para las extensiones de PHP (ej. SQLite, MySQLi, Ming, etc.)
22 6 ° Encuentro Linux 20-22 de Octubre, 2005PHP 5 - Jesús M. Castagnetto22 Cambios en PHP 5 (cont.) ● Nuevas opciones de configuración: – mail.force_extra_parameters – register_long_arrays (HTTP_*_VARS) – session.hash_function (MD5 o SHA-1) – session.hash_bit_per_character (4-6) – zend.ze1_compatibility_mode ● Nuevas funciones para arreglos, interbase, iconv, streams, etc.
23 6 ° Encuentro Linux 20-22 de Octubre, 2005PHP 5 - Jesús M. Castagnetto23 Cambios en PHP 5 (cont.) ● Nuevas extensiones: – SQLite: una BD simple y eficiente. – SimpleXML: Documentos en XML modelados como árboles de objetos. – Streams (Flujos): generalización de recursos de entrada y salida. – SOAP: implementación del estándar y protocolo SOAP, WSDL. – SPL (Standard PHP Library): una colección de interfaces y clases.
24 6 ° Encuentro Linux 20-22 de Octubre, 2005PHP 5 - Jesús M. Castagnetto24 Clases y Objetos en PHP 5 ● Nuevo modelo de representación interna de objetos. ● Motor re-escrito para mejorar la performance y características de la Programación Orientada a Objetos (POO) en PHP 5. ● Constructores y destructores con nombres uniformes: __construct(), __destruct().
25 6 ° Encuentro Linux 20-22 de Octubre, 2005PHP 5 - Jesús M. Castagnetto25 Clases y Objetos en PHP 5 (continuación) ● Visibilidad de componentes (propiedades y métodos): public, private, protected. ● Componentes inmutables: final. ● Operador para la resolución del alcance de un componente (::). ● Componentes estáticos (static) ● Constantes de clase.
26 6 ° Encuentro Linux 20-22 de Octubre, 2005PHP 5 - Jesús M. Castagnetto26 Clases y Objetos en PHP 5 (continuación) ● Clases abstractas ● Interfaces ● Iteración en objetos. ● Métodos para la sobrecarga de propiedades de objetos: __get(), __set(), __isset(), __unset() ● Interceptor de llamadas a métodos: __call() ● Clonación (copia) via __clone()
27 6 ° Encuentro Linux 20-22 de Octubre, 2005PHP 5 - Jesús M. Castagnetto27 Clases y Objetos en PHP 5 (continuación) ● Sugerencia del tipo de clase en los parámetros de métodos. ● Referencia indirecta en métodos que retornan objetos. ● Parámetros pasados por referencia pueden ser inicializados. ● Cargado automático de clases y objetos (__autload()) ● API para reflexión de componentes
28 6 ° Encuentro Linux 20-22 de Octubre, 2005PHP 5 - Jesús M. Castagnetto28 Visibilidad ● Controla el acceso a los elementos. ● Por defecto, los componentes tienen visibilidad pública (public). ● Marcar un elemento como protegido (protected) hace que sólo sea accesible por la clase y sus derivados. ● Un elemento privado (private) sólo es visible en la clase que lo define.
29 6 ° Encuentro Linux 20-22 de Octubre, 2005PHP 5 - Jesús M. Castagnetto29 Visibilidad (ejemplo) define('DATA_SOURCE_DSN', 'pgsql://user%[email protected]/mydb'); class DataSource { private static $instance = null; protected $dsn = null; private function __construct() { $this->dsn = DATA_SOURCE_DSN; } public static function getInstance() { if (is_null(self::$instance)) { self::$instance = new DataSource(); } return self::$instance; } $conn = DataSource::getInstance();
30 6 ° Encuentro Linux 20-22 de Octubre, 2005PHP 5 - Jesús M. Castagnetto30 Elementos inmutables ● Elementos que no deberían ser especializados se pueden marcar como finales (final). ● Las clases también pueden ser definidas como finales, en cuyo caso no se pueden derivar. ● Si una clase es final, no se necesitan marcar los métodos como finales.
31 6 ° Encuentro Linux 20-22 de Octubre, 2005PHP 5 - Jesús M. Castagnetto31 Elementos inmutables (ej) final class Colores { private static $mapa = array ( 'blanco' => 'ffffff', 'azul' => '0000ff',// etc. ); public static function aRGB($nombre) { return Colores::$mapa[$nombre]; } public static function nombres($r, $g, $b) { return array_keys(array_filter(Colores::$mapa, create_function('$val', 'return $val == \''.$r.$g.$b.'\';') )); } $amarillo = Colores::aRGB('blanco'); $color = Colores::nombres('0000ff');
32 6 ° Encuentro Linux 20-22 de Octubre, 2005PHP 5 - Jesús M. Castagnetto32 Elementos abstractos ● Clases y métodos se pueden marcar com abstractos (abstract). ● No se pueden crear instancias de una clase abstracta. ● Un método abstracto fuerza su implementación en clases derivadas. ● La implementación de un método debe tener visibilidad similar o más general que la definición abstracta.
33 6 ° Encuentro Linux 20-22 de Octubre, 2005PHP 5 - Jesús M. Castagnetto33 Elementos abstractos (ej.) abstract class LectorAbstracto { protected $input; function __construct($input) { $this->inicializar($input); } abstract protected function inicializar($input); abstract public function leer(); } class LectorDeArchivo extends LectorAbstracto { protected function inicializar($input) { $this->input = $input } function leer() { return file_get_contents($this->input); } $lector = new LectorDeArchivo('datos.txt'); $datos = $lector->leer();
34 6 ° Encuentro Linux 20-22 de Octubre, 2005PHP 5 - Jesús M. Castagnetto34 Interfaces ● Interfaces definen métodos que una clase derivada debe de implementar. ● Los métodos de una interface son públicos por definición. ● Clases pueden implementar varias interfaces. ● Clases e interfaces comparten el mismo espacio de nombres.
35 6 ° Encuentro Linux 20-22 de Octubre, 2005PHP 5 - Jesús M. Castagnetto35 Interfaces (ejemplo) interface Almacenable { function valorParaAlmacenar(); } class Editor extends Usuario implements Almacenable { function valorParaAlmacenar() { return array('propiedades' => $this->props); } class Archivo implements Almacenable { function valorParaAlmacenar() { return file_get_contents($this->nombreDeArchivo); } function almacenar(Almacenable $obj) { $datos = $obj->valorParaAlmacenar(); // almacenar los datos }
36 6 ° Encuentro Linux 20-22 de Octubre, 2005PHP 5 - Jesús M. Castagnetto36 Iteración en objetos ● Las propiedades públicas de un objeto pueden ser iteradas usando foreach. ● Las interfaces IteratorAggregate e Iterator permiten controlar como los objetos son iterados. ● La SPL define una familia de interfaces y clases para iteración.
37 6 ° Encuentro Linux 20-22 de Octubre, 2005PHP 5 - Jesús M. Castagnetto37 Iteración en objetos (ej.) class Usuario { public $nombre = 'Juan'; public $apellido = 'Perez'; public $id = 'jperez'; public $nivel = 'editor'; public $servidor = 'editors.example.com'; } $obj = new Usuario(); foreach ($obj as $pnombre => $pvalor) { echo "$pnombre : $pvalor\n"; } // este código genera lo siguiente: // // nombre : Juan // apellido : Perez // id : jperez // nivel : editor
38 6 ° Encuentro Linux 20-22 de Octubre, 2005PHP 5 - Jesús M. Castagnetto38 Iteración en objetos (ej. 2) class Usuario2 implements IteratorAggregate{ private $props = array(); function __construct($nombre, $aplld, $id, $nivel) { $this->addProp('nombre', $nombre); $this->addProp('apellido', $aplld); $this->addProp('id', $id); } function addProp($pnombre, $pvalor) { $this->props[$pnombre] = $pvalor; } function getIterator() { return new ArrayIterator($this->props); } $obj2 = new Usuario2('Xiao', 'Qing', 'qingx'); $obj2->addProp('sede', 'Beijin'); foreach ($obj2 as $pnombre => $pvalor) { echo "$pnombre : $pvalor\n"; }
39 6 ° Encuentro Linux 20-22 de Octubre, 2005PHP 5 - Jesús M. Castagnetto39 Clonar (copiar) objetos ● PHP 5 hace una copia superficial de objetos, las propiedades que son referencias a otras entidades, permanecen como referencias. ● Para implementar copias profundas se debe de implementar el método __clone(). ● El método __clone() aumenta el proceso normal de copiado, no lo reemplaza.
40 6 ° Encuentro Linux 20-22 de Octubre, 2005PHP 5 - Jesús M. Castagnetto40 Clonando objetos (ej.): Definiciones class Cosa { public $id; function __construct($id) { $this->id = $id; } class Caja { public $cosas = array(); function agregaCosa(Cosa $c) { $this->cosas[$c->id] = $c; } class Cajota extends Caja { function __clone() { $copia = array(); foreach ($this->cosas as $obj) { $copia[$obj->id] = clone $obj; } $this->cosas = $copia; } $papel = new Cosa('papel'); $regla = new Cosa('regla'); $caja = new Caja(); $caja->agregaCosa($papel); $cj = new Cajota(); $cj->addCose($regla);
41 6 ° Encuentro Linux 20-22 de Octubre, 2005PHP 5 - Jesús M. Castagnetto41 Clonando objetos (ej.): Asignando objetos $caja2 = $caja; // asignación simple echo "Asignando simplemente:\n"; echo 'caja == caja2 : '.var_export($caja == $caja2, true)."\n"; echo 'caja === caja2 : '.var_export($caja === $caja2, true)."\n"; // imprime: // Asignando simplemente: // caja == caja2 : true // caja === caja2 : true El operador de comparación (==) comprueba que los objetos sean de la misma clase, y que sus propiedades tengan los mismo valores. El operador de identidad (===) comprueba además que las variables hagan referencia a la misma instancia del objeto. El operador de comparación (==) comprueba que los objetos sean de la misma clase, y que sus propiedades tengan los mismo valores. El operador de identidad (===) comprueba además que las variables hagan referencia a la misma instancia del objeto.
42 6 ° Encuentro Linux 20-22 de Octubre, 2005PHP 5 - Jesús M. Castagnetto42 Clonando objetos (ej.): Copia superficial $caja3 = clone $caja; // copia superficial echo 'caja == caja3 : '.var_export($caja == $caja3, true)."\n"; echo 'caja === caja3 '.var_export($caja === $caja3, true)."\n"; echo '"papel" en caja == "papel" en caja3 : '.var_export($caja->cosas['papel'] == $caja3->cosas['papel'], true)."\n"; echo '"papel" en caja === "papel" en caja3 : '.var_export($caja->cosas['papel'] === $caja3->cosas['papel'], true)."\n"; // imprime: // caja == caja3 : true // caja === caja3 : false // "papel" en caja == "papel" en caja3 : true // "papel" en caja === "papel" en caja3 : true El objeto interno (“papel”) es pasado al objeto clonado como referencia a la instancia original.
43 6 ° Encuentro Linux 20-22 de Octubre, 2005PHP 5 - Jesús M. Castagnetto43 Clonando objetos (ej.): Copia profunda $cj2 = clone $cj; // copia profunda echo "Copia profunda:\n"; echo 'cj == cj2 : '.var_export($cj == $cj2, true)."\n"; echo 'cj === cj2 : '.var_export($cj === $cj2, true)."\n"; echo '"regla" en cj == "regla" en cj2 : '.var_export($cj->cosas['regla'] == $cj2->cosas['regla'], true)."\n"; echo '"regla" en cj === "regla" en cj2 : '.var_export($cj->cosas['regla'] === $cj2->cosas['regla'], true)."\n"; // imprime: // Copia profunda: // cj == cj2 : true // cj === cj2 : false // "regla" en cj == "regla" en cj2 : true // "regla" en cj === "regla" en cj2 : false El objeto interno (“regla”) es clonado cuando clonamos el objeto contenedor (“cj”).
44 6 ° Encuentro Linux 20-22 de Octubre, 2005PHP 5 - Jesús M. Castagnetto44 Haciendo magia en PHP 5 ● Métodos que interceptan el acceso: – __get(), __set(), __isset(), __unset() – __call() ● Métodos para persistir objetos: – __sleep(), __wakeup() ● Función para carga automática de clases y objetos. – __autoload() ● Representación de objetos: – __toString()
45 6 ° Encuentro Linux 20-22 de Octubre, 2005PHP 5 - Jesús M. Castagnetto45 Interceptando acceso a propiedades del objeto class UserProxy { private $id; private $db; function __construct($id) { $this->db = DB::connect(USER_DSN); $this->id = $id; } function __get($field) { $sql = “select $field from myusers where id='{$this->id}'; // ejecutar SQL y regresar el valor encontrado } function __set($field, $value) { $sql = “update myusers set $field ='$value' where id='{$this->id}'”; // ejecutar SQL y ver que todo funcionó } $u1 = new UserProxy('a001'); echo $u1->name.”\n”; // se ejecuta __get() $u1->cargo = 'admin'; // llama a __set()
46 6 ° Encuentro Linux 20-22 de Octubre, 2005PHP 5 - Jesús M. Castagnetto46 Interceptando acceso a métodos del objeto class ServerProxy { private $hostname; function __construct($url) { $this->hostname = $hostname; } function __call($method, $params) { $conn = curl_init(); //... configurar la sesion (código no mostrado) $payload = “method=$method”; $payload.= '¶ms='.urlencode(wddx_serialize_value($params)); //... asignar la llamada (no mostrado), y ejecutar $res = curl_exec(); //... procesar y regresar los resultados (no mostrado) return $reslimpio; } $s1 = new ServerProxy('rpc.example.com'); $privilegios = $s1->getPriviliges('a0001', 'edit'); // ejecuta __call()
47 6 ° Encuentro Linux 20-22 de Octubre, 2005PHP 5 - Jesús M. Castagnetto47 Persistencia de los objetos class PagingQuery{ private $db; private $numRecords = 10; private $sql; private $offset = 0; function __construct($sql, $numRecs=0) { $this->_init(); if ($sql) $this->sql = $sql; if ($numRecs > 0) $this->numRecords = $numRecs; } function nextRows() { $query = $this->sql." limit ".$this->offset.",".$this->numRecords; $this->offset += $this->numRecords; return $this->db->getAll($query); } private function _init() { global $sdphptalks_dsn; $this->db = DB::connect($sdphptalks_dsn); } function __sleep() { $this->db->disconnect(); return array("numRecords","sql", "offset"); } function __wakeup() { $this->_init(); } Se activa cuando se usa serialize() con el objeto Se activa cuando se usa deserialize()
48 6 ° Encuentro Linux 20-22 de Octubre, 2005PHP 5 - Jesús M. Castagnetto48 Mas magia... function __autoload($clase) { include_once “lib/{$clase}.php”; } $bar = new ClaseSimple(); echo $bar; // [ID: 9af8bb5495acd0450f712b0cf52d65a6] [lib/ClaseSimple.php] class ClaseSimple { private $id; function __construct() { $this->id = md5(time()); } function __toString() { return “(ID: $id)”; } $foo = new ClaseSimple(); echo $foo; // (ID: 344d588c2fd11d2b13f81a74eb994c8d) Permite definir como un objeto se va a representar cuando se convierte a una cadena de caracteres Carga automáticamente las clases necesarias para la definición de objetos
49 6 ° Encuentro Linux 20-22 de Octubre, 2005PHP 5 - Jesús M. Castagnetto49 Excepciones ● Modelo similar a otros lenguajes (ej. Java, Python), con múltiples “catch” pero sin “finally”. ● Una excepción dada pueden ser lanzada nuevamente en un bloque “try... catch”. ● Excepciones “burbujean” de modo que se puede deferir su proceso. ● SPL define un rango amplio de ellas (ej. OutOfRangeException)
50 6 ° Encuentro Linux 20-22 de Octubre, 2005PHP 5 - Jesús M. Castagnetto50 Excepciones (ejemplo 1) class TransactionMonitor { // extra código no mostrado function monitor(Transaction $t) { if ($t->hasAborted()) { throw new Exception($t- >getAbortMessage()); } elseif ($t->hasCompleted()) { // hacer algo return true; } else { return false; } $t = new Transaction($params); $t->start(); $tm = new TransactionMonitor(); try { while (!$tm->monitor($t)) { sleep(10); } } catch (Exception $e) { echo $e->getMessage(); }
51 6 ° Encuentro Linux 20-22 de Octubre, 2005PHP 5 - Jesús M. Castagnetto51 Excepciones (ejemplo 2) class ResourceAccessException extends Exception {} class ResourceReadException extends Exception {} class ResourceWriteException extends Exception {} class RemoteResource { // extra código no mostrado function connect($resip) { $this->sck = @socket_create(AF_INET, SOCK_STREAM, SOL_TCP); if (false === $this->sck) { throw new ResourceAccessException ( 'Cannot create socket: '.socket_strerror(socket_last_error())); } // etc. } function read() { $data = @socket_read($this->sck, 1024, PHP_NORMAL_READ); if (false === $data) { throw new ResourceReadException ( 'Cannot read: '.socket_strerror(socket_last_error())); } // etc } function write($data) { $res = @socket_write($this->sck, $data); if (false === $res) { throw new ResourceWriteException ( 'Cannot read: '.socket_strerror(socket_last_error())); } // etc }
52 6 ° Encuentro Linux 20-22 de Octubre, 2005PHP 5 - Jesús M. Castagnetto52 Reflexión en PHP 5 ● Una interface de programación para obtener información acerca de clases, interfaces, métodos, funciones, y extensiones. ● También obtiene la documentación embebida en cada elemento. ● Compuesta por: – class Reflection { } – interface Reflector { } – class ReflectionException extends Exception { } – class ReflectionFunction implements Reflector { } – class ReflectionParameter implements Reflector { } – class ReflectionMethod extends ReflectionFunction { } – class ReflectionClass implements Reflector { } – class ReflectionObject extends ReflectionClass { } – class ReflectionProperty implements Reflector { } – class ReflectionExtension implements Reflector { }
53 6 ° Encuentro Linux 20-22 de Octubre, 2005PHP 5 - Jesús M. Castagnetto53 Reflexión en PHP 5 (ej.) class Caja { public $cosas = array(); function agregaCosa(Cosa $c) { $this->cosas[$c->id] = $c; } $clase = new ReflectionClass('Caja'); $props = $clase->getProperties(); // un arreglo de ReflectionProperty $methods = $clase->getMethods(); // un arreglo de ReflectionMethod $mvars = array(); $mparams = array(); foreach ($methods as $m) { $mname = $m->getName(); $mvars[$mname] = $m->getStaticVariables(); $prms = $m->getParameters(); // arreglo de ReflectionParameter foreach ($prms as $p) { $mparams[$mname][$p->getName()] = array ( 'porRef' => $p- >isPassedByReference(), 'clase' => $p->getClass(); 'esArreglo' => $p->isArray(), 'permiteNulo' => $p->allowsNull(), 'esOpcional' => $p->isOptional() ); if ($p->isDefaultValueAvailable()) { $mparams[$mname][$p->getName()]['valor'] = $p- >getDefaultValue() }
54 6 ° Encuentro Linux 20-22 de Octubre, 2005PHP 5 - Jesús M. Castagnetto54 Ejemplos de Extensiones ● Streams (flujos) y Filters (filtros) ● SQLite ● SimpleXML
55 6 ° Encuentro Linux 20-22 de Octubre, 2005PHP 5 - Jesús M. Castagnetto55 Flujos y Filtros ● En PHP, las operaciones de escritura y lectura son abstraidas como flujos (streams) de bytes. ● En un flujo, se pueden interponer uno o mas filtros para modificar el contenido transparentemente. ● Flujos (ej. ftp://, compress.zlib://) y Filtros predefinidos (ej. rot13) ● Programador puede definir nuevos tipos de flujos y filtros.
56 6 ° Encuentro Linux 20-22 de Octubre, 2005PHP 5 - Jesús M. Castagnetto56 Flujos y Filtros (ejemplo)
57 6 ° Encuentro Linux 20-22 de Octubre, 2005PHP 5 - Jesús M. Castagnetto57 SQLite ● Una base de datos ligera y rápida, que cumple con la mayoria del estándar SQL 92. ● Viene por defecto con PHP 5. ● Reemplazo directo de BDs mas grandes, en situaciones sencillas. ● API basada en objetos o funciones ● PHP puede usarse para extender la funcionalidad de SQLite.
58 6 ° Encuentro Linux 20-22 de Octubre, 2005PHP 5 - Jesús M. Castagnetto58 SQLite (ejemplo)
59 6 ° Encuentro Linux 20-22 de Octubre, 2005PHP 5 - Jesús M. Castagnetto59 SimpleXML ● Alternativa sencilla para procesar documentos de XML. ● API basada en un árbol de objetos (uno por cada XML tag): la facilidad de estructura de DOM, la ligereza de expat. ● Representación interna mas sencilla que DOM. ● Viene por defecto con PHP 5
60 6 ° Encuentro Linux 20-22 de Octubre, 2005PHP 5 - Jesús M. Castagnetto60 SimpleXML (ejemplo) [libros.xml] Burning Chrome William Gibson The Golden Bough James George Frazer
61 6 ° Encuentro Linux 20-22 de Octubre, 2005PHP 5 - Jesús M. Castagnetto61 Conclusiones ● PHP: un lenguaje simple, efectivo y robusto. Una buena solución para desarrollo de aplicaciones de Web. ● Fácil de aprender, con buen soporte, y eminentemente escalable. ● PHP 5 nos brinda mas herramientas para crear buen código, usémoslas. ● Buena documentación, muchos artículos, y código... a leer se a dicho.
62 6 ° Encuentro Linux 20-22 de Octubre, 2005PHP 5 - Jesús M. Castagnetto62 Para mas información ● PHP: http://www.php.net ● Zend: http://www.zend.com ● Manual de PHP: http://www.php.net/manual/ ● Como documentar: http://www.php.net/dochowto ● Bugs: http://bugs.php.net/ ● Eventos: http://www.php.net/cal.php ● Listas de correo: http://news.php.net ● CVS: http://cvs.php.net ● Otros sitios de PHP.net: http://www.php.net/sites.php ● Libros: http://www.php.net/books.php ● Otras referencias: http://www.php.net/links.php