Programar en PHP
Programar páginas
PHP
Lo primero que vamos a hacer es crear
una página PHP que nos informe de
las características del interprete
de PHP que tenemos instalado en nuestro
servidor de web. Para ello debemos
de crear una página PHP con el contenido
siguiente:
<? phpInfo(); ?>
Este debe de ser el contenido de
un fichero de nombre "info.php" y
que debe de estar en algún lugar accesible
por el servidor de web. Quizás lo
mejor sea que lo guardes dentro de
tú directorio personal web: "/home/tu_login/public_html".
Por ejemplo yo lo tengo dentro del
directorio "/home/acs/public_html/info.php".
Una vez que lo tengas guardado vamos
a intentar abrir esta página. Para
ello apunta tú navegador a la página:
"http://localhost/~tu_login/info.php".
En mi caso dicha página es: "http://localhost/~acs/info.php".
El resultado que debes de obtener
debe de ser algo similar al de la
siguiente figura número 1.
Al pedirle esta página al servidor
de web, este al ver su extensión llama
al interprete de PHP y le dice que
"ejecute" la página y le entregue
los resultados. El interprete abre
la página y ejecuta la llamada a la
función "phpInfo()" que, como resultado,
nos entrega toda la información sobre
el interprete de PHP en formato HTML.
¿Verdad que es sencillo?.
Vamos con una página algo más complicada.
Y vamos con la orientación a objetos.
PHP tiene soporte para la programación
orientada a objetos, es decir, puedes
crear clases para la construcción
de objetos, con sus constructores
etc. El soporte de objetos que tenemos
en PHP no es tan potente como el de
C++, pero cada vez es más completo
y en esta versión nueva de PHP4 este
soporte ha sido mejorado.
Si no sabes programar utilizando
objetos en este curso algo vas a aprender
pero te recomiendo que sin más dilación
consigas algún buen libro o tutorial
por Internet. Los objetos cada vez
tienen más fuerza a la hora de desarrollar
software. De cualquier forma en este
curso vamos a utilizar la programación
con objetos en un nivel muy básico.
En nuestro siguiente ejemplo vamos
a crear un objeto que nos va a permitir
acceder a diversas bases de datos.
Claro está que lo vamos a dejar sin
implementar aún en gran parte, pero
todo llegará. Aquí va el código de
la página:
<?php
class connection {
var $dbug=1, $con, $type;
function getType() {global $type;return $this->type;}
// Constructor del objeto de conexión a la base de datos
function connection($typedb="MySQL",$database_name="template1") {
$this->connection_open ($typedb,$database_name);
}
// Apertura de la conexión con la base de datos
function connection_open ($typedb,$database_name) {
$this->$type=$typedb;
if ($type=="PostgreSQL") $this->$con=new postgresql_connection;
elseif ($type=="MySQL") $this->$con=new mysql_connection;
else {error_message("Open:Unkown database type");exit;}
$this->$con->connection_open($database_name);
}
}
class mysql_connection {
function mysql_connection() {
echo "<h1>La clase mysql_connection aún no está implementada.<h1>";
}
function connection_open($database_name) {
echo "<h1>Método connection_open sin implementar.<h1>";
}
}
$bd = new connection("MySQL","template1");
?>
Si el lector está acostumbrado a
la programación con objetos este código
le resultará muy familiar. Tenemos
una clase principal "connection" que
se encarga de gestionar las conexiones
con la base de datos. Cuando desde
nuestro programa queramos acceder
a una base de datos, nos creamos un
objeto connection pasándole como parámetros
al constructor de connection, método
que se llama de forma automática al
crear el objeto, el tipo de base de
datos al que queremos acceder y el
nombre de la base de datos concreta
con la que queremos trabajar.
Este objeto delega en los objetos
específicos de cada base de datos,
el del gestor de base de datos MySQL
es "mysql_connection", la apertura
de una conexión, las peticiones SQL
etc. Esta técnica de utilizar objetos
que delegan el trabajo final en otros
es muy utilizada en lenguajes que
carecen de herencia, mecanismo por
el que una clase hereda toda la información
de estado y métodos de la clase de
a que hereda. PHP3 en sus primeras
versiones no tenía soporte para herencia
por lo que me vi obligado a utilizar
esta técnica. En la actualidad PHP
ya soporta herencia, aunque no múltiple.
Y no, todas las reglas de encapsulación
pública y privada no están implementadas.
Y hay que tener cuidado con algo que
nos puede dar muchos quebraderos de
cabeza: al crear un objeto de una
clase B que hereda de una clase A,
se llama de forma automática al constructor
de la clase B pero no al de su padre,
la clase A.
Sobre la sintaxis de PHP, es muy
similar a la de C o C++. Quizás lo
más destacado ocurre a nivel semántico:
el tipado es muy poco estricto, algo
típico en los lenguajes "script",
y cuando creamos una variable en ella
podemos meter el tipo de datos que
queramos. Esto es muy flexible y cómodo
para el desarrollador, aunque los
errores que se cometen pueden ser
mucho más graves y difíciles de corregir.
Las posibilidades del interprete para
detectar incompatibilidades entre
variables se reducen mucho y puede
ocurrir cosas extrañas en determinadas
circunstancias si no tenemos cuidado.
Sobre el código de este ejemplo en
concreto, tenemos dos clases. La definición
de una clase es hace con la palabra
clave "class" seguida del nombre de
la clase. Entre llaves desarrollamos
toda la descripción de la clase, sus
variables y métodos. Dentro de un
método de la clase (function) se pueden
acceder otras partes de la clase por
medio del puntero "$this". Por ejemplo,
para acceder desde el método "connection_open"
a la variable de la clase "$type"
lo hacemos con "$this->$type".
Si guardamos esta clase en un fichero,
por ejemplo "ejemploDB.php", cuando
accedamos a este fichero a través
del servidor de web, este llamará
de nuevo al interprete de PHP al ver
que la extensión del fichero es "php".
El interprete de PHP analizará el
código y ejecutará la instrucción
":
$bd = new connection("MySQL","template1");
Con ello se crearía un nuevo objeto
de la clase "connection". Al crearse
se llama de forma automática al constructor
"function connection" que a su vez
llama al método "connection_open".
Este método crea un nuevo objeto de
la clase "mysql_connection" ($con)
el cual llama de forma automática
a su constructor "function mysql_connection"
el cual envía la cadena HTML "<h1>La
clase mysql_connection aún no está
implementada.<h1>". Desde el
método "connection_open" de "connection"
se llama a "connection_open" del objeto
"$con", que es de la clase mysql_connection,
lo que provoca que se imprima otra
cadena HTML: "<h1>Método connection_open
sin implementar.<h1>.". Tras
esta última invocación el programa
finaliza y se envía el resultado al
servidor de web, el cual reenvía estos
datos al cliente. En la figura 2 podemos
ver el resultado de dicha ejecución.
Más características de PHP
Ahora que hemos visto lo sencilo
que es desarrollar con PHP vamos a
ver que cosas podemos hacer con él,
las librerías de las que disponemos.
Muchas de estas librerías ya están
orientadas a objetos por lo que su
uso será similar al de este ejemplo.
Este ejemplo es el que utilizaremos
durante el curso para ir introduciendo
más conceptos de PHP y en particular,
para presentar como se trabaja con
las bases de datos MySQL y PostgreSQL.
PHP en cada nueva versión soporta
nuevas funcionalidades por lo que
el mejor método para ver que nuevas
librerías incluye es cuando compilamos.
Si dentro del directorio con las fuentes
de PHP ejecutamos el comando "configure
--help" nos dará información de todas
las posibles opciones que tiene PHP
al ser compilado y, entre esta información,
la de todos los módulos que podemos
añadir a PHP si disponemos de las
librerías adecuadas. Dentro del manual
de PHP disponemos también de una referencia
a todas las funciones disponibles.
Ojo que muchas veces es necesario
compilar PHP de forma especial para
incluir soporte para una determinada
funcionalidad. Por ejemplo, si queremos
acceder desde PHP al gestor de base
de datos MySQL, es necesario que a
la hora de compilar PHP incluyamos
ests soporte. Para ello es necesario
tener las librerías de MySQL instaladas
en el sistema, normalmente en el paquete
"dev" de MySQL, y ejecutar "./configure
--with-mysql" antes de compilar PHP.
De esta forma PHP incluirá en el módulo
generado dicho soporte. En la información
que obtenemos con la llamada a la
función "phpInfo()" se incluye información
sobre los módulos incluidos. En la
figura 3 se puede observar la información
referente al módulo MySQL y al GD,
que se utiliza para la creación de
gráficos "al vuelo".
De esta información es importante
a versión de API del cliente. Si esta
no es compatible con la del servidor
que queramos acceder, no podremos
acceder a este servidor. En este caso
tenemos la versión 3.22 que utiliza
el protocolo 10 para comunicarse con
el servidor MySQL. Si tuvieramos una
versión 3.20 del cliente (la versión
de MySQL que se liberó con licencia
GPL) no podríamos acceder a los servidores
3.22 ya que el cliente utilizaría
el protocolo de comunicaciones versión
9, incompatible con la versión 10.
Siempre que se habla de PHP lo primero
que se hace es presentar el gran número
de gestores de bases de datos a los
que puede acceder.
- Adabas D
- dbm
- dBase
- filePro
- Hyperwave
- Informix
- InterBase
- LDAP
- Microsoft SQL server
- mSQL
- MySQL
- ODBC
- Oracle
- PostgreSQL
- Solid
- Sybase
Pero si este aspecto resulta impresionante
no menos el soporte para:
- Acceso a servidores IMAP
- Envío de correo con SMTP
- Acceso a servidores de FTP
- Acceso a SNMP para gestión de
redes y equipos
- Generación dinámica de gráficos
y documentos PDF
- Análisis de documentos XML
- Corrector de ortografíai
- Genración de datos en WDDX (Intercambio
Web de Datos Distribuidos)
Y todo esto ha sido posible gracias
a que PHP ha sido diseñado de forma
muy modular y ha sido sencillo según
han sido surgiendo librerías, utilizarlas
desde PHP. Toda esta funcionalidad
está basada en librerías que en su
mayor parte no han sido desarrolladas
por el equipo de PHP. La gente de
PHP lo que ha implementado han sido
os cabos necesarios para poder acceder
a las librerías.
A lo largo del curso iremos presentando
el uso de algunas de estas librerías,
aunque nada detiene al lector de comenzar
este aprendizaje. En el manual de
PHP dispone de documentación abundante
sobre todas estas funciones, su uso
y los posibles resultados. Esta entrega
la vamos a finalizar con una descripción
de las nuevas características de PHP4,
versión que utilizaremos a lo largo
de todo el curso.
El nuevo PHP4
La principal novedad de PHP4 es en
el interprete del lenguaje PHP. Gracias
a Zend, desarrollado por Andi Gutmans
y Zeev Suraski, se han logrado aumentos
de entre 5 y 10 veces en la velocidad
de ejecución de páginas PHP. Este
nuevo rendimiento le ha puesto por
delante de ASP, la tencología de Microsoft,
por lo que le va a permitir competir
directamente con ASP en la plataforma
de Microsoft. La plataforma de desarrollo
Apache+PHP en entornos Microsoft está
logrando ya rendimientos superiores
a IIS+ASP, por lo que el aumento de
su uso en estas plataformas parece
muy probable. Esto significará que
en el futuro el desarrollador en plataformas
NT, por ejemplo, no se verá obligado
al uso de IIS+ASP para el desarrollo
de sistemas web, tal y como había
sucedido hasta ahora. Por otro lado,
PHP estaba hasta el momento pensado
básicamente para Apache. Era el único
que tenía soporte para tener a PHP
como un módulo del servidor. Todos
los demás servidores de web sólo podían
utilizar a PHP como cgi. En PHP4 se
han añadido al soporte de la API de
Apache, el de Netscape (NSAPI), el
soporte para ISAPI ( API de Internet
Explorer) y para la API del servidor
de AOL. De esta forma todos estos
servidores podrán lograr rendimientos
similares a Apache en su ejecución
de PHP.
Además del aumento en rendimiento
en lo referente al soporte de objetos
en PHP, la sobrecarga de objetos se
ha mejorado. De esta forma se ha añadido
la posibilidad de métodos polimórficos,
métodos que según desde que referencia
a un objeto se llamen se comportan
de una forma o de otra. Esta característica
es muy importante para incluir soporte
para acceder a las arquitecturas CORBA
y COM.
Otra nueva característica de PHP4
es que se puede compilar para soportar
hebras, algo que no era posible en
PHP3. La principal ventaja que podemos
obtener de esta funcionalidad es el
uso de librerías que utilicen hebras.
Y en la mayoría de las implementaciones
de CORBA esto es así. Quizás pase
ya poco tiempo antes de poder acceder
al mundo CORBA desde PHP.
Para el desarrollador con PHP4 se
incluye un depurador lo que nos evitará
muchos quebraderos de cabeza con PHP.
Podremos seguir con mayor profundidad
esos errores misteriosos que ocurren
en estos lenguajes poco tipados. El
nuevo interprete de PHP es capaz de
liberar los recursos que reservemos
de forma automática con lo que nos
podremos olvidar de liberarlos. Sí,
esto es algo similar al recolector
de basura de Java. Habrá que hacer
pruebas para ver que tal funciona
porque en el caso de Java, muchas
veces da más dolores de cabeza de
los que te ahorra. En la referencia
[2] se puede acceder a un informe
realizado por Javier Carretero sobre
PHP4, el más completo que he encontrado
en Internet.
Conclusiones
Esperamos que con esta primera entrega
del Tutorial de PHP el lector haya recibido
la motivación suficiente como para
empezar a utilizarlo. Si algo caracteriza
a PHP es su sencillez: en pocos días
se puede llegar a ser un desarrollador
de PHP bastante profesional.
En las próximas entregas del curso
se irán presentando las librerías
principales de PHP, las virguerías
que se pueden acceder con muy poco
código y las noticias que aparezcan
dentro del mundo de PHP.
Referencias