# Programación en PHP/Texto Completo

* Si imprimes esta página, o eliges la opción de Vista preliminar de impresión de tu navegador, verás que desaparecen este cuadro y los elementos de navegación de arriba y de la izquierda, pues no son útiles en una versión impresa.
* Pulsando antes en Refrescar esta página te asegurarás de obtener los últimos cambios del libro antes de imprimirlo.
* Para más información, puedes ver Wikilibros:Versión para imprimir.

# Obtener Apache Web Server y PHP
## Obtener Apache y PHP por separado
### Obtener Apache

El servidor de páginas web Apache se puede obtener de la página de descargas del sitio web del servidor HTTP Apache.
En el caso de Apache, existen dos líneas de desarrollo, la 1.x y la 2.x, siendo los complementos de una incompatibles con los de la otra.
Las versiones actuales del servidor son 1.3.33, 2.0.54 y 2.2.9.

### Obtener PHP

PHP se puede obtener de la sección de descargas del sitio web de PHP.
En el caso de PHP, también hay dos líneas de desarrollo. PHP 4.x y PHP 5.x. En este caso, el grado de compatibilidad entre una y otra es bastante alto.
Las versiones actuales son 4.4.5 y 5.2.6.
Ambos programas pueden obtenerse de varias formas, siendo la más sencilla para usuarios noveles obtener el binario.

## Obtener Apache y PHP juntos

Una solución para usuarios inexpertos es obtener en un paquete PHP y Apache. Uno de los paquetes que ofrecen esto es Easy PHP. Se puede descargar desde la web oficial. Una vez instalado sólo hay que poner los archivos PHP en la carpeta www que está en la carpeta donde instalaste el servidor.

# Hola mundo

[Volver al índice general]

## Análisis

Esto es un código muy sencillo. Simplemente guarda la cadena de caracteres o string 'Hola mundo' en la variable $cadena y después se imprime por pantalla con el comando echo.

## Nuevos conceptos
### Inicio de un script en PHP

El ' <?php ' inicial indica que lo que sigue debería ser interpretado por PHP (por el intérprete de PHP), lo que significa que es parte del programa y no del HTML. Al final del documento, o cuando pasamos de nuevo a código HTML, se pone un ' ?>' para indicar a PHP que ignore lo que venga a continuación. La etiqueta de cierre del código en PHP lleva implícito un ' ; '.

### Variables

Las variables son la base de cualquier lenguaje de programación. Sin ellas, no podríamos guardar información para utilizarla más adelante. PHP no sería capaz de hacer nada dinámico. Vemos que las variables son necesarias y PHP las tiene.
Si tienes experiencia con otros lenguajes de programación, sabes que en algunos de ellos es necesario declarar el tipo que va a tener una variable, es decir, el tipo de datos que será capaz de guardar. Son los lenguajes fuertemente tipados y en ellos necesitas saber el tipo de una variable antes de guardar cualquier cosa en ella. Son de este tipo lenguajes tan conocidos como C++ y Java. PHP, por otra parte, es un lenguaje débilmente tipado, porque el tipo de la variable corresponde al tipo del valor que está guardando en este momento. Puedes crear una variable para guardar una cadena de caracteres (string), asignar a esa variable un string, reemplazarlo luego por un número, y no habría problemas. Sin embargo, en C++ habría que haber hecho un cast (conversión explícita de tipos) o guardar ese número en otra variable distinta (del tipo correcto).
Todas las variables en PHP empiezan por '$' seguido de un identificador. Se diferencia entre mayúsculas y minúsculas, por lo que $wiki es diferente de $Wiki.
Para saber más sobre las variables, puedes mirar en el manual de PHP.

### Print

La función print es clave para la salida de datos. Manda cualquier cosa que pongamos entre las comillas (o paréntesis) que siguen a print a la salida (la ventana del navegador). Una función similar podría se como echo, pero print permite al programador saber si la salida se ha realizado correctamente o no.
Un ejemplo de uso del print con comillas sería:
Al texto entre comillas se le trata como si fuera un string, por lo que podemos hacer uso de la concatenación (unir dos strings en uno). Por ejemplo:
y
Los puntos entre medias de las cadenas de caracteres o strings son el operador de concatenación. Los ejemplos anteriores tendrían el mismo efecto pues, en la segunda versión, los 3 strings se unen en uno solo antes de salir por pantalla.
La forma del comando print es una de las menos comunes. Print no es una función, sino una construcción interna. Las funciones, como veremos, tienen sus argumentos entre paréntesis.
De todos modos, podemos usar print también con paréntesis, es decir:
De cara a la optimización de código, cabe destacar, que se deben utilizar comillas simples ( ' ), siempre que no vayas a devolver variables, pues con el uso de la doble comilla ( " ), el compilador debe analizar todo el contenido en busca de variables.
Es interesante hacer notar que echo se utiliza exactamente igual, por lo que si sustituimos en los ejemplos anteriores print por echo tendremos el mismo resultado.
Para saber más sobre print pulsa aquí. Para echo, aquí.

### El punto y coma y los espacios blancos

Otra parte imprescindible para este lenguaje, no así en otros como JavaScript   ▶ o ActionScript, es finalizar cada comando con un punto y coma (";"). Sin él, el intérprete de PHP nos devolverá un error crítico y ni siquiera iniciará la ejecución del script.
Sin embargo PHP ignora completamente los espacios en blanco y los saltos de línea (salvo en las definiciones de cadenas). Esto quiere decir que tanto podemos poner todo un script en una línea como sangrar cada línea tanto como queramos o dejar varias líneas en blanco.

## Enlaces externos

* Hola Mundo en PHP

# Bases del lenguaje

Es obligatorio colocar el código en las etiquetas <?php ... ?>, en un archivo .php, que se abre a través de un servidor web en HTTP.

## Integración de PHP en HTML
# Comentarios

Los comentarios en php son muy similar a los comentarios en C, C++ y Perl. Permite comentarios de una sola línea (de dos formas) y comentarios multilineas.
Los comentarios son escrituras fueras de la programación, lo que significa que el intérprete de PHP no ejecuta nada sobre esas líneas, las cuales tienen como única utilidad especificar al programador en turno ciertas instrucciones, anotaciones o notas mentales de quien hizo el código.
Las etiquetas para comentarios en php son: "//", "#", /*....*/ Ejemplo:

# Variables
## Introducción

En PHP las variables se representan con un signo de dólar seguido por el nombre de la variable. El nombre de la variable es sensible a minúsculas y mayúsculas.
Los nombres de variables siguen las mismas reglas que otras etiquetas en PHP. Un nombre de variable válido tiene que empezar con una letra o un carácter de subrayado, seguido de cualquier número de letras, números y caracteres de subrayado.
Las variables en PHP se asignan, como en muchos otros lenguajes, con el símbolo igual (=).
Nota: $this es una variable especial que no puede ser asignada.
Un ejemplo:

## Inicialización y asignación de variables

PHP es un lenguaje no tipado. Esto significa que las variables no necesitan ser inicializadas y su tipo de dato no solo no precisa ser indicado, sino que éste puede cambiar. PHP simplemente sabe el tipo de dato que se utiliza en cada momento dependiendo del contexto en que se utilice.
Por ejemplo:
No es necesario iniciar variables en PHP, sin embargo, es una muy buena práctica. Las variables no inicializadas tienen un valor predeterminado de acuerdo a su tipo dependiendo del contexto en el que son usadas.

## Variables por valor y variables por referencia

Por defecto, en PHP las variables se asignan por valor. Esto significa que al asignar una expresión a una variable, el valor de la expresión es copiado a la variable.
Por ejemplo:
Sin embargo, las variables también pueden asignarse por referencia. Esto significa que la nueva variable referencia a la variable original. En otras palabras, se convierte en un alias de (o simplemente apunta a) la variable original. Si una de las dos es cambiada, la otra también cambia su valor.
Para asignar por referencia, simplemente se antepone un signo ampersand (&) al comienzo de la variable cuyo valor se está asignando. Sólo las variables con nombre pueden ser asignadas por referencia.
Por ejemplo:
Fuente: Trubiso

## Variables predefinidas

PHP proporciona una gran cantidad de variables predefinidas a cualquier script que se ejecute. Algunas de ellas son:
* $GLOBALS — Hace referencia a todas las variables disponibles en el ámbito global
* $_SERVER — Información del entorno del servidor y de ejecución
* $_GET — Variables HTTP GET
* $_POST — Variables HTTP POST
* $_FILES — Variables de Carga de Archivos HTTP
* $_REQUEST — Variables HTTP Request
* $_SESSION — Variables de sesión
* $_ENV — Variables de entorno
* $_COOKIE — Cookies HTTP

## Ámbito de las variables

El ámbito de una variable es el contexto dentro del cual está definida. La mayor parte de las variables sólo tienen un ámbito simple, que también abarca los ficheros incluidos y requeridos. Por ejemplo:
La variable $var1 estará disponible también al interior del script file.php.
En el caso de las funciones, al contrario que el lenguaje C, las variables definidas en un ámbito global no pueden ser accedidas dentro de un ámbito local (la función):

### Variables globales accesibles

Para que una variable global sea accesible desde un ámbito local, como una función, se debe utilizar la palabra clave global:
Otro método sería utilizar el array $_GLOBALS:

### Variables estáticas

Una variable estática existe sólo en el ámbito local definido, pero no pierde su valor cuando la ejecución del programa abandona este ámbito.
Por ejemplo, el siguiente script:
Imprimiría 0 (cero) cada vez que se llamase a la función prueba. Sin embargo, declarando una variable estática:
Imprimiría una secuencia (0, 1, 2, 3, ...) cada vez que se llamase a la función prueba, ya que el valor de $var1 se conserva estáticamente tras cada llamada a la función.
Las variables estáticas no se pueden redeclarar en la misma función (no se podría declarar otra vez static $var1).

## Variables variables

Una variable variable es simplemente una variable cuyo nombre es el valor de otra variable. Por ejemplo:
O también:

# Cadenas

grupo Las cadenas, también llamadas strings (cadenas en inglés), son un tipo de datos que representan texto. Se llaman cadenas porque están formadas por caracteres únicos encadenados.
Como vimos en el ejemplo de "Hola, Mundo", podemos asignarlas a una variable e incluso combinarlas. Sin embargo es importante que conozcamos más sobre ellas y acerca de cómo funcionan.

## Construcción

Una cadena se puede construir de tres maneras:

### Comillas simples

Se basa en la delimitación del texto mediante comillas simples ( ' ). Esta es la forma más sencilla de construir una cadena, pero también la más estricta: Todo lo que aparece en el interior es integramente la cadena.
Todo lo que introduzcamos aparecerá como tal y se almacenará como tal. En el caso de que necesitemos incluir una comilla simple en el texto, debemos escaparla. Para ello usaremos la barra invertida ( \ ) antes de la comilla ( \' ). En el caso de que deseemos añadir una barra invertida al final de una cadena o antes de una comilla simple, deberemos escapar la propia barra invertida ( \\ ). En cualquier otro caso, la barra invertida aparecerá normalmente.
Ejemplo de 'cómo escapar varias comillas', de poner una barra invertida delante de una comilla \' o de terminar la cadena con una barra invertida\
Como también vemos en este ejemplo, los saltos de línea naturales, es decir saltar la línea en la definición de la cadena, también se mantiene cuando la imprimimos en pantalla.

### Comillas dobles

Cuando necesitamos incluir muchos valores guardados en variables dentro de una cadena, es tedioso tener que utilizar repetidamente el operador concatenador de cadenas ( . ) para unir variables con pedazos de cadena, como hemos visto en el primer ejemplo.
Para esto existe una forma de cadena más flexible, pero con el inconveniente de que hay más cosas que debemos tener en cuenta a la hora de insertar símbolos especiales. Podemos en este caso introducir variables dentro de la cadena y éstas serán interpretadas como su valor, no como su nombre:
El funcionamiento de la barra invertida es similar a las cadenas de comillas simples, pero se aplica, no sólo también al dólar ( $ ), sino a una serie de letras que, cuando son escapadas, adquieren otro significado:
       \n Nueva línea  \r Retorno de carro  \t Tabulador  \$ Signo del dólar  \" Comillas dobles  \\ Barra invertida  \### Carácter representado por 1, 2 ó 3 cifras ( # ) en código octal  \x## Carácter representado por 1 ó 2 cifras en código hexadecimal

### Heredoc

Ésta es quizás la forma menos común de definir cadenas por su extraña sintaxis. No por ello debemos obviarla. Es una potente forma de tener toda la flexibilidad de las comillas dobles sin el problema de tener que escapar las comillas dobles.
Un ejemplo es el siguiente:
    3 peras
    2 manzanas
En detalle, la primera línea contiene tres sígnos de menor que ( <<< ) y a continuación debe tener una serie de caracteres que finalizarán el texto. En nuestro ejemplo eran FIN, pero puede ser cualquier texto que no contenga un salto de línea. En las siguientes líneas ponemos el texto que queremos introducir en la cadena tal como deseamos que aparezca, teniendo en cuenta la tabla superior y la interpretación de las variables. Cuando terminamos la cadena, en la siguiente línea sólo ponemos los caracteres que definimos al principio. No debe haber ningún otro carácter o espacio ni antes ni después de estos caracteres, de hecho, y como excepción, no es necesario el uso del punto y coma tras este texto finalizador.
Además, puesto que el texto finalizador es completamente personalizable podemos evitar errores. Si nuestro texto hubiera sido Tengo, por ejemplo, Al aparecer esta palabra al principio de una línea el interpretador de PHP hubiera entendido que ahí se acaba la cadena y habría producido un error al encontrar texto incongruente a continuación.
Para información más detallada sobre el uso y la sintaxis de las cadenas pulsa aquí.

# Operadores

Si tomamos de las matemáticas que un operador es un símbolo matemático que indica que debe ser llevada a cabo una operación especificada sobre un cierto número de operandos (número, función, vector, etc.), tendremos que en todo lenguaje de programación encontraremos muchos equivalentes y PHP no es la excepción y por su semejanza de C++ o Java tendremos que a un programador ya inducido en estos lenguajes no se le hará nada complicado.

## Operadores de Cadenas:

El único operador de cadenas que existen es el de concatenación, el punto. Pero no os asustéis, PHP dispone de toda una batería de funciones que os permitirán trabajar cómodamente con las cadenas.
En este punto hay que hacer una distinción, la interpretación que hace PHP de las simples y dobles comillas. En el segundo caso PHP interpretará el contenido de la cadena.

## Operador Ternario:

Este es un operador algo particular pues muchos lo ven como una estructura de control llamándolo "if corto" que nos permite simplificar una evaluación, pero cuidado, el utilizarlo de forma anidada puede darnos algunas sorpresas.

## Los ejemplos
### Ejemplo 1

En este ejemplo hacemos uso de 5 operadores básicos utilizados en las expresiones matemáticas. Son la base de todas las operaciones matemáticas y de string que se pueden llevar a cabo en PHP.
Estos 5 operadores matemáticos funcionan exactamente igual a como lo hacen en C++ o en Java. Son:
* Suma (+)
* Resta (-)
* Multiplicación (*)
* División (/)
* Módulo (%) (el resto de la división por defecto)
Para asignar valores a variables utilizaremos =, que a diferencia de el significado matemático de "A es igual que B", en la mayoría de lenguajes de programación significa "A toma el valor de B". A este símbolo se le llama operador de asignación.
| Código | <?php $x = 25; $y = 10; $z = $x + $y; echo "$z\n"; $z = $x / $y; echo "$z\n"; $z = $y * $y * $x; echo "$z - 1250\n"; ?> |
| Salida | 35 2.5 1250 |

## Referencias

* ↑ Domingo Agustín Vázquez. «Diccionario de ciencias».
* ↑ Mehdi Achour; Friedhelm Betz; Antony Dovgal; Nuno Lopes; Hannes Magnusson; Georg Richter; Damien Seguy; Jakub Vrana; Y muchos otros. «Manual de PHP».

# Estructura if

La estructura if es muy sencilla.
Ejemplo Lógico:
Ejemplo PHP:
Se puede complementar con else o else if este último se utiliza cuando queremos tener varios controles por si el primero no coincide, mira el siguiente condicional así secuencialmente hasta que entra. else siempre va al final !
Ejemplo Lógico:
Ejemplo PHP:

# Estructura switch

Compara una variable con cada uno de los case previstos. Si coincide con uno de ellos ejecuta las instrucciones de su interior. De lo contrario ejecuta las instrucciones dentro de default (opcional). break termina con la ejecución de switch, sale del mismo.

# Bucle while

while ejecuta las sentencias en su interior mientras la condición sea verdadera.

# Bucle do while

do while ejecuta al menos una vez evaluando la condición después del bucle.
Rdo: valor = 0 valor = 1 valor = 2

# Bucle for

El bucle for se utiliza para recorrer una secuencia.
En programación, la primera posición de una secuencia es asignada como 0. Si atendemos a esa premisa, la posición 0 en realidad será el primer elemento de la secuencia, y la 4, el quinto elemento. De ahí que $i se le asigne 0, y se finalice en el cuarto elemento.
De esta forma, lo que nos devuelve sería:

# Bucle foreach

foreach ejecuta las sentencias en su interior para cada elemento de la matriz.
Resultado:

# Funciones

Las funciones son rutinas creadas por el programador para realizar procesos que se repetirán o se usarán más de una vez. Las funciones pueden ser n-paramétricas (con n ≥ 0), y estos parámetros pueden ser de entrada, de salida o de entrada y salida; aunque PHP no hace esta distinción del modo en que, por ejemplo, Ada (ver en Wikipedia), sí lo hace.
En PHP, todas las funciones devuelven un valor. Aquellas que no devuelvan uno explícitamente, devuelven NULL, siguiendo el principio de que todo en PHP es una expresión.

# Introducción

Esta sería una llamada a una función sin parámetros:
El código superior ejecuta una llamada a la función
, que imprimirá el texto "Hola amigo".
Funciones con parámetros.
Si necesitas una función a la cuál le puedas pasar parámetros, se escribiría del mismo modo, con el nombre de los parámetros entre los paréntesis, separados por comas. Para una función biparamétrica, el código podría ser algo como:
Nótese que en este ejemplo hemos utilizado la palabra clave return. Esta palabra sirve para que la función devuelva valores al lugar en dónde se haya llamado.
A efectos prácticos digamos que la función se ejecuta en un entorno separado y se "sustituye" en tiempo de ejecución por el resultado devuelto por return en el contexto en el que se había llamado. En el ejemplo anterior, sumar($a, $b) === 3 (siendo === el operador de identidad).

## Parámetros por defecto

En la definición formal de la función se pueden especificar parámetros por defecto, de tal modo que si no se pasa uno en el momento de llamarla, el parámetro toma un valor. Si este valor no se especifica, el intérprete devolverá un error en tiempo de ejecución por número de parámetros inválido.
Para especificarlos, se hace así:

# Sobrecarga de funciones

Desde PHP4, se pueden sobrecargar funciones, esto es, definir funciones que aceptan distintos parámetros y puedan tener una lógica interna diferente.
Una función sobrecargada puede ser algo como:
Falta decir que desde PHP5 las funciones sin parámetros especificados (con una lista vacía), pueden recibir cualquier número arbitrario de parámetros. La lista de funciones anteriores podría reescribirse como una sola, del siguiente modo:
func_num_args,
func_get_args
Un ejemplo que muestra los parámetros utilizados, típico en los libros, es el siguiente:
También se pueden crear funciones anónimas en tiempo de ejecución. Estas funciones son muy útiles en el lambda-cálculo, y se crean con create_function, con un string en el segundo parámetro que sería el código PHP que debe de realizar la función. En PHP6 se introduce un nuevo estilo de funciones anónimas que permite además asignar funciones a variables, así como se hace en otros lenguajes como JavaScript.
De este modo, el siguiente código sería válido en PHP6 o superior.

# Notas

* 1 2 El autor no recuerda desde qué versión mínima, pero seguro que en PHP5 en todas

# Mail

PHP proporciona una forma fácil de enviar emails mediante la función mail, cabe mencionar que no es recomendable usar dicha función para el envío de correo masivo (esto es debido a que abre un socket nuevo por cada email a enviar).

# Intermedio/Arrays
## Introducción

Los arrays son una recolección de datos en una misma variable, por ejemplo un arreglo de los dias de la semana podría ser así:
Ahora bien, si deseamos imprimir un contenido seria, por ejemplo:
Lo cual imprime:
Asi pues podemos notar que el arreglo comienza a recorrerse a partir de la dirección 0, es decir Dias[0] corresponde a 'Lunes' y Dias[6] corresponde a 'Domingo'.
Si deseamos imprimir todos los días de la semana podríamos hacerlo en un ciclo utilizando una variable bandera "i", ejemplo:
Lo cual imprimiria:
Existen varias formas de definir una variable como array (o un valor). Las más comunes son:
Hay que recordar que al escribir dos veces un mismo índice del array, los datos se sobreescriben:
Los ejemplos anteriores acceden mediante un índice a los elementos del array. PHP permite además acceder y modificar los arrays por métodos alternativos que pueden ser mucho más convenientes en determinadas ocasiones.

## Utilizando arrays como pilas

Para añadir un elemento al final del array utilizamos la función array_push y para leer y eliminar el último elemento añadido utilizamos la función array_pop. Esto nos permite p.ej, utilizar un array como una pila para almacenar el estado intermedio de una operación:
La salida será similar a:

## Arrays como diccionarios (tablas Hash)

Al igual que en las tablas de una base de datos muchas veces conviene indexar por una cadena de texto en vez de por un índice entero de forma que podemos buscar p.ej, el nombre de una persona a partir de su identificador fiscal. Supongamos que tenemos la siguiente tabla:
Para representar la misma mediante un array PHP:
Un ejemplo ligeramente más complejo. Supongamos que la tabla tiene varias columnas:
Entonces puesto que nada impide que un elemento de un array sea a su vez otro array:
La salida del script será similar a:
A la hora de crear/inicializar/definir el array podemos también utilizar la sintaxis:
lo cual nos permite mejorar el ejemplo anterior:
La salida entonces será similar a:

# Intermedio/OOP
## PHP Orientado A Objeto

Cuando se trabaja en php orientado a objeto hay que tener en cuenta que se va a trabajar en la creación de un objeto o mejor conocido en php como clases, donde le vamos a dar a este propiedades y métodos que describan al objeto y las acciones que realiza este. Al programar orientado a objeto hay que tener en cuenta que se tiene que pensar todo de forma abstracta hay que abstraer todo lo posible de este objeto para lograr crear un buen objeto.

## Creación de una Clase u objeto

Para crear una clase u objeto utilizando php se hace de la siguiente forma :
En el ejemplo anterior solo se puede ver la como es la sintaxis para iniciar la creación de un objeto , como se pueden dar cuenta se utiliza la palabra reservada class seguida del nombre de la clase y se abre una llave , de forma de que todo lo que esta dentro de esta llave pertenece a todo este objeto , dentro de estas llaves que abren y cierran van todo lo que es propiedades y métodos del objeto.

## Propiedades de una clase

Las propiedades de las clases son los atributos del objeto como por ejemplo : el tamaño de una persona , el peso de una mesa. En php hay 3 niveles de acceso tanto para las propiedades como para los métodos los cuales son:
Public: Cuando le damos este nivel de acceso a un atributo , este puede ser accedido desde cualquier parte, asi sea dentro de su misma clase como desde otra.
Private: Cuando se le da el nivel de acceso private estamos quitandole la libertad de acceso a las demas que intenten acceder solo puede ser accedida desde su propia clase donde este fue definido.
Protected: Cuando le damos el nivel de acceso protegido sigue restringiendo la libertad de acceso a los demas que no sean de la clase donde se esta declarando o de sus subclases.
ahora veamos un ejemplo de como se colocaria la propiedad dentro del objeto en php.

## Métodos de una clase

Como ya le había nombrado antes los tipos de acceso también se utilizan en los método y son los mismos.
Para entender un poco que es el método de una clase u objeto , seria un ejemplo el de un objeto persona que tiene el método caminar , o sentarse o comer. Método seria todo lo que es capaz de realizar el objeto, en php su sintaxis utiliza la palabra reservada function, ahora veamos un ejemplo:
Como pueden ver en el ejemplo se crearon 3 métodos dentro del objeto los cuales tienen cada uno de estos los distintos tipos de nivel de acceso , los metodos son mas que funciones pero las funciones que realiza dicho objeto.

## Constructores

En la programacion orientada a objetos (siglas POO u OOP en inglés) existe un método especial o mágico llamado método constructor. Este método se encarga de inicializar algunas variables --dentro de la clase se llaman propiedades o atributos-- que serán necesarias a la hora de crear una instancia de la clase o lo que es lo mismo, un objeto. Este método mágico usa la palabra reservada __construct.
De esta forma al momento de ser creado el objeto se van a inicializar las propiedades de el objeto como en el ejemplo donde en el objeto a la propiedad a se le asigna x , a la propiedad b se le asigna w y a la propiedad c se le asigna z, seguro se preguntan que es esa variable $this esta es lo que nos sirve para referirnos a que es en este objeto.
Al igual que hay un constructor existe un destructor que realiza todo el trabajo opuesto, que seria destruir todas las variables creadas.

## Destructor

El destructor es utilizado para destruir todas las variables creadas en el objeto algo que no se utiliza mucho ya que php ya se encarga de liberar o eliminar todos los recursos utilizados al finalizar de ejecutar un script, sin embargo puede ser utilizado, su palabra reservada es __destruct, vamos a ver un ejemplo a continuación:
Este llamado al destructor se realiza al momento de finalizar de correr el script.

# Manejo de ficheros

Trabajar con archivos es una parte importante en cualquier lenguaje de programación y PHP no es nada diferente. No importa cuales sean las razones por las que necesites manipular archivos, PHP los acomodará felizmente a través de una gran variedad de funciones. Deberías haber leído y comprendido los conceptos básicos de éste libro antes de seguir aquí.

## fopen y fclose

fopen es una de las funciones básicas para la manipulación de archivos. Abre un archivo en un cierto modo (que tu establecerás) y devuelve el recurso del puntero de archivo. Usando este recurso se puede leer y/o escribir en el archivo, antes de cerrarlo con la función fclose.
En el ejemplo anterior se puede observar que el archivo se abre sólo para lectura especificando "r" como el modo. Para ver una lista completa de los modos existentes para fopen podes encontrarlos en la página Manual PHP.
Abriendo y cerrando el archivo es bien, pero para poder realizar operaciones útiles necesitas saber acerca de las funciones fread y fwrite.
Cuando PHP finaliza la ejecución de un programa, todos los archivos abiertos son automáticamente cerrados. Asi que por lo tanto no es necesario cerrar un archivo luego de abrirlo y haber trabajado con el mísmo, pero a su vez, es considerado una buena practica de programación.

## Lectura de archivos

La lectura de archivos se puede hacer de varias formas. Si tan solo lo que se necesita es el contenido del archivo, se puede usar la función file_get_contents. Si queremos cada una de las líneas del archivo en una matriz (array) se puede usar el comando file. Para un control total sobre la lectura del archivo se recomienda utilizar fread.
Por lo general, estas funciones son intercambiables y cada una puede ser utilizada para cumplir con la función de cada una. Las primeras dos no requieren abrir el archivo con fopen o cerrarlo con fclose. Éstas funciones son bastante útiles para operaciones rápidas realizadas de una sola vez. Si se planea realizar múltiples operaciones en un archivo es mejor utilizar fopen en conjunto con fread, fwrite y fclose ya que es mucho más eficiente.
A continuación se muestra ejemplos utilizado las funciones mencionadas anteriormente.
Ejemplo usando file_get_contents:
El resultado es:
Esta función lee el archivo completo como una cadena (o string) para luego ser manipulada como si fuese cualquier otra cadena.
Ejemplo usando file:
El resultado es:
Esta función lee el archivo completo como una matriz (o array). Cada item en la matriz corresponde a una linea en el archivo.
Ejemplo usando fread:
El resultado es:
Esta función puede leer hasta una cantidad especificada de bytes del archivo y devolviéndolos como una cadena. Para la mayor parte, las primeras dos funciones son preferidas pero hay ocasiones en las que ésta función es necesaria.
Como puedes ver, con estas tres funciones se podrá leer fácilmente datos desde un archivo en la forma que sea conveniente para trabajar con los mismos. El siguiente ejemplo demuestra como estas tres funciones pueden se utilizadas para hacer los trabajos de las otras pero esto es opcional. Puede saltar y pasar hacia la sección Escritura si no está interesado.

# Mysql

PHP es un lenguaje con capacidad de conexión con bases de datos. Puede comunicarse con distintos tipos, como MySQL, PostgreSQL, Interbase, Firebird, Informix, Oracle, MS SQL 7, Foxpro, Access, ADO, Sybase, FrontBase, DB2, SAP DB, SQLite y así cómo ODBC.

### PHP y MySQL

En este apartado solo nos vamos a centrar en el uso de php con mysql, ya que sql es un lenguaje en particular, y muy generalizado. Normalmente, para la administración de bases de datos mysql, se usa PhpMyAdmin, una interfaz muy amigable con la que manejar las db. Así que comencemos:

## Conexión

Lo primero que se debe realizar siempre, es la conexión de php con mysql. Para conectar con una base de datos, se usa la función mysql_connect, donde deberemos indicar el servidor, el usuario y la clave. Aquí un ejemplo:
En las variables dbhost, dbuser, y dbpass, definimos el servidor, el usuario y la clave de nuestro servidor mysql. Y en la variable $conx, creamos la variable de conexión. A continuación, tenemos que seleccionar, dentro del servidor, la base de datos que queremos usar: Aquí un ejemplo:

## Primera Consulta

Bien, llegados a este punto vamos a crear nuestra primera consulta. Vamos a contar con que el código de conexión y de selección de la DB lo tenemos escrito en el archivo conectar.php, y para ahorrarnos unas líneas, vamos a incluirlo en vez de reescribirlo. Para hacer una consulta, se usa la siguiente sintaxis: $sentencia = "SELECT [columna1, columna2] FROM nombre_tabla"; y después se ejecuta la consulta. Por último, se almacenan los datos en un array con la función mysql_fetch_array($nombredelapeticion). Aquí un ejemplo:
El código anterior nos mostraría todos los usuarios y sus claves de la tabla usuarios.
Nota: Si en vez de usuario y apellidos, que es seleccionar determinadas columnas de la tabla, usamos un asterisco (*), se seleccionarían todas las columnas de la tabla.
Bien, con eso lo que hemos hecho es seleccionar todos los registros existentes; pero, ¿y si queremos, usando el ejemplo anterior, la clave de determinado usuario? Para ello usaríamos WHERE. Aquí un ejemplo:
La idea es simple. En pseudocódigo sería algo como: Selecciona todos los datos de el usuario pedro de la tabla usuarios. Se pueden ir añadiendo "filtros" como queramos: ...WHERE usuario='pedro' AND nombre='pedro picapiedra'...
Nota: Importante recordar usar siempre comillas simples al asignar valores. Es decir, es así: ...usuario='pedro'... no así: ...usuario="pedro".
Nota2: Para usar variables se usa igual: ...usuario='$miusuario'...
Y por último, hay más añadidos a la sentencia como ORDER BY nombre ASC (donde ordena alfabéticamente por el nombre en ASCendente) o LIMIT 0,30 la cual nos dará los resultados del registro 0 al 30 únicamente.
También podemos obtener en número de registros obtenidos con la función mysql_num_rows($nombredelapeticion). Que nos devolveria, por ejemplo: 5, si tenemos 5 registros en nuestra tabla.

## Insertar datos

Para insertar datos, basta con indicar que columnas se van a insertar, y luego asignarle los valores a esas columnas. La sintaxis es:
$consulta = "INSERT INTO [nombre_tabla] ([columna1], [columna2],...,[columnaN]) VALUES ('$var1', '$var2',..., '$varN')";
Aquí un ejemplo (sin usar variables, son con texto):

## Actualizar Datos

Para actualizar, basta con indicar que columna se quiere cambiar, por el qué se quiere cambiar, y a quien se quiere cambiar. la sintaxis sería:
$consulta = "UPDATE [nombre_tabla] SET [columna1]='$valor1', [columna2]='$valor2' WHERE [columna3]='$valor3'";
Aquí un ejemplo (sin usar variables, son con texto):
Otro ejemplo (con uso de variables):

## Borrar Datos

Para borrar datos, basta con indicar a quien se quiere borrar o el que. La sintaxis sería:
$consulta = "DELETE [nombre_tabla] WHERE [columna1]='$valor1'";
Aquí un ejemplo (sin usar variables, son con texto):
Esto nos habría borrado esa fila del usuario.

# Avanzado/Graficos GD

Pendiente.. Escribir breve intro de que es GD.

# Un nuevo concepto: Encabezados

Hasta ahora le hemos pedido a PHP que envíe texto al navegador, pero cuando trabajamos con imágenes, es necesario decirle al servidor web qué tipo de datos estamos enviando, para que a su vez, se lo notifique a los navegadores.
Para ello, utilizamos la función header.
Esta función nos permite enviar mucha información al navegador; pero en esta ocasión, sólo nos interesa uno de los parámetros posibles: El parámetro "Content-type".
En el ejemplo anterior Content-type, o Tipo de contenido, nos permite decirle al navegador que la serie de datos que estamos enviando es una imágen y que es de tipo 'png'.

# Manipulación de imágenes

Para cualquier imágen, vamos a requerir los siguientes bloques de código:
* Crear / Abrir
* Dibujar / Manipular / Escribir
* Enviar encabezado
* Desplegar imágen
* Destruir imágen
Ya hablamos del encabezado, asi que ahora veremos cómo interactuar con la imágen.

## Abrir, crear, desplegar y destruir

Para crear una imágen, se debe llamar a imagecreatetruecolor o a imagecreate.
Siempre que se manejen imágenes, es importante destruirlas al finalizar. Esto se logra con la función imagedestroy.
En el ejemplo anterior, hay otra función a la cual prestarle atención: imagePNG. Esta es la función responsable de desplegar nuestra imágen. Si se desea desplegar en otro formato de imágen (que no sea PNG); pueden utilizarse, por ejemplo, las funciones imageGIF, imageWBMP, imageJPEG, etcétera.
Para determinar los tipos de imágenes que soporta su sistema, puede llamar a la función imagetypes.
Abrir una imágen ya existente puede presentar un inconveniente: la forma de abrirla depende del tipo de imágen del que se trata (por ejemplo: imageCreateFromGIF, imageCreateFromJPEG o imageCreateFromPNG). Por eso, es útil tener una función que abra cualquier tipo de archivo.
El siguiente código, basado en un comentario en la página de PHP, trata de determinar el tipo de archivo del que se trata y utiliza la función correspondiente.
Se basa en la función getimagesize, la cual regresa un arreglo del cual el elemento con índice 2 regresa un código dependiendo del tipo de archivo. En caso de existir la función que abre ese tipo específico de archivo, lo abre. De lo contrario termina la ejecución.

## Colores y canales alfa

En GD, los colores suelen estar representados en el modelo de color RGB (por las siglas en inglés Red, Green, Blue; es decir Rojo, Verde, Azul).
Sin embargo, hay un cuarto componente cuando elegimos un color (por ejemplo, con imagecreatetruecolor): 'alfa'. El valor de alfa también es conocido como transparencia. En donde 255 es completamente transparente, y 0 es totalmente opaco.
En el siguiente ejemplo, se asignan 2 colores. Uno se utiliza para rellenar el fondo de la imágen y el otro para escribir texto en la imágen.
La función imagealphablending establece el modo de mezcla de transparencia para una imágen. Esto es necesario si queremos que se mezclen los valores de transparencia en la imágen.

## Líneas, círculos, rectángulos

Hay muchas funciones para dibujo, como lo son: imageFill, imageFilledRectangle, imageRectangle, imageLine, imageArc, etc..

## Texto
### Fuentes no predeterminadas
# Enlaces externos

* Devtrolls - Fuentes con licencia libre

# Avanzado/Graficos GD

Pendiente.. Escribir breve intro de que es GD.

# Un nuevo concepto: Encabezados

Hasta ahora le hemos pedido a PHP que envíe texto al navegador, pero cuando trabajamos con imágenes, es necesario decirle al servidor web qué tipo de datos estamos enviando, para que a su vez, se lo notifique a los navegadores.
Para ello, utilizamos la función header.
Esta función nos permite enviar mucha información al navegador; pero en esta ocasión, sólo nos interesa uno de los parámetros posibles: El parámetro "Content-type".
En el ejemplo anterior Content-type, o Tipo de contenido, nos permite decirle al navegador que la serie de datos que estamos enviando es una imágen y que es de tipo 'png'.

# Manipulación de imágenes

Para cualquier imágen, vamos a requerir los siguientes bloques de código:
* Crear / Abrir
* Dibujar / Manipular / Escribir
* Enviar encabezado
* Desplegar imágen
* Destruir imágen
Ya hablamos del encabezado, asi que ahora veremos cómo interactuar con la imágen.

## Abrir, crear, desplegar y destruir

Para crear una imágen, se debe llamar a imagecreatetruecolor o a imagecreate.
Siempre que se manejen imágenes, es importante destruirlas al finalizar. Esto se logra con la función imagedestroy.
En el ejemplo anterior, hay otra función a la cual prestarle atención: imagePNG. Esta es la función responsable de desplegar nuestra imágen. Si se desea desplegar en otro formato de imágen (que no sea PNG); pueden utilizarse, por ejemplo, las funciones imageGIF, imageWBMP, imageJPEG, etcétera.
Para determinar los tipos de imágenes que soporta su sistema, puede llamar a la función imagetypes.
Abrir una imágen ya existente puede presentar un inconveniente: la forma de abrirla depende del tipo de imágen del que se trata (por ejemplo: imageCreateFromGIF, imageCreateFromJPEG o imageCreateFromPNG). Por eso, es útil tener una función que abra cualquier tipo de archivo.
El siguiente código, basado en un comentario en la página de PHP, trata de determinar el tipo de archivo del que se trata y utiliza la función correspondiente.
Se basa en la función getimagesize, la cual regresa un arreglo del cual el elemento con índice 2 regresa un código dependiendo del tipo de archivo. En caso de existir la función que abre ese tipo específico de archivo, lo abre. De lo contrario termina la ejecución.

## Colores y canales alfa

En GD, los colores suelen estar representados en el modelo de color RGB (por las siglas en inglés Red, Green, Blue; es decir Rojo, Verde, Azul).
Sin embargo, hay un cuarto componente cuando elegimos un color (por ejemplo, con imagecreatetruecolor): 'alfa'. El valor de alfa también es conocido como transparencia. En donde 255 es completamente transparente, y 0 es totalmente opaco.
En el siguiente ejemplo, se asignan 2 colores. Uno se utiliza para rellenar el fondo de la imágen y el otro para escribir texto en la imágen.
La función imagealphablending establece el modo de mezcla de transparencia para una imágen. Esto es necesario si queremos que se mezclen los valores de transparencia en la imágen.

## Líneas, círculos, rectángulos

Hay muchas funciones para dibujo, como lo son: imageFill, imageFilledRectangle, imageRectangle, imageLine, imageArc, etc..

## Texto
### Fuentes no predeterminadas
# Enlaces externos

* Devtrolls - Fuentes con licencia libre

# Avanzado/La extensión SOAP

En La versión PHP >= 5 se puede trabajar directamente los métodos SOAP instanciando la clase para tal fin .
Para iniciar trabajos con soap en PHP >= 5 se debe habilitar la extensión soap en el php.ini Nota: Si habilita la extensión soap o ya está habilitado no podría utilizar librerías como nusoap puesto que el nombre de las clases en las dos son iguales esto generaría un error.

# Ejemplos/Calcular edad
## Calcular edad con PHP Con Funciones
### Introducción

Un cálculo muy solicitado en muchas ocasiones es el de calcular la edad. Es un calculo sencillo una vez tienes en cuenta algunos factores imprescindibles.
Si has nacido en 1980 y estamos en el 2000 tendrías 20 años siempre que hayas sobrepasado el día y el mes de tu nacimiento. Sabiendo esto generaremos dos if que restaran un año en el caso de no cumplir con la condición.

### Código PHP

Como veis es un código muy simple donde tendréis que sustituir las variables "$dianaz=2" "$mesnaz=6" y "$anonaz=1983" por la fecha de nacimiento a calcular para que os sea completamente útil.
Una manera más elegante y compacta de hacerlo puede ser:
Llamando a la función CalculaEdad con la fecha en formato YYYY-mm-dd como parámetro, nos devuelve la edad de una persona nacida en esa fecha. Ej: CalculaEdad("1945-11-22");

# Traspaso de variable

Aquí aprenderás a combinar PHP y HTML de manera eficiente y sencilla. Se tratará de explicar todo lo que ocurre de un paso a otro. Se presupone que si estás aquí es porque tienes instalado un servidor Apache con alguna versión de PHP. Si no, revisa la página inicial Programación en PHP.
Para iniciar una explicación detallada comenzaremos con un ejemplo (ejemplo.html):
Esta es una sencilla página que posee un formulario que nos permitirá solicitar una información al usuario. Notesé que se usa el method="GET" es decir que va a pasar datos través de url del navegador, suena extraño pero en cuanto se finaliza el ejemplo se ve con claridad (Solo es necesario fijarse en la barra de direcciones del navegador). Es importante poner el name="prueba" ya que será el nombre de la variable o del dato que se pase de una página a otra.
Para hacerlo lo mas sencillo posible lo haremos de la siguiente forma (prueba.php):
Bien, lo que hace es simple y sencillo, comprobamos mediante la función isset que la variable "prueba" está definida, si lo está mostramos lo que escribió el usuario, en caso contrario mostramos un error que dice 'Variable "prueba" no definida.'. Debes tener presente que para que este ejemplo funcione debe realizarse bajo un servidor que use PHP, abre http://localhost/ejemplo.html para que funcione correctamente.

# Utilidades/Intercambio de variables

Se pueden intercambiar variables, sus nombres, etc muy fácilmente:
Para hacer que a partir de una variable en un array se cree otra variable, se puede hacer esto:

# Avanzado/XML en PHP 5

Version 1.2, November 2002

## 0. PREAMBLE

The purpose of this License is to make a manual, textbook, or other functional and useful document "free" in the sense of freedom: to assure everyone the effective freedom to copy and redistribute it, with or without modifying it, either commercially or noncommercially. Secondarily, this License preserves for the author and publisher a way to get credit for their work, while not being considered responsible for modifications made by others.
This License is a kind of "copyleft", which means that derivative works of the document must themselves be free in the same sense. It complements the GNU General Public License, which is a copyleft license designed for free software.
We have designed this License in order to use it for manuals for free software, because free software needs free documentation: a free program should come with manuals providing the same freedoms that the software does. But this License is not limited to software manuals; it can be used for any textual work, regardless of subject matter or whether it is published as a printed book. We recommend this License principally for works whose purpose is instruction or reference.

## 1. APPLICABILITY AND DEFINITIONS

This License applies to any manual or other work, in any medium, that contains a notice placed by the copyright holder saying it can be distributed under the terms of this License. Such a notice grants a world-wide, royalty-free license, unlimited in duration, to use that work under the conditions stated herein. The "Document", below, refers to any such manual or work. Any member of the public is a licensee, and is addressed as "you". You accept the license if you copy, modify or distribute the work in a way requiring permission under copyright law.
A "Modified Version" of the Document means any work containing the Document or a portion of it, either copied verbatim, or with modifications and/or translated into another language.
A "Secondary Section" is a named appendix or a front-matter section of the Document that deals exclusively with the relationship of the publishers or authors of the Document to the Document's overall subject (or to related matters) and contains nothing that could fall directly within that overall subject. (Thus, if the Document is in part a textbook of mathematics, a Secondary Section may not explain any mathematics.) The relationship could be a matter of historical connection with the subject or with related matters, or of legal, commercial, philosophical, ethical or political position regarding them.
The "Invariant Sections" are certain Secondary Sections whose titles are designated, as being those of Invariant Sections, in the notice that says that the Document is released under this License. If a section does not fit the above definition of Secondary then it is not allowed to be designated as Invariant. The Document may contain zero Invariant Sections. If the Document does not identify any Invariant Sections then there are none.
The "Cover Texts" are certain short passages of text that are listed, as Front-Cover Texts or Back-Cover Texts, in the notice that says that the Document is released under this License. A Front-Cover Text may be at most 5 words, and a Back-Cover Text may be at most 25 words.
A "Transparent" copy of the Document means a machine-readable copy, represented in a format whose specification is available to the general public, that is suitable for revising the document straightforwardly with generic text editors or (for images composed of pixels) generic paint programs or (for drawings) some widely available drawing editor, and that is suitable for input to text formatters or for automatic translation to a variety of formats suitable for input to text formatters. A copy made in an otherwise Transparent file format whose markup, or absence of markup, has been arranged to thwart or discourage subsequent modification by readers is not Transparent. An image format is not Transparent if used for any substantial amount of text. A copy that is not "Transparent" is called "Opaque".
Examples of suitable formats for Transparent copies include plain ASCII without markup, Texinfo input format, LaTeX input format, SGML or XML using a publicly available DTD, and standard-conforming simple HTML, PostScript or PDF designed for human modification. Examples of transparent image formats include PNG, XCF and JPG. Opaque formats include proprietary formats that can be read and edited only by proprietary word processors, SGML or XML for which the DTD and/or processing tools are not generally available, and the machine-generated HTML, PostScript or PDF produced by some word processors for output purposes only.
The "Title Page" means, for a printed book, the title page itself, plus such following pages as are needed to hold, legibly, the material this License requires to appear in the title page. For works in formats which do not have any title page as such, "Title Page" means the text near the most prominent appearance of the work's title, preceding the beginning of the body of the text.
A section "Entitled XYZ" means a named subunit of the Document whose title either is precisely XYZ or contains XYZ in parentheses following text that translates XYZ in another language. (Here XYZ stands for a specific section name mentioned below, such as "Acknowledgements", "Dedications", "Endorsements", or "History".) To "Preserve the Title" of such a section when you modify the Document means that it remains a section "Entitled XYZ" according to this definition.
The Document may include Warranty Disclaimers next to the notice which states that this License applies to the Document. These Warranty Disclaimers are considered to be included by reference in this License, but only as regards disclaiming warranties: any other implication that these Warranty Disclaimers may have is void and has no effect on the meaning of this License.

## 2. VERBATIM COPYING

You may copy and distribute the Document in any medium, either commercially or noncommercially, provided that this License, the copyright notices, and the license notice saying this License applies to the Document are reproduced in all copies, and that you add no other conditions whatsoever to those of this License. You may not use technical measures to obstruct or control the reading or further copying of the copies you make or distribute. However, you may accept compensation in exchange for copies. If you distribute a large enough number of copies you must also follow the conditions in section 3.
You may also lend copies, under the same conditions stated above, and you may publicly display copies.

## 3. COPYING IN QUANTITY

If you publish printed copies (or copies in media that commonly have printed covers) of the Document, numbering more than 100, and the Document's license notice requires Cover Texts, you must enclose the copies in covers that carry, clearly and legibly, all these Cover Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on the back cover. Both covers must also clearly and legibly identify you as the publisher of these copies. The front cover must present the full title with all words of the title equally prominent and visible. You may add other material on the covers in addition. Copying with changes limited to the covers, as long as they preserve the title of the Document and satisfy these conditions, can be treated as verbatim copying in other respects.
If the required texts for either cover are too voluminous to fit legibly, you should put the first ones listed (as many as fit reasonably) on the actual cover, and continue the rest onto adjacent pages.
If you publish or distribute Opaque copies of the Document numbering more than 100, you must either include a machine-readable Transparent copy along with each Opaque copy, or state in or with each Opaque copy a computer-network location from which the general network-using public has access to download using public-standard network protocols a complete Transparent copy of the Document, free of added material. If you use the latter option, you must take reasonably prudent steps, when you begin distribution of Opaque copies in quantity, to ensure that this Transparent copy will remain thus accessible at the stated location until at least one year after the last time you distribute an Opaque copy (directly or through your agents or retailers) of that edition to the public.
It is requested, but not required, that you contact the authors of the Document well before redistributing any large number of copies, to give them a chance to provide you with an updated version of the Document.

## 4. MODIFICATIONS

You may copy and distribute a Modified Version of the Document under the conditions of sections 2 and 3 above, provided that you release the Modified Version under precisely this License, with the Modified Version filling the role of the Document, thus licensing distribution and modification of the Modified Version to whoever possesses a copy of it. In addition, you must do these things in the Modified Version:
    A. Use in the Title Page (and on the covers, if any) a title distinct from that of the Document, and from those of previous versions (which should, if there were any, be listed in the History section of the Document). You may use the same title as a previous version if the original publisher of that version gives permission.
    B. List on the Title Page, as authors, one or more persons or entities responsible for authorship of the modifications in the Modified Version, together with at least five of the principal authors of the Document (all of its principal authors, if it has fewer than five), unless they release you from this requirement.
    C. State on the Title page the name of the publisher of the Modified Version, as the publisher.
    D. Preserve all the copyright notices of the Document.
    E. Add an appropriate copyright notice for your modifications adjacent to the other copyright notices.
    F. Include, immediately after the copyright notices, a license notice giving the public permission to use the Modified Version under the terms of this License, in the form shown in the Addendum below.
    G. Preserve in that license notice the full lists of Invariant Sections and required Cover Texts given in the Document's license notice.
    H. Include an unaltered copy of this License.
    I. Preserve the section Entitled "History", Preserve its Title, and add to it an item stating at least the title, year, new authors, and publisher of the Modified Version as given on the Title Page. If there is no section Entitled "History" in the Document, create one stating the title, year, authors, and publisher of the Document as given on its Title Page, then add an item describing the Modified Version as stated in the previous sentence.
    J. Preserve the network location, if any, given in the Document for public access to a Transparent copy of the Document, and likewise the network locations given in the Document for previous versions it was based on. These may be placed in the "History" section. You may omit a network location for a work that was published at least four years before the Document itself, or if the original publisher of the version it refers to gives permission.
    K. For any section Entitled "Acknowledgements" or "Dedications", Preserve the Title of the section, and preserve in the section all the substance and tone of each of the contributor acknowledgements and/or dedications given therein.
    L. Preserve all the Invariant Sections of the Document, unaltered in their text and in their titles. Section numbers or the equivalent are not considered part of the section titles.
    M. Delete any section Entitled "Endorsements". Such a section may not be included in the Modified Version.
    N. Do not retitle any existing section to be Entitled "Endorsements" or to conflict in title with any Invariant Section.
    O. Preserve any Warranty Disclaimers.
If the Modified Version includes new front-matter sections or appendices that qualify as Secondary Sections and contain no material copied from the Document, you may at your option designate some or all of these sections as invariant. To do this, add their titles to the list of Invariant Sections in the Modified Version's license notice. These titles must be distinct from any other section titles.
You may add a section Entitled "Endorsements", provided it contains nothing but endorsements of your Modified Version by various parties--for example, statements of peer review or that the text has been approved by an organization as the authoritative definition of a standard.
You may add a passage of up to five words as a Front-Cover Text, and a passage of up to 25 words as a Back-Cover Text, to the end of the list of Cover Texts in the Modified Version. Only one passage of Front-Cover Text and one of Back-Cover Text may be added by (or through arrangements made by) any one entity. If the Document already includes a cover text for the same cover, previously added by you or by arrangement made by the same entity you are acting on behalf of, you may not add another; but you may replace the old one, on explicit permission from the previous publisher that added the old one.
The author(s) and publisher(s) of the Document do not by this License give permission to use their names for publicity for or to assert or imply endorsement of any Modified Version.

## 5. COMBINING DOCUMENTS

You may combine the Document with other documents released under this License, under the terms defined in section 4 above for modified versions, provided that you include in the combination all of the Invariant Sections of all of the original documents, unmodified, and list them all as Invariant Sections of your combined work in its license notice, and that you preserve all their Warranty Disclaimers.
The combined work need only contain one copy of this License, and multiple identical Invariant Sections may be replaced with a single copy. If there are multiple Invariant Sections with the same name but different contents, make the title of each such section unique by adding at the end of it, in parentheses, the name of the original author or publisher of that section if known, or else a unique number. Make the same adjustment to the section titles in the list of Invariant Sections in the license notice of the combined work.
In the combination, you must combine any sections Entitled "History" in the various original documents, forming one section Entitled "History"; likewise combine any sections Entitled "Acknowledgements", and any sections Entitled "Dedications". You must delete all sections Entitled "Endorsements."

## 6. COLLECTIONS OF DOCUMENTS

You may make a collection consisting of the Document and other documents released under this License, and replace the individual copies of this License in the various documents with a single copy that is included in the collection, provided that you follow the rules of this License for verbatim copying of each of the documents in all other respects.
You may extract a single document from such a collection, and distribute it individually under this License, provided you insert a copy of this License into the extracted document, and follow this License in all other respects regarding verbatim copying of that document.

## 7. AGGREGATION WITH INDEPENDENT WORKS

A compilation of the Document or its derivatives with other separate and independent documents or works, in or on a volume of a storage or distribution medium, is called an "aggregate" if the copyright resulting from the compilation is not used to limit the legal rights of the compilation's users beyond what the individual works permit. When the Document is included in an aggregate, this License does not apply to the other works in the aggregate which are not themselves derivative works of the Document.
If the Cover Text requirement of section 3 is applicable to these copies of the Document, then if the Document is less than one half of the entire aggregate, the Document's Cover Texts may be placed on covers that bracket the Document within the aggregate, or the electronic equivalent of covers if the Document is in electronic form. Otherwise they must appear on printed covers that bracket the whole aggregate.

## 8. TRANSLATION

Translation is considered a kind of modification, so you may distribute translations of the Document under the terms of section 4. Replacing Invariant Sections with translations requires special permission from their copyright holders, but you may include translations of some or all Invariant Sections in addition to the original versions of these Invariant Sections. You may include a translation of this License, and all the license notices in the Document, and any Warranty Disclaimers, provided that you also include the original English version of this License and the original versions of those notices and disclaimers. In case of a disagreement between the translation and the original version of this License or a notice or disclaimer, the original version will prevail.
If a section in the Document is Entitled "Acknowledgements", "Dedications", or "History", the requirement (section 4) to Preserve its Title (section 1) will typically require changing the actual title.

## 9. TERMINATION

You may not copy, modify, sublicense, or distribute the Document except as expressly provided for under this License. Any other attempt to copy, modify, sublicense or distribute the Document is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.

## 10. FUTURE REVISIONS OF THIS LICENSE

The Free Software Foundation may publish new, revised versions of the GNU Free Documentation License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. See http://www.gnu.org/copyleft/.
Each version of the License is given a distinguishing version number. If the Document specifies that a particular numbered version of this License "or any later version" applies to it, you have the option of following the terms and conditions either of that specified version or of any later version that has been published (not as a draft) by the Free Software Foundation. If the Document does not specify a version number of this License, you may choose any version ever published (not as a draft) by the Free Software Foundation.