Archivo de la categoría: PHP

PHP es un lenguaje de programación interpretado basado en scripts orientado a las páginas Web

No es un lenguaje de marcado como podría ser HTML,
XML o WML

Un programa PHP es ejecutado en el servidor y el resultado enviado al navegador

El resultado generalmente generará una página HTML, XML o WML

Al ser un lenguaje que se ejecuta en el servidor no es necesario que el navegador lo soporte, pero para que las páginas PHP funcionen, el servidor donde están alojadas sí debe soportarlo

Ajax

AJAX

Ajax (asynchronous Javascript and XML) permite cargar contenido desde una página web y mostrarlo sin tener que recargarla

Casi cualquier página web actual utiliza esta tecnología: Gmail, Google Maps, YouToube, Facebook, etc

Para realizar esta tarea, Ajax construye una capa de proceso adicional entre la página web y nuestro servidor

De esta manera, las peticiones al servidor serán asíncronas, sin entorpecer el proceso de carga ni las acciones del usuario

Mientras que en el lado del navegador, el usuario podrá realizar acciones en cualquier momento sin quedar paralizado esperando una respuesta del servidor

La actualización de los elementos se realiza a traves de la capa Ajax, de forma dinámica y continua mientras el usuario sigue usando la página

Elementos que componen Ajax

Ahora vamos a examinar cada uno de los distintos elementos que componen una aplicación Ajax

XMLHTTPRequest

El objeto XMLHTTPRequest se encuentra soportado por todos los navegadores modernos, a partir de Internet Explorer 5+, además de Mozilla, Firefox, Konqueror, Opera y Safari

Es soportado por una amplia variedad de plataformas, como Microsoft Windows, UNIX / Linux y Mac OS X

El propósito de este objeto es permitir a Javascript la formulación y el envío de peticiones HTTP al servidor

Antes de utilizar el objeto, debemos llamarlo con su constructor y adaptarlo según las peculiaridades de cada navegador

Microsoft fue el primero en introducir el objeto, con una implementación del mismo como un ActiveX

El resto de navegadores han incluido una versión nativa del mismo aunque implementandolo como un objeto Javascript

Dado que el objeto depende de qué navegador y qué sistema operativo es capaz de utilizarlo, hay que adaptar el código para instancie correctamente

En el ejemplo anterior se muestra cómo sería la llamada del constructor dependiendo del navegador si usaramos código Javascript puro

Si utilizamos el objeto navigator que almacena información sobre el navegador, podríamos hacer una comparación condicional según el tipo de navegador simplemente usandolo como una variable:

Propiedades del objeto

  • onreadystatechange

    determina qué manejador de eventos se llamará cuando cambie la propiedad readyState del objeto

  • readyState

    es un valor entero que informa del estado de la petición:

    • 0 = sin inicializar
    • 1 = cárgandose
    • 2 = cargada
    • 3 = interactiva
    • 4 = completada
  • responseText

    cadena de texto devuelta por el servidor que representa los datos de la petición

  • responseXML

    documento XML devuelto por el servidor que representa los datos de la petición

  • status

    código HTTP de estado devuelto por el servidor

  • statusText

    cadena de texto devuelta por el servidor con una descripción del estado

Métodos del objeto

  • abort()

    detiene la petición actual

  • getAllResponseHeaders()

    devuelve una cadena de texto que contiene todos los encabezados

  • getResponseHeader(x)

    devuelve una cadena de texto con el valor del encabezado x

  • open(‘método’, ‘URL’, ‘a’)

    especifica si el método de la petición es GET o POST, la URL de destino y si la petición debe manejarse de forma asíncrona (si a es true) o síncrona (si es false)

  • send(contenido)

    envía la petición con datos POST de forma opcional

  • setRequestHeader(‘x’, ‘y’)

    define los parámetros con una pareja variable (x) / valor (y) y se asigna al encabezado que se envía con la petición

Ajax con jQuery

Gracias a jQuery, podemos utilizar un código más simplificado y sencillo que nos permite incluso olvidarnos del tipo de navegador o el sistema gracias a los métodos get(), post(), load() y ajax()

get()

Este método solicita datos al servidor con una solicitud HTTP GET

GET se usa básicamente para obtener (recuperar) algunos datos del servidor

El método GET puede devolver datos en caché

Tiene la siguiente sintaxis:

  • URL

    es la dirección de destino

  • callback

    es un parámetro opcional que representa el nombre de la función que se ejecutará en el caso de que la solicitud sea realizada correctamente

En el ejemplo podemos ver cómo cuando pulsemos el elemento button se lanzará una petición GET al servidor, que en este caso trabaja con el lenguaje PHP, a la URL test.php y que contiene el código que debe ejecutarse

Si la solicitud se ejecutase correctamente, se ejecutaría la función anónima que muestra al usuario una advertencia con el contenido de los parámetros data y status

post()

Este método solicita datos al servidor con una solicitud HTTP POST

POST envía datos para su procesamiento a un recurso especificado

El método POST nunca almacena en caché los datos, y a menudo se usa para enviar datos junto con la solicitud

Tiene la siguiente sintaxis:

  • URL

    es la dirección de destino

  • data

    es un parámetro opcional que especifica los datos que serán enviados junto con la solicitud

  • callback

    es un parámetro opcional que representa el nombre de la función que se ejecutará en el caso de que la solicitud sea realizada correctamente

En el ejemplo podemos ver cómo cuando pulsemos el elemento button se lanzará una petición POST al servidor, que en este caso trabaja con el lenguaje PHP, a la URL user.php y que contiene el código acerca del usuario que debe ejecutarse

Si la solicitud se ejecutase correctamente, se ejecutaría la función anónima que muestra al usuario una advertencia con el contenido de los parámetros data y status

load()

Este método obtiene contenidos del servidor y los añade a un elemento de nuestra página

Tiene la siguiente sintaxis:

  • URL

    es la dirección de destino

  • data

    es un parámetro opcional que especifica los datos que serán enviados junto con la solicitud

  • callback

    es un parámetro opcional que representa el nombre de la función que se ejecutará en el caso de que la solicitud sea realizada correctamente

    Esta función ha de tener obligatoriamente los siguientes parámetros:

    • responseTxt

      el contenido de respuesta en caso de éxito

    • statusTxt

      es una cadena de texto con el estado de la petición, puede ser uno de los siguientes valores:

      • abort
      • error
      • notmodified
      • parsererror
      • success
      • timeout
    • xhr

      contiene el objeto XHTMLRequest, el cuál nos proporciona información adicional acerca de la petición Ajax

En el ejemplo podemos ver cómo cuando termine de cargarse el árbol DOM se cargará el contenido de datos.html en el elemento con el id div01, en concreto los elementos dentro de ese fichero que tengan el id p1

Al utilizar un selector para elementos HTML que queremos cargar, jQuery los filtrará sin problemas, como hemos visto en este ejemplo

También podemos cargar otros tipos de fichero, como por ejemplo .txt, pero hemos de tener en cuenta que ha de realizarse por el protocolo HTTP y no directamente desde disco (con file://)

En el caso de que la petición fallase, veríamos El contenido se cargará aquí, en vez del contenido cargado

ajax()

Este método realiza una petición asincrona HTTP

Tiene la siguiente sintaxis:

  • URL

    es un parámetro opcional que recoge la dirección de destino, si no se especifica habrá que añadirlo dentro del parámetro settings como otro valor más

  • settings

    especifica los datos que serán enviados junto con la solicitud

    Pueden ser especificados valores por defecto para todas las peticiones Ajax utilizando el método ajaxSetup()

En el ejemplo podemos ver que se lanzará una petición POST al servidor, que en este caso trabaja con el lenguaje PHP, a la URL teams.php y que contiene el código que debe ejecutarse

En dataType se ha especificado que se va recibir un objeto de tipo JSON y que se van a utilizar los datos proporcionados por el método llamado get_groups con los parámetros league que recoge su valor del elemento con id team-league y season que recoge su valor del elemento con id team-season

Se han incluido los callback hooks beforeSend, error, dataFilter, success y complete para ilustar el orden en el que son llamados

Sólo se ha dotado de código a error, en caso de que falle la petición y a success, en caso de que sea correcta

Si se ejecuta el callback hook success, se recorreran todos los datos recibidos en formato JSON y serán añadidos al elemento con id team-group que corresponde a un elemento option de un campo de selección, este nuevo elemento será añadido al final de los ya existentes

Parámetros de settings

  • accepts

    asigna un determinado dataType de tipo MIME, que se enviará en la cabecera de la solicitud

    Este encabezado le informa al servidor qué tipo de respuesta será aceptada

    En el ejemplo se ha asignado un tipo MIME para trabajar con datos en el formato XML y el servidor devolverá el ‘mycustomtype‘ tal y como se lo hemos especificado

    Para poder trabajar correctamente con el nuevo tipo, es preciso utilizar converters para convertirlo correctamente al formato que nosotros queremos devolver

  • async

    por defecto, todas las solicitudes se envían de forma asíncrona (se establece a true de forma predeterminada)

    Para configurarlas de forma síncrona debe asignarsele como false

    Las solicitudes cross-domain y las dataType: ‘jsonp’ no admiten operaciones sincrónicas

    Hay que tener en cuenta que las solicitudes síncronas pueden bloquear temporalmente el navegador, deshabilitando cualquier acción mientras la solicitud siga activa

    A partir de jQuery 1.8 , el uso de async: false con jqXHR ($.Deferred) está deprecated; deben usarse los callback success, error o complete en lugar de los métodos correspondientes del objeto jqXHR tales como jqXHR.done()

  • beforeSend

    es un método de evento Ajax que se ejecuta antes de la llamada de petición que se puede utilizar para modificar el objeto jqXHR (en jQuery 1.4.x, XMLHTTPRequest) antes que sea enviado

    Puese usarse para añadir cabeceras personalizadas, etc

    Los objetos jqXHR y settings son pasados como argumentos

    Si devuelve false, se cancelará la solicitud

    A partir de jQuery 1.5, las opciones son llamadas independientemente del tipo de solicitud

  • cache

    si se establece en false, forzará que el navegador no almacene en caché las páginas solicitadas

    Establecida en false solo funcionará correctamente con las solicitudes HEAD y GET si se ha agregado ‘_ = {timestamp}‘ a los parámetros GET

    El parámetro no es necesario para otros tipos de solicitudes, excepto en IE8 cuando se realiza un POST a una URL que ya ha sido solicitada con GET

  • complete

    es un método de evento Ajax que se ejecuta después de los eventos success y error

    Este método pasa dos argumentos: jqXHR (en jQuery 1.4.x, XMLHTTPRequest) y una cadena de texto con el estado de la solicitud (‘success‘, ‘notmodified‘, ‘nocontent‘, ‘error‘, ‘timeout‘, ‘abort‘, o ‘parsererror‘)

    A partir de jQuery 1.5, puede aceptar varias peticiones y cada una llamará por turno

  • contents

    determina cómo jQuery analizará la respuesta, dado su tipo de contenido, admite expresiones regulares (añadido en jQuery 1.5)

  • contentType

    tipo de contenido con el cual se enviaran los datos al servidor
    El valor predeterminado es ‘application/x-www-form-urlencoded; charset=UTF-8

    Si pasa explícitamente un tipo de contenido a $.ajax(), siempre será enviado al servidor (incluso si no se envían datos)

    A partir de jQuery 1.6 puede pasarse false para decirle a jQuery que no establezca ningún encabezado de tipo de contenido

    La especificación W3C XMLHttpRequest dice que el juego de caracteres siempre debe de ser UTF-8; especificar otro juego de caracteres no obligaráal navegador a cambiar su codificación

    Para las solicitudes para cross-domain, cuando sea distinta de ‘application/x-www-form-urlencoded‘, ‘multipart/form-data‘, o ‘text/plain‘, el navegador realizará comprobaciones previas a enviar la petición al servidor

  • context

    contexto para todas las respuestas de la petición, de manera predeterminada, el contexto es un objeto que representa la configuración utilizada en la llamada ($.ajaxSettings junto con la configuración introducida con $.ajax() )

    Por ejemplo, especificar un elemento DOM como contexto hará su contexto para el evento de callback complete sea:

  • converters

    método para convertir el valor devuelto al formato que necesitemos como respuesta (añadido en jQuery 1.5)

  • crossDomain

    se utiliza al forzar una solicitud crossDomain (como JSONP) en el mismo dominio, debe establecerse el valor de crossDomain a true

    Esto permite, por ejemplo, la redirección desde el servidor a otro dominio (añadido en jQuery 1.5)

  • data

    datos que se van a enviar al servidor, serán convertidos en una cadena de consulta

    Se añadirá a la url en las solicitudes GET

    Consulta la opción processData para evitar este proceso automático

    En caso de ser una matriz, jQuery serializará varios valores con la misma clave en función del valor de la configuración de traditional

  • dataFilter

    método que se utilizará para manejar los datos de respuesta sin procesar de XMLHttpRequest

    Acepta dos parámetros:

    • data

      los datos sin procesar devueltos por el servidor

    • dataType
  • dataType

    tipo de datos esperado por por servidor

    Si no se especifica ninguno, jQuery intentará inferirlo en función del tipo MIME de la respuesta (un tipo MIME XML generará XML, en 1.4 JSON generará un objeto JavaScript, en 1.4 el script ejecutará el script, y cualquier otro tipo será devuelto como una cadena)

    Los tipos disponibles (y el resultado pasado como primer argumento para su devolución de la llamada aceptada) son:

    • xml

      devuelve un documento XML que se puede procesar a través de jQuery

    • html

      devuelve un documento HTML como texto sin formato; las etiquetas de script incluidas se evaluarán cuando se inserten en el DOM

    • script

      se evalúa la respuesta como JavaScript y es devuelta como texto sin formato

      Deshabilita el almacenamiento en caché agregando un parámetro en la cadena de consulta ‘_ = {timestamp}‘ a la URL, a menos que la opción cache esté establecida como true

      En este caso los POST serán convertidos en GET para las peticiones de remote-domain

    • json

      se evalúa la respuesta como JSON y devuelve un objeto JavaScript

      Los json solicitudes callback placeholder, por ejemplo ‘?callback=?‘, se realizan utilizando JSONP a menos que la solicitud incluya jsonp: false en la configuración de la petición

      Los datos JSON se analizan de manera estricta; cualquier JSON con formato incorrecto será rechazado y se lanzará una error

      A partir de jQuery 1.9, también se rechazan las respuestas vacías; el servidor debería devolver una respuesta null o {} en su lugar (consulta json.org para obtener más información sobre la correción del formato JSON)

    • jsonp

      carga en un bloque JSON usando JSONP

      Añade ‘?callback=?‘ al final de su URL para especificar la devolución de la petición

      Deshabilita el almacenamiento en caché agregando un parámetro en la cadena de consulta ‘_ = {timestamp}‘ a la URL, a menos que la opción cache esté establecida como true

    • text

      cadena de texto sin formato

    • varios valores separados por espacios

      a partir de jQuery 1.5, es posible convertir un dataType recibido en el encabezado Content-Type al que sea necesario

      Por ejemplo, si desea que una cadena de texto sea tratada como un XML, use ‘text xml

      También puede realizar una solicitud JSONP, recibida como texto y será interpretada por jQuery como XML: ‘jsonp text xml

      De igual manera, la cadena abreviada ‘jsonp xml‘, primero, intentará convertir de jsonp a xml y, en su defecto, convertirá de jsonp a texto, y luego de texto a xml

  • error

    evento Ajax que será llamado si la petición falla

    A partir de jQuery 1.5, admite un array de métodos y cada uno será llamado por turno

    No será llamado con peticiones cross-domain script y JSONP

    Recibe los siguientes parámetros:

    • jqXHR

      (en jQuery 1.4.x, XMLHttpRequest)

    • cadena de texto

      describe el tipo de error que se produjo

      Admite los siguientes valores:

      • null

        no es una cadena, es el literal null

      • timeout
      • error
      • abort
      • parsererror
    • errorThrown

      objeto para excepciones, es opcional

      Cuando se produce un error HTTP, errorThrown recibe la parte textual del estado HTTP, como ‘Not Found‘ o ‘Internal Server Error‘, con este parámetro podemos sustituir sus opciones y configurarlo

  • global

    activa el uso de varios eventos globales de Ajax
    Su valor por defecto es true

    Use false para evitar que los eventos globales ajaxStart o ajaxStop esten activos

  • headers

    encabezados adicionales enviados junto con la petición utilizando XMLHttpRequest, pudiendo modificar el objeto modificando el valor X-Requested-With: XMLHttpRequest

    Tambien es posible cambiar el valor con el evento Ajax beforeSend (añadido en jQuery 1.5)

  • ifModified

    comprueba el valor de cabecera Last-Modified para ver si la última petición tuvo éxito

    Su valor predeterminado es false, ignora el encabezado

    Desde jQuery 1.4, también verifica el valor ‘etag‘ especificado por el servidor para capturar los datos no modificados

  • isLocal

    permite que el entorno actual sea reconocido como ‘local‘ (por ejemplo, el sistema de archivos), incluso si jQuery no lo reconoce como tal por defecto

    Los protocolos siguientes son reconocidos actualmente como locales:

    • file
    • *-extension
    • widget

    Si la configuración de isLocal necesita ser modificada, se recomienda hacerlo con el método $.ajaxSetup() (añadido en jQuery 1.5.1)

  • jsonp

    sobreescribe la función de respuesta de las peticiones JSONP

    Este valor será usado en lugar del ‘callback‘ en la cadena de consulta de la url cuando se añade ‘callback=?

    Por ejemplo {jsonp:’onJSONPLoad’} devolvería al servidor ‘onJSONPLoad=?

    A partir de jQuery 1.5, configurar jsonp a false evitar que jQuery agregue la cadena ‘?callback‘ a la URL o que intente usar ‘=?‘ al realizar la transformación

    En este caso, debe establecerse explícitamente la configuración para jsonpCallback

    Por ejemplo, { jsonp: false, jsonpCallback: ‘callbackName’ }

    Por razones de seguridad, si el receptor objetivo no es de confianza, es recomendable configurar la propiedad jsonp a false

  • jsonpCallback

    especifica el nombre de la función de retorno para una petición JSONP

    Este valor se utilizará en lugar del nombre aleatorio generado automáticamente por jQuery

    Es recomendable dejar que jQuery genere ese nombre único, ya que facilitará la gestión de las peticiones y podrá controlar mejor los callbacks y las excepciones de error

    Es posible especificar el retorno de la petición cuando esté habilitada la caché del navegador para peticiones GET

    A partir de jQuery 1.5, también puede usar una función para configurarlo, en cuyo caso el valor de jsonpCallback se establece con el valor de retorno de esa función

  • method

    método HTTP que se utilirá en la petición (por ejemplo ‘POST‘, ‘GET‘, ‘PUT‘ (añadido en jQuery 1.9.0)

  • mimeType

    tipo mime que sobreescribe el tipo mime XHR (añadido en jQuery 1.5.1)

  • password

    contraseña que será utilizada con XMLHttpRequest como respuesta a una petición de autenticación de acceso HTTP

  • processData

    por defecto, los datos pasados ​​a data (cualquier cosa que no sea una cadena) se procesará y transformarán a una cadena de consulta, que se ajustará al tipo de contenido predeterminado ‘application/x-www-form-urlencoded

    Para enviar un DOMDocument u otros datos no procesados, configurelo a false

  • scriptAttrs

    define atributos adicionales para usar en las peticiones ‘script‘ o ‘jsonp

    Donde:

    • key

      representa el nombre del atributo

    • value

      es el valor del atributo

    Al recibir este objeto, se forzará el uso de la etiqueta de script un transporte

    Por ejemplo, puede ser usado para declarar los atributos nonce, integrity o crossorigin para satisfacer los requisitos de la política de seguridad del contenido (añadido en jQuery 3.4.0)

  • scriptCharset

    sólo se utiliza con el ‘script‘ de transporte

    Define el atributo charset de la etiqueta de script utilizada en la petición

    Es usado cuando el juego de caracteres en la página local no es el mismo que el del script remoto

    Alternativamente, el atributo charset se puede definir con scriptAttrs, lo que también asegurará el uso del transporte ‘script

  • statusCode

    códigos numéricos HTTP y funciones que serán llamadas como respuesta a ese código

    Por ejemplo, cuando el estado de respuesta sea 404, mostrará un aviso al usuario:

    Si la petición es correcta, el código de estado de la función tomará los mismos parámetros que el retorno de la petición correcta; si se produce un error (incluida la redirección 3xx), tomará los mismos parámetros que el error de callback (añadido en jQuery 1.5 )

  • success

    evento Ajax llamada si la petición es correcta

    Tiene los siguientes argumentos:

    • data

      datos devueltos por el servidor, formateados según el parámetro dataType o la función de callback dataFilter, si ha sido definida

    • textStatus

      cadena de texto que describe el estado

    • jqXHR

      (en jQuery 1.4.x, XMLHttpRequest)

    A partir de jQuery 1.5, admite un array de métodos y cada uno será llamado por turno

  • timeout

    establece un tiempo de espera (en milisegundos) para la petición
    El valor 0 significa que no habrá tiempo de espera

    Esto anulará cualquier tiempo de espera global definido con $.ajaxSetup()

    El período de tiempo de espera comienza cuando se realiza la llamada a $.ajax

    Si hay otras peticiones en curso y el navegador no tiene conexiones disponibles, es posible que alguna petición agote el tiempo de espera antes de que pueda ser enviada

    A partir de jQuery 1.4.x, el objeto XMLHttpRequest tomará el estado de no válido si la petición agota el tiempo de espera

    Acceder a cualquier campo del objeto puede generar una excepción

    Solo en Firefox 3.0+, las solicitudes de script y JSONP no son canceladas mediante un tiempo de espera; el script se ejecutará incluso si es recibido después del tiempo de espera

  • traditional

    tomará el valor true si se desea utilizar el estilo tradicional de parametros serializados

  • type

    alias para method. Use type para versiones de jQuery anteriores a 1.9.0

  • url

    cadena que contiene la URL a la que se envía la petición

  • username

    nombre de usuario que será utilizado con XMLHttpRequest en respuesta a una solicitud de autenticación de acceso HTTP

  • xhr

    retorno de la petición para crear el objeto XMLHttpRequest

    Su valor predeterminado es ActiveXObject cuando este disponible (IE), XMLHttpRequest en caso contrario

    Sobreescribalo para proporcionar su propia implementación de XMLHttpRequest o alguna mejora propia

  • xhrFields

    define el objeto nativo XHR (añadido en jQuery 1.5.1 )

    Por ejemplo, se puede usar para definir withCredentials a true para las peticiones cross-domain, si fuera necesario:

    En jQuery 1.5, la propiedad withCredentials no es nativa para XHR y por lo tanto, las peticiones CORS (Control de acceso HTTP, Cross-Origin Resource Sharing
    )
    que la requieran la ignorarán

    Por esta razón, te recomiendo usar jQuery 1.5.1+ en caso de que requiera ser usada

PHP

PHP

PHP es un lenguaje de programación interpretado basado en scripts orientado a las páginas Web

No es un lenguaje de marcado como podría ser HTML,
XML o WML

Un programa PHP es ejecutado en el servidor y el resultado enviado al navegador

El resultado generalmente generará una página HTML, XML o WML

Al ser un lenguaje que se ejecuta en el servidor no es necesario que el navegador lo soporte, pero para que las páginas PHP funcionen, el servidor donde están alojadas sí debe soportarlo

Historia de PHP

Fue originalmente diseñado en lenguaje Perl, apoyándose en un conjunto de CGI binarios (un programa que se ejecuta en servidor web) escritos en el lenguaje C por el programador danés-canadiense Rasmus Lerdorf en 1994 para mostrar su currículum vítae y guardar ciertos datos, como la cantidad de tráfico que su página web recibía

El 8 de junio de 1995 fue publicado bajo el nombre de Personal Home Page Tools después de que Lerdorf lo combinara con su propio sistema para procesar formularios FI (Form Interpreter) dando como resultado el PHP/FI

El sistema Personal Home Page Tools adquirió relativo éxito gracias a que otras personas pidieron a Rasmus que les permitiese utilizar sus programas en sus propias páginas

Dos programadores israelíes del Technion, Zeev Suraski y Andi Gutmans, reescribieron el analizador sintáctico (parser) en 1997 y crearon la base del PHP 3, y cambiaron su nombre por el de PHP (Hypertext Preprocessor)

PHP3 se publicó oficialmente en junio de 1998

En 1999, Suraski y Gutmans reescribieron el código de PHP, y crearon lo que hoy se conoce como motor Zend. Fundando la empresa Zend Technologies en Ramat Gan, Israel

En mayo del 2000, PHP 4 se lanzó utilizando el nuevo motor Zend 1.0.

En su versión 4.1, lanzada el 10 de diciembre de 2001, se introdujeron las variables superglobales ($_GET, $_POST, $_SESSION, etc)

En su versión 4.2, lanzada el 22 de abril de 2002, se deshabilitaron los register_globals por defecto

Los datos recibidos por la red ya no eran insertados en el espacio de nombres global, cerrando posibles agujeros de seguridad en las aplicaciones

En su versión 4.3, lanzada el 27 de diciembre de 2002, se introdujerón el CLI (una interfaz de línea de comandos), y el CGI (una interfaz común para la entrada de datos)

En su versión 4.4, lanzada el 11 de julio de 2005, se añadieron páginas de documentación man para phpize y php-config

El 13 de julio del 2007 se anunció la suspensión del soporte y desarrollo de la versión 4 de PHP

Sin embargo se liberó la nueva versión 4.4.8 con mejoras de seguridad, que se publicó el 13 de enero del 2008 y posteriormente la versión 4.4.9, que fue publicada el 7 de agosto del 2008

Y se le dio soporte a fallos críticos hasta el 9 de agosto del 2008

El 13 de julio del 2004, se lanzó PHP 5, utilizando el mejorado motor Zend Engine 2.0 (o Zend Engine 2)

En su versión 5.1, lanzada el 24 de noviembre de 2005, se añadieron mejoras de rendimiento con la introducción de las variables de compilador para su nuevo motor de PHP

En su versión 5.2, lanzada el 2 de noviembre de 2006, se añadió soporte nativo para JSON (tipo de objetos javascript)

En su versión 5.3, lanzada el 30 de junio de 2009, se añadió:

  • soporte para espacios de nombres
  • enlace estático en tiempo de ejecución
  • la etiqueta de salto (GOTO)
  • las clausuras nativas
  • soporte nativo para los archivos PHP (phar)
  • un recolector de basura para referencias circulares
  • soporte mejorado para Windows, sqlite3 y mysqlnd como reemplazo a libmysql como la biblioteca para las extensiones que funcionaba con la base de datos MySQL
  • la inclusión de fileinfo para reemplazar la función mime_magic para mejorar el soporte para las extensiones internacionales MIME y eliminar la obsoleta etiqueta ereg

En su versión 5.4, lanzada el 1 de marzo de 2012, se añadió soporte para Trait y una sintaxis abreviada de trabajar con arrays

Se eliminaron los siguientes elementos por ser considerados obsoletos: register_globals, safe_mode, allow_call_time_pass_reference, session_register(), session_unregister() y session_is_registered()

En su versión 5.5, lanzada el 20 de junio de 2013, se añadieron los nuevos generadores para bucles y la función empty() soporta expresiones

También se abandonó el soporte para Windows XP y Windows Server 2003

En su versión 5.6, lanzada el 20 de agosto de 2014, se añadieron las constantes con expresiones escalares, las listas de argumentos de longitud variable y el exponencial mediante el operador **

El desarrollo de PHP 6 fue retrasado porque los desarrolladores decidieron que el enfoque que se seguía para tratar las cadenas Unicode no era el correcto, y empezaron a tratar formas alternativas antes de lanzar esta versión

Todas las mejoras que estaban planeadas para PHP 6, en cambio, fueron añadidas en PHP 5.3.0 (el soporte para espacios de nombre, el enlace estático en tiempo de ejecución, las funciones lambda, las clausuras, la etiqueta GOTO) y en la 5.4.0 (traits, revinculación de clausuras)

Al final se abandonó definitivamente la versión 6 en favor de la 7

La versión 7.0, fue lanzada el 03 de noviembre de 2015, se añadieron mejoras de rendimiento y la declaración de los tipos de retorno para las funciones

En su versión 7.1, lanzada el 01 de diciembre de 2016, se añadieron el tipo de retorno null,​ el modificador de visibilidad de clase const, el tipo nullable, los iteneradores de tipo seudo, la captura de múltiples tipos de excepciones

En su versión 7.2, lanzada el 30 de noviembre de 2017, se añadió el nuevo tipo de retorno object y la integración de Libsodium como una extensión del núcleo

En su versión 7.3, lanzada el 6 de diciembre de 2018, se añadió una sintaxis flexible para Nowdoc y Heredoc, soporte para referencias y deconstrucción de arrays con list(), soporte para PCRE2, función hrtime()

La versión 7.4 fue lanzada el 28 de octubre de 2019 y llegó al final de su vida útil el 28 de noviembre de 2022

En su versión 8.0, lanzada el 26 de octubre de 2020, se añadieron nuevas características y se incremento su rendimiento

En su versión 8.1, lanzada el 25 de octubre de 2021, se añadieron las propiedades readonly, Enums, Fiber y nuevas sintaxis

En su versión 8.2, lanzada el 08 de diciembre de 2022, se añadió el atributo AllowDynamicProperties y se desaprobó la creación de propiedades dinámicas

Programación en PHP

Para poder utilizar PHP previamente deberemos instalarlo en nuestro servidor

Si además queremos utilizar una base de datos podemos usar conjuntamente con PHP el gestor de base de datos liviano Mysql

O si queremos una versión que lleve todo incluido, además de servidores adicionales como un servidor de correo, un servidor de ficheros o el interprete Tomcat para Java, podemos usar la distribución gratuita de Apache Friends, XAMPP

Una vez instalado nuestro servidor y el modulo de PHP está activo y configurado, podremos iniciar nuestros programas escritos en PHP en nuestras páginas Web

En el ejemplo se ha incrustado el código PHP en el propio HTML, pero esta no es la única forma en la que podremos incluirlo

Podemos ver que este sencillo script CGI no es igual a otro escrito en otro los lenguajes Perl o C

En vez de escribir un programa completo con todos los comandos necesarios para generar la salida HTML, escribimos directamente el código HTML con el código PHP embebido (incrustado) en el mismo HTML, lo que producirá la salida (en el ejemplo, producirá el texto que queremos que se muestre la etiqueta body)

Para incluir el código PHP deberemos utilizar las etiquetas especiales de comienzo <?php y final ?> que nos permitirán entrar y salir del interprete zend de PHP

Podemos usar 4 formas para salir de HTML y entrar en al interprete PHP:

  • usando las etiquetas de comienzo <?php y final ?>

  • usando la versión abreviada de las etiquetas de comienzo <? y final ?>

    A partir PHP 7 esta forma está obsoleta

  • usando la versión ASP de las etiquetas de comienzo <% y final %>

    A partir PHP 7 esta forma está obsoleta

  • adjuntando al documento HTML los comandos como un fichero de script

También podemos referenciar directamente un fichero con extensión .php el cuál podremos cargar dentro cualquier lugar del documento HTML mediante la función include

Sin embargo, abusar de esta práctica puede llegar a obligarnos a copiar una y otra vez la función include en todos nuestros ficheros HTML

Por esta razón se recomienta utilizar un archivo index.php que genere el HTML que recibirá el navegador y en el que se cargarán sólo los includes que la página necesite

Separación de las instrucciones

Al igual que en los lenguajes C o Pascal, las sentencias terminan usando el punto y coma

La etiqueta de cierre %> también implica el fin de la sentencia en el caso de que no haya más código PHP, por lo que en el ejemplo son equivalentes

Comentarios en PHP

PHP soporta comentarios tipo C, C++ o de Shell de Unix

Operadores en PHP

Operadores en PHP

PHP posee una amplia variedad de operadores

Estos operadores los podemos distinguir en dos grupos: binarios, que actúan sobre dos operandos y unarios, que sólo requieren un operando

Así, su sintaxis general es:

operand1 operator_Binary operand2

operand1 operator_unary

operator_unary operand1

Operadores aritméticos

PHP suministra las operaciones básicas con los únicos añadidos de los operadores que devuelven el resto de la división entre el operador izquierdo y el derecho; y la exponenciación, que permite elevar el operador izquierdo a la potencia del operador derecho

Operadores aritméticos
+ Suma
Resta
* Multiplicación
/ División
% Resto
** Exponenciación

Nota En otros lenguajes el operador + aplicado a strings, concatena ambas strings en una sola

Sin embargo, en PHP para realizar esta operación se utiliza el operador .

Operadores de incremento (++) y decremento (- -)

Estos operadores son unarios y realizan el autoincremento y el autodecremento a la variable que se les aplica

Además de modificar la variable, devuelven el valor de la misma

El operador de incremento o decremento puede ir delante p detrás de la variable teniendo diferente significado

Si el operador es ++ se sitúa después de la variable se denomina post-incremento, haciendo que primero tome el valor y después se incrementa en una unidad la variable

Si el operador ++ se sitúa antes de la variable se denomina pre-incremento y hace que primero se incremente en una unidad la variable y luego se tome el valor

Si el operador es – – se sitúa después de la variable se denomina post-decremento, haciendo que primero tome el valor y después se decrementa en una unidad la variable

Si el operador – – se sitúa antes de la variable se denomina pre-decremento y hace que primero se decremente en una unidad la variable y luego se tome el valor

Operadores relacionales

Se emplean típicamente en las expresiones condicionales

Los operadores relacionales devuelven valores booleanos

Los operandos pueden ser tanto numéricos como strings

Operadores relacionales
>

Mayor que

<

Menor que

> =

Mayor o igual que

< =

Menor o igual que

! =

Distinto que

< >

Es equivalente a ! =

! = =

Distinto que y del mismo tipo

= =

Igual que

= = = Igual que y del mismo tipo

< = >

Comparación de orden (Añadido en PHP 7)

  • 0 cuando son iguales
  • -1 cuando el primer operador es menor que el segundo
  • 1 cuando el primer operador es mayor que el segundo
? ?

Devuelve su primer operando si existe y no es NULL

De lo contrario devuelve su segundo operando (Añadido en PHP 7)

Operadores lógicos

Los operandos lógicos está relacionados con los relacionales ya que normalmente los operandos que usan son resultado de expresiones relacionales

Los valores resultantes son booleanos

Operadores lógicos
AND Verdadero si ambos son verdaderos
& & Es equivalente a AND
OR Verdadero si uno de ellos es verdadero
| | Es equivalente a OR
XOR Verdadero si uno de ellos es verdadero, pero no ambos
! Si era verdadero pasa a falso y viceversa

Operadores bit a bit

La forma de trabajar de estos operadores es convertir a binario los operandos y luego operar con ellos bit a bit

Operadores bit a bit
& AND
| OR
^ XOR
~ NOT
<< Propagación a la izquierda
Desplaza el valor hacia la izquierda introduciendo ceros, si se sale de rango se pierden valores
>> Propagación a la derecha
Desplaza el valor hacia la derecha introduciendo por la izquierda el bit de signo y eliminando los valores que se salgan por la derecha

Nota Los operadores de propagación toman dos operandos: el primero es la variable a propagar y el segundo es el número de posiciones a propagar

Operadores de asignación

La asignación también es un operador que devuelve la variable modificada

El operador de asignación en PHP es =

Los operadores de asignación que se muestran a continuación no son sino abreviaturas que hacen más cómoda y simples las expresiones, aunque a veces sean más ilegibles

Operadores de asignación
Operador Expresión Equivalencia
=

$A = $B = $C;

$D = ‘Texto’;

$A = $C;

$B = $C;

$D = ‘Texto’;

+ = $A + = 4; $A = $A + 4;
– = $A – = 3 * $B; $A = $A – (3 * $B);
* = $A * = 2; $A = $A * 2;
/ = $A / = 35 + $B; $A = $A / (35 + $B);
% = $A % = $B; $A = $A % $B;
. = $D . = ‘ de prueba’; $D = $D . ‘ de prueba’;
>> = $A >> = 1; $A = $A >> 1;
<< = $A << = $B; $A = $A << $B;
& = $A & = ($C + = 3); $C = $C +3;
$A = $A & $C;
^ = $A ^ = 2; $A = $A ^ 2;
| = $A | = $C; $A = $A | $C;

Otros operadores

Operador de selección

Este operador se utiliza para ejecutar una operación u otra dependiendo de la condición

El formato es el siguiente:

Condición ? Exp1 : Exp2

Si se cumple la condición se evalúa y se devuelve la expresión Exp1 si no la Exp2

Podemos poner un sólo valor

Ejemplo:

Operador new

Este operador se va a utilizar para crear una instancia de un tipo de objetos previamente definido

La sintaxis a seguir es la siguiente:

Estos parámetros son los que se le pasan al constructor de dicho objeto en cuestión

Operador clone

Este operador se va a utilizar para crear una copia de un objeto previamente definido (que invoca, si fuera posible, al método __clone() del objeto)

La sintaxis a seguir es la siguiente:

Cuando se clona un objeto, PHP llevará a cabo una copia superficial de las propiedades del objeto

Las propiedades que sean referencias a otras variables, mantendrán las referencias

Una vez que la clonación ha finalizado, se llamará al método __clone() del nuevo objeto (si el método __clone() estuviera definido), para permitirle realizar los cambios necesarios sobre sus propiedades

Operador gettype

Este operador aplicado a una variable devuelve el tipo de objeto al que pertenece el dato contenido por dicha variable

Su sintaxis es:

Los valores que puede devolver son:

  • boolean

  • integer

  • double

    Por razones históricas se devuelve double también cuando sea de tipo float

  • string

  • array

  • object

  • resource

  • NULL

  • unknown type

Preferencia

La preferencia de los operadores va a determinar el orden en que se ejecuten en una expresión determinada

Usando paréntesis controlaremos que las operaciones se lleven a cabo según nosotros queramos

En PHP la preferencia de los operadores de mayor a menor es la siguiente:

Preferencia
Otros operadores clone new
Array [ ]
Exponenciación **
(in / de) crease /tipos ++ – – ^ (int) (float) (string) (array) (object) (bool) @
Otros operadores gettype
Negación !
Mul / Div / Resto * / %
Suma / Resta +
Propagación << >>
Relacionales < < = > > =
Igualdad = = != = = = ! = = < > < = >
AND bit a bit &
XOR bit a bit ^
OR bit a bit |
AND lógica &&
OR lógica | |
Igualdad ? ?
Otros operadores ?:
Asignación = + = – = * = * * = / = . = % = & = | = ^ = >> = << =
AND lógica AND
XOR lógica XOR
OR lógica OR

Tipos de datos en PHP

Tipos de datos en PHP

Los tipos en PHP son una representación de los datos, ya que no requiere que las variables declaren su tipo, porque todos los tipos se convierten de forma automática

Tipo booleano

El tipo booleano simplemente distingue entre dos estados, un estado de éxito o de activado, valor verdadero, true, y un estado de fracaso o de desactivado, valor falso, false

Ambos estados no son susceptibles a mayúsculas y minúsculas

Normalmente, el resultado de operadores que devuelven un valor de tipo booleano son pasados a una estructura de control

Tipos numéricos

Los tipos numéricos los podemos dividir en reales y enteros

Tipo numérico entero

  • Integer

    enteros en base 10

    Tanto positivos como negativos

  • Hexadecimal

    enteros en base 16

    Se coloca antes del número en base 16 0x ó 0X

  • Octal

    enteros en base 8

    Colocamos un cero antes de dicho número en octal

  • Binario

    enteros en base 2

    Se coloca antes del número en base 2 0b ó 0B

Formalmente, la estructura de los literales de tipo entero es:

decimal : [1-9][0-9]* | 0

hexadecimal : 0[xX][0-9a-fA-F]+

octal : 0[0-7]+

binario : 0b[01]+

entero : [+-]?decimal | [+-]?hexadecimal | [+-]?octal | [+-]?binario

Tipo numérico real

Los reales se componen de una parte entera y otra fraccionaria separada por un punto de la anterior

La parte fraccionaria puede estar compuesta por un indicador de exponente E o e seguido de un número entero que indica el valor del exponente

Formalmente, la estructura de los literales de tipo real es:

LNUM : [0-9]+
DNUM : ([0-9]*[\.]{LNUM}) | ({LNUM}[\.][0-9]*)
EXPONENT_DNUM : [+-]?(({LNUM} | {DNUM}) [eE][+-]? {LNUM})

  • Float

    es un valor numérico de coma flotante

    Tanto positivos como negativos

    Su tamaño depende de la plataforma, aunque su valor puede ser como máximo 1.8e308 aproximadamente, con una precisión cercana a los 14 dígitos decimales (formato de 64 bit del IEEE)

    Adicionalmente, los números racionales cuya representación en base 10 es igual a la empleada como número en coma flotante, como 0.1 o 0.7, no tienen una representación exacta como números de punto flotante en base 2, que es la base empleada internamente, sin importar el tamaño de la mantisa

    Por lo tanto, no se pueden convertir a binario sin una pequeña pérdida de precisión

    Pudiendo dar resultado a errores de precisión como por ejemplo, floor( (0.1 + 0.7) * 10); normalmente devolvería 8, sin embargo, nos devolverá 7, ya que en su representación interna será 7.9999999999999991118…

    Por tanto, no se recomienda confiar en los resultados con números en coma flotante y no utilizar la comparación de igualdad entre números de punto flotante directamente

    En caso de necesitar una mayor precisión, utiliza las funciones matemáticas de precisión arbitraria y las funciones de gmp

  • Double

    es equivalente al Float y no aporta diferencias sustanciales

    En otros lenguajes tiene doble precisión, pero en PHP se ha mantenido por motivos históricos y es aconsejabla usar mejor las funciones que trabajan con Float

  • NaN

    Algunas operaciones numéricas pueden resultar en un valor representado por la constante NAN

    Este resultado representa un valor no definido o no representable mediante cálculos de punto flotante

    Cualquier comparación, ya sea estricta o no, de este valor con cualquier otro valor, incluido él mismo, a excepción de TRUE, tendrá como resultado FALSE

    Ya que representa cualquier número de diferentes valores, no debería compararse con otros valores, incluido él mismo; en su lugar se debe comprobar usando la función is_nan()

Tipo string

Un string es una cadena de caracteres delimitadas por comillas

Donde cada carácter es un byte

Esto significa que PHP solo admite un conjunto de 256 caracteres, y de ahí que no ofrezca soporte nativo para Unicode

Un string sólo puede contener hasta 2 GB de tamaño (2147483647 bytes como máximo)

Un literal de tipo string se puede especificar de cuatro formas diferentes:

  • entrecomillado simple

    se especifican entre los carácteres de apertura y de cierre

    Para especificar una comilla simple literal, se ha de escapar con una barra invertida (\). Para especificar una barra invertida literal, se duplica (\\)

    Todas las demás instancias de barras invertidas serán tratadas como una barra invertida literal: esto significa que otras secuencias de escape que podrían utilizarse, tales como \r o \n, serán mostradas literalmente tal y como se especifican, en lugar de tener cualquier otro significado especial

    Hay que tener en cuenta que las variables y las sentencias de escape para caracteres especiales no se expandirán cuando estén incluidas dentro de un string entre comillas simples

  • entrecomillado doble

    se especifican entre los carácteres " de apertura y " de cierre

    La característica más importante del entrecomillado doble de un string es el hecho de que se expanden los nombres de las variables

    PHP interpretará las siguientes secuencias de escape como caracteres especiales:

    Código Descripción
    \n avance de línea (LF o 0x0A (10) en ASCII)
    \r retorno de carro (CR o 0x0D (13) en ASCII)
    \t tabulador horizontal (HT o 0x09 (9) en ASCII)
    \v tabulador vertical (VT o 0x0B (11) en ASCII) (desde PHP 5.2.5)
    \e escape (ESC o 0x1B (27) en ASCII) (desde PHP 5.4.4)
    \f avance de página (FF o 0x0C (12) en ASCII) (desde PHP 5.2.5)
    \\ barra invertida
    \$ signo de dólar
    \" comillas dobles
    \[0-7]{1,3} la secuencia de caracteres que coincida con la expresión regular es un carácter en notación octal, que silenciosamente desborda para encajar en un byte (p.ej. "\400" === "\000")
    \x[0-9A-Fa-f]{1,2} la secuencia de caracteres que coincida con la expresión regular es un carácter en notación hexadecimal
    \u{[0-9A-Fa-f]+} la secuencia de caracteres que coincida con la expresión regular es un punto de código de Unicode, la cual será imprimida al string como dicha representación UTF-8 del punto de código (añadido en PHP 7)

    Al igual que en el entrecomillado simple de un string, escapar cualquier otro carácter puede dar lugar a que se muestre también la barra invertida

    Antes de PHP 5.1.1, no se mostraba la barra invertida de \{$var}

  • sintaxis heredoc

    se especifican mediante el los carácteres <<< seguidos del operador EOT y finaliza con el operador EOT seguido del carácter ; de cierre

    El identificador de cierre debe empezar en la primera columna de la nueva línea

    Asimismo, el identificador debe seguir las mismas reglas de nomenclatura que las etiquetas en PHP: debe contener solo caracteres alfanuméricos y guiones bajos, y debe empezar con un carácter alfabético o un guión bajo

    Es muy importante señalar que la línea con el identificador de cierre no debe contener ningún otro carácter, excepto el punto y coma

    El identificador no debe estar sangrado, y que no debe existir ningún espacio ni tabulación antes o después del punto y coma

    El primer carácter antes del identificador de cierre debe ser un salto de línea definido por el sistema operativo local

    \n en los sistemas UNIX, incluyendo Mac OS X

    Además, al delimitador de cierre le ha de seguir también, el de nueva línea

    Si se rompe esta regla y el identificador de cierre no está limpio, no será considerado como un identificador de cierre, por lo que PHP continuará buscando uno

    Si no se encuentra ningún identificador de cierre apropiado antes del final del fichero, se producirá un error de análisis en la última línea

    No se puede emplear Heredoc para inicializar las propiedades de una clase

    Desde PHP 5.3, esta limitación es válida solamente para un heredoc que contenga variables, ya que es posible inicializar variables estáticas y propiedades / constantes de clase

    En esa versión también se introdujo la posibilidad de entrecomillar el identificador de apertura en Heredoc

  • sintaxis nowdoc (desde PHP 5.3)

    es a los string con comillas simples lo mismo que Heredoc lo es a los string con comillas dobles

    Un nowdoc se especifica de forma análoga a un heredoc, pero no se realiza ningún análisis dentro del nowdoc

    La construcción es ideal para embeber código PHP o grandes fragmentos de texto sin necesidad de escaparlos

    Comparte algunas características comunes con la construcción SGML, donde se declara un bloque de texto que no se analiza

    Un nowdoc se identifica con la misma secuencia empleada para heredoc, <<<, pero el identificador que le sigue está delimitado con comillas simples

    Todas las reglas para los identificadores de heredoc también son aplicables a los identificadores de nowdoc, especialmente aquellas que se refieren al empleo del identificador de cierre

Análisis de variables

Cuando un string es especificado mediante comillas dobles o mediante heredoc, las variables que haya dentro de dicho string se analizarán

Existen dos tipos de sintaxis:

  • simple

    es la más empleada y práctica

    Proporciona una forma de embeber una variable, un valor de un array o una propiedad de un object dentro de un string con el mínimo esfuerzo

  • compleja

    puede ser reconocida por las llaves que delimitan la expresión

Sintaxis simple

Si se encuentra un signo de dólar ($), el analizador tomará el mayor número de símbolos para formar un nombre de variable válido

Delimitar el nombre de la variable con llaves permite especificar explícitamente el final del nombre

De forma parecida, se puede analizar el índice de un array o la propiedad de un object

Con los índices de los arrays, el corchete de cierre (]) marca el final del índice

La misma regla se puede aplicar a las propiedades de los objetos y a las variables simples

Sintaxis compleja

Permite el empleo de expresiones complejas

Cualquier variable escalar, elemento de array o propiedad de objeto con una representación de tipo string puede ser incluido a través de esta sintaxis

Simplemente se escribe la expresión del mismo modo en que aparecería por fuera del string, delimitándola con { y }

Dado que { no puede ser escapado, esta sintaxis será reconocida únicamente cuando el $ siga inmediatamente al {

Utilice {\$ para obtener un {$ literal

Algunos ejemplos para que quede más claro:

Con esta sintaxis, también es posible acceder a las propiedades de una clase empleando variables dentro de un string

Las funciones, llamadas a métodos, variables de clase estáticas y constantes de clases dentro de {$} funcionan desde PHP 5

Sin embargo, el valor accedido puede ser interpretado como el nombre de la variable en el ámbito en el que está definido el string

El empleo de llaves simples ({}) no servirá para acceder al valor devuelto por las funciones o métodos, o los valores de las constantes de clase o variables de clase estáticas

Arrays

Un array en PHP es en realidad un mapa ordenado

Un mapa es un tipo de datos que asocia valores con claves

Este tipo se optimiza para varios usos diferentes; se puede emplear como un array, lista (vector), tabla asociativa (tabla hash – una implementación de un mapa), diccionario, colección, pila, cola, etc

Ya que los valores de un array pueden ser otros arrays, también son posibles árboles y arrays multidimensionales

Para crear un array se utiliza la siguiente sintaxis:

Donde tenemos la función array() que sirve de construcctor y toma como parámetros parejas clave/valor separadas por comas y unidas con los simbolos =>

La coma después del último elemento del array es opcional, pudiéndose omitirse

A partir de PHP 5.4 también se puede usar la sintaxis de array corta, la cual reemplaza la función array() con []

La clave puede ser un integer o un string

Además, las claves deberán cumplir:

  • Un strings que contenga un integer válido será amoldado al tipo integer

    La clave "8" en realidad será almacenada como 8

    "08" no será convertido, ya que no es un número integer decimal válido

  • Un float será forzado a integer, lo que significa que la parte decimal será eliminada

    La clave 8.7 en realidad será almacenada como 8

  • Un booleano será forzado a integer también, es decir, la clave true en realidad será almacenada como 1 y la clave false como 0
  • Un null será forzado a string vacío, es decir, la clave null en realidad será almacenada como ""
  • Los arrays y los objects no pueden utilizarse como claves

    Si lo hacemos, daremos lugar a una advertencia: Illegal offset type

  • Si varios elementos en la declaración del array usan la misma clave, sólo se utilizará la última, siendo los demás sobrescritos

La clave es opcional y si no se especifica, PHP usará el incremento de la clave de tipo integer mayor utilizada anteriormente

Es posible especificar la clave sólo para algunos elementos y excluir a los demás:

Los elementos de array se pueden acceder utilizando la sintaxis array[key]

Nota Tanto los corchetes como las llaves pueden ser utilizados de forma intercambiable para acceder a los elementos de un array ($array[42] y $array{42} tendrán el mismo resultado en el ejemplo anterior)

A partir de PHP 5.4 es posible hacer referencia al array del resultado de una llamada a una función o método directamente

En versiones anteriores sólo era posible utilizando una variable temporal

Desde PHP 5.5 es posible hacer referencia directa un elemento de un array literal

Nota Intentar acceder a una clave de un array que no se ha definido es lo mismo que el acceder a cualquier otra variable no definida: se emitirá un mensaje de error de nivel E_NOTICE, y el resultado será NULL

Un array existente puede ser modificado estableciendo explícitamente valores en él

Esto se realiza asignando valores al array, especificando la clave entre corchetes

Esta también se puede omitir, resultando en un par de corchetes vacíos ([])

Si $arr aún no existe, se creará, siendo también esta forma una alternativa de crear un array

Sin embargo, se desaconsejada esta práctica porque que si $arr ya contiene algún valor (un string de una variable de petición), este estará en su lugar y [] puede significar realmente el operador de acceso a cadenas

Siempre es mejor inicializar variables mediante una asignación directa

Para cambiar un valor determinado se debe asignar un nuevo valor a ese elemento empleando su clave

Para quitar una pareja clave/valor, se debe llamar a la función unset()

Iterables

Un Iterable es un seudotipo introducido en PHP 7.1

Acepta cualquier array u objeto que implemente la interfaz Traversable

Estos dos tipos se recorren con foreach y se pueden emplear con yield from dentro de un generador

Iterable se puede usar para indicar que una función requiere un conjunto de valores, pero que no importa la forma del conjunto ya que se utilizará con foreach

Si un valor no es un array o una instancia de Traversable, se lanzará un TypeError

Los parámetros declarados como iterable pueden usar NULL o un array como valor predeterminado

Objetos

Los objetos se componen de un conjunto de valores, propiedades y un conjunto de métodos aplicados a esos valores

Son estos métodos los que nos permiten modificar el estado de dicho objeto, es decir, el valor de sus propiedades

Vamos a crear un objeto Universitario de ejemplo en el que tendremos las propiedades: Nombre, Apellido, Edad y Dni

La instancia del objeto la crearemos mediante el operador new de la siguiente forma:

Es posible inicializar todas las variables para que tengan el tipo que queremos, para ello usaremos el constructor de la clase pasándole los argumentos que necesitemos

A partir de PHP 7 podemos especificar además el tipo del argumento

Mediante la palabra reservada $this podremos referenciar al objeto actual

Las propiedades de un objeto pueden describirse mediante otros objetos

La definición de métodos asociados a un objeto puede precisarse en la definición del objeto

Por ejemplo, para el objeto universitario definimos una función que muestre el nombre, edad, apellidos, dni y notas medias del alumno

Para acceder a las propiedades o a los métodos usaremos el operador ->

Recursos

Un valor tipo resource es una variable especial, que contiene una referencia a un recurso externo

Los recursos son creados y usados por funciones especiales

Puede obtenerse el tipo de recurso mediante la función get_resource_type()

Gracias al sistema de conteo de referencias introducido con el Motor Zend de PHP 4, un recurso que ya no es referenciado es detectado automáticamente y es liberado por el recolector de basura

Por esta razón, rara vez se necesita liberar la memoria manualmente

Nota Los enlaces persistentes con bases de datos son una excepción a esta regla

No son destruidos por el recolector de basura, al ser conexiones persistentes

Valor nulo

En PHP a las variables se les puede asignar un valor que indica el valor vacío, este valor es el valor NULL

Una variable es considerada NULL si:

  • se le ha asignado la constante NULL
  • no se le ha asignado un valor todavía
  • se ha destruido con la función unset()

La constante NULL es insensible a mayúsculas o minúsculas

La conversión de tipos de datos

Antes que nada, recordar que PHP no necesita declaración de tipos

El contenido de la variable se convertirá automáticamente en el transcurso del programa según su uso

El esquema de conversión del tipo se basa en el principio siguiente: el tipo asociado corresponde al del operando de la izquierda

Esto se debe a que la evaluación se realiza de izquierda a derecha

La primera expresión convertirá la variable $un_numero en una cadena de caracteres porque el operando de la izquierda $una_string es una cadena de caracteres

Esta expresión concatena las dos cadenas de caracteres y el resultado de x es: "742"

Por el contrario, la segunda expresión convierte la cadena $una_string en un valor numérico porque el operando de la izquierda $un_numero, es un número

Esta segunda expresión suma los dos números y el resultado de y es: 49

La conversión de tipos no puede hacerse en todos los casos posibles: ciertas cadenas de caracteres no pueden convertirse en número

Tales conversiones generan un error

El comportamiento de la conversión automática en array está actualmente sin definir

Debido a que PHP soporta el indexado de string mediante compensaciones mediante la misma sintaxis empleada en el indexado de arrays, los siguientes ejemplos son válidos para todas las versiones de PHP:

Forzado de tipos

El forzado de tipos (casting) en PHP funciona de la misma manera que en C, donde el nombre del tipo deseado se escribe entre paréntesis antes de la variable que se quiera forzar

Tipo Forzado
(int), (integer) integer
(bool), (boolean) boolean
(float), (double), (real) float
(string) string
(array) array
(object) object
(unset) NULL (añadido en PHP 5)
(binary) y prefijo b string binario (añadido en PHP 5.2.1)

Se permiten las tabulaciones y espacios dentro de los paréntesis, por lo que los siguientes ejemplos son funcionalmente equivalentes:

Ejemplo de forzado literal de strings y variables a strings binarios

Las comillas dobles permiten evitar forzar una variable a string, ya que el resultado es equivalente

Conversión a booleano

Para convertir explícitamente un valor al tipo boolean, use el forzado de tipo (bool) o (boolean)

Sin embargo, en la mayoría de casos es innecesario, ya que un valor será convertido automáticamente si un operador, función o estructura de control requiere un argumento de tipo boolean

Un valor también puede ser convertido al tipo boolean mediante la función boolval()

Cuando se realizan conversiones a boolean, los siguientes valores se consideran FALSE:

  • el boolean FALSE
  • el integer 0 (cero)
  • el float 0.0 (cero)
  • el valor string vacío, y el string "0"
  • un array con cero elementos
  • un object con cero variables miembro (sólo en PHP 4)
  • el tipo especial NULL (incluidas variables no establecidas)
  • objetos SimpleXML creados desde etiquetas vacías

Cualquier otro valor se considera como TRUE (incluso una variable resource)

Nota: -1 se considera TRUE, como cualquier otro número distinto de cero (ya sea negativo o positivo)

Conversión a números enteros

Para convertir explícitamente un valor al tipo integer, use el forzado de tipo (int) o (integer)

Sin embargo, en la mayoría de casos es innecesario, ya que un valor será convertido automáticamente si un operador, función o estructura de control requiere un argumento de tipo integer

Un valor también puede ser convertido al tipo integer mediante la función intval()

Si un resource es convertido a integer, el resultado será el número de recurso único asignado al resource por PHP durante la ejecución

Desde booleanos

FALSE producirá 0 (cero), y TRUE producirá 1 (uno)

Desde números de punto flotante

Cuando se convierte un float a un integer, el número será redondeado hacia cero

Si el valor de tipo float esta por debajo de los límites de un integer (normalmente +/- 2.15e+9 = 2^31 en plataformas de 32 bits y +/- 9.22e+18 = 2^63 en plataformas de 64 bits distintas de Windows), el resultado es indefinido, debido a que float no tiene la precisión suficiente para ofrecer el resultado como un integer exacto

No se mostrará ninguna advertencia, ni siquiera un aviso, cuando esto ocurra

Nota A partir de PHP 7, en lugar de ser indefinidos y dependientes de la plataforma, NaN e Infinity siempre serán cero al forzar el tipo a integer

Nota Nunca se debe convertir una fracción desconocida a un integer, ya que a veces puede conducir a resultados inesperados

Desde cadenas de caracteres

Si el string no contiene ninguno de los caracteres ‘.’, ‘e’, o ‘E’, y el valor numérico está entre los límites del tipo integer (tal como está definido por PHP_INT_MAX), el string será evaluado como un integer

En todos los demás casos será evaluado como un float

El valor es dado por la parte inicial del string

Si el string empieza con un dato numérico válido, éste será el valor empleado

De lo contrario, el valor será 0 (cero)

Un dato numérico válido es un signo opcional, seguido de uno o más dígitos

No espere obtener el código de un carácter convirtiéndolo a integer, como ocurre en C

Emplee las funciones ord() y chr() para convertir los carácteres a su código ASCII

Desde otros tipos

El comportamiento de la conversión de integer a otros tipos es indefinido

No confíe en ningún comportamiento observado, ya que puede cambiar sin previo aviso

Conversión a número de punto flotante

Para convertir explícitamente un valor al tipo float, use el forzado de tipo (float) o (double) o(real)

Sin embargo, en la mayoría de casos es innecesario, ya que un valor será convertido automáticamente si un operador, función o estructura de control requiere un argumento de tipo float

Un valor también puede ser convertido al tipo float mediante la función floatval()

Desde cadenas de caracteres

Si el string no contiene ninguno de los caracteres ‘.’, ‘e’, o ‘E’, y el valor numérico está entre los límites del tipo integer (tal como está definido por PHP_INT_MAX), el string será evaluado como un integer

En todos los demás casos será evaluado como un float

El valor es dado por la parte inicial del string

Si el string empieza con un dato numérico válido, éste será el valor empleado

De lo contrario, el valor será 0 (cero)

Un dato numérico válido es un signo opcional, seguido de uno o más dígitos (opcionalmente puede contener un punto decimal), seguido de un exponente opcional

El exponente es una ‘e’ o ‘E’ seguido de uno o más dígitos

Desde otros tipos

La conversión es la misma que si el valor hubiese sido convertido primero a integer y luego a float

A partir de PHP 5, se genera un aviso si se intenta convertir un object a float

Conversión a cadena

Para convertir explícitamente un valor al tipo string, use el forzado de tipo (string)

Sin embargo, en la mayoría de casos es innecesario, ya que un valor será convertido automáticamente si un operador, función o estructura de control requiere un argumento de tipo string

Un valor también puede ser convertido al tipo string mediante la función strval()

También hay una conversión automática cuando se utilizan las funciones de visualización echo o print

Desde booleanos

El valor TRUE del tipo boolean es convertido al string "1"
El valor FALSE del tipo boolean es convertido al string "" (el string vacío)

Esto permite la conversión en ambos sentidos entre los valores de los tipos boolean y string

Desde números

Un integer o float es convertido a un string que representa textualmente el número (incluyendo la parte exponencial para los float)

Los números de punto flotante pueden ser convertidos mediante la notación exponencial (por ejemplo 4.1E+6)

Nota El carácter para el punto decimal se define en la variable locale del script (categoría LC_NUMERIC). Consulte la función setlocale()

Desde arrays

Los arrays siempre son convertidos al string "Array"

Por esta razón, echo y print no pueden por sí mismos mostrar el contenido de un array

Para ver un único elemento individualmente, utilice una construcción como echo $arr[‘foo’]

Puede utilizar la función print_r para realizar la conversión y visualizar el contenido del array completo

Desde object

Los object desde PHP 4 siempre son convertidos al string "Object"

Para obtener el nombre de la clase de un objeto, emplee la función get_class()

A partir de PHP 5, se puede emplear el método __toString cuando sea relevante

Puede utilizar las funciones print_r o var_dump() para ver medios más efectivos de inspeccionar el contenido de estos tipos

Desde resource

Un resource siempre es convertido a string con la estructura "Resource id #1", donde 1 es el número de recurso asignado al resource por PHP durante la ejecución

A pesar de que no se debe depender de la estructura exacta, debido a que está sujeta a cambios durante la ejecución, siempre será única para un recurso dado dentro del tiempo de vida de ese script en ejecución (es decir, una petición web o proceso CLI), por lo que no será reutilizada

Para obtener el tipo de un resource, emplee la función get_resource_type()

Puede utilizar las funciones print_r o var_dump() para ver medios más efectivos de inspeccionar el contenido de estos tipos

Desde NULL

NULL siempre es convertido a un string vacío ""

Desde otros tipos

La mayoría de los valores de PHP pueden ser convertidos a un string para su almacenamiento permanente

A este método se le denomina serialización, y es realizado mediante la función serialize()

Como el motor de PHP se construyó con soporte para WDDX, los valores de PHP también pueden ser serializados como texto XML bien formado

Conversión a array

Desde object

Si convierte un object a un array, el resultado es un array cuyos elementos son las propiedades del object

Las claves son los nombres de las variables miembro, con algunas excepciones notables: las variables privadas tienen el nombre de la clase al comienzo del nombre de la variable; las variables protegidas tienen un caracter ‘*’ al comienzo del nombre de la variable

Estos valores adicionados al inicio tienen bytes nulos a los lados

Esto puede dar en algunos comportamientos inesperados:

Desde NULL

Si convierte un valor NULL a array, obtiene un array vacío

Desde otros tipos

Para cualquiera de los tipos: integer, float, string, boolean y resource, convertir un valor a un array resulta en un array con un solo elemento, con índice 0, y el valor del escalar que fue convertido

En otras palabras, (array) $scalarValue es exactamente lo mismo que array($scalarValue)

Conversión a object

Si un object se convierte en un object, éste no se modifica

Desde otros tipos

Si un valor de cualquier otro tipo se convierte en un object, se crea una nueva instancia de la clase stdClass incorporada

Si el valor es NULL, la nueva instancia estará vacía

Un array se convierte en un object con las propiedades nombradas como claves y los valores correspondientes, con la excepción de las claves numéricas, las cuales serán inaccesibles a menos que sean recorridas

Conversión a recurso

Dado que las variables resource contienen gestores especiales a archivos abiertos, conexiones con bases de datos, áreas gráficas para imágenes y cosas por el estilo, la conversión a tipo resource carece de sentido

Conversión a NULL

Nota Esta característica ha sido declarada obsoleta a partir de PHP 7.2 y su uso está totalmente desaconsejado

Convertir una variable a null usando (unset) $var no eliminará la variable ni destruirá su valor

Sólo retornará un valor NULL

Estructuras de control en PHP

Estructuras de control en PHP

Para las estructuras de control, PHP posee las sentencias de control típicas de los lenguajes de alto nivel

Declaración de variables

A las variables en PHP no se les asigna un tipo predefinido

En PHP el tipo de las variables depende del valor que contengan las mismas en cada momento

Por tanto se realiza una conversión automática de tipos

PHP reconoce los siguientes tipos de valores:

  • Números

    enteros y reales

  • Valores booleanos

    true y false

  • Strings
  • Arrays

    tipo de datos que asocia valores con claves (como un mapa ordenado)

  • Iterables

    seudotipo introducido en PHP 7.1

    Acepta cualquier array u objeto que implemente la interfaz Traversable

  • Recursos

    referencia a un recurso externo

  • El valor null
  • Objetos

    Creados por el programador o predefinidos por el lenguaje

Dado que no existen tipos de variables a priori, no hemos de especificar el tipo de variable cuando la declaramos

La declaración de variables se hace anteponiendo la palabra reservada $ al nombre de la variable

Es posible asignarle el valor cuando la declaramos

La sentencia if

La sentencia if tiene la forma:

Los paréntesis asociados que delimitan la condición no son opcionales

En caso de que la condición sea verdadera se ejecutará la instrucción 1; en caso contrario se ejecuta si existe la instrucción 2

El uso de la sentencia else es opcional, por eso en la definición se han utilizado los corchetes

Si se omite, sólo se tendrá en cuenta el bloque de instrucciones cuando la condición sea verdadera

Un bloque de instrucciones es un conjunto de instrucciones delimitadas por llaves

Las llaves después de la sentencia if no son obligatorias

Si se omiten y la condición era verdadera, se ejecutará la siguiente instrucción

En caso contrario, se ejecutará la subsiguiente instrucción, de forma independiente al estado de la condición

De este modo, la omisión de las llaves después de la sentencia if nos permitirá escribirlo todo en una única línea terminada en ;

La sentencia elseif

También podemos utilizar sentencias if anidades mediante la sentencia elseif

Las sentencias elseif funcionan igual que una sentencia if

Pero sólo se ejecutarán en caso de que la condición de la sentencia if fuese falsa

La sentencia switch

Hace que se seleccione un grupo de sentencias entre varias posibles

Es una alternativa al uso de sentencias elseif anidadas

Su sintaxis es:

La expresión entre paréntesis del switch debe ser entera o string

Su resultado se comparará con los distintos valores del case

Si coincide con uno de ellos se pasará a la instrucción siguiente al case con dicho valor y se seguirán ejecutando las instrucciones consecutivas hasta encontrar una instrucción break o alcanzar las llaves de cierre del switch

En caso de que el resultado de la expresión no coincida con ningún valor se pasará la ejecución a la instrucción siguiente de la etiqueta default, si la hubiera, y se continuará como un case

Los valores en los case pueden ser una expresión constante

No puede haber dos case con el mismo valor

A diferencia de otros lenguajes, la sentencia continue se aplica a switch y actúa de manera similar a break

Si se tiene un switch dentro de un bucle y se desea continuar a la siguiente iteración del ciclo exterior, se utilizará continue 2

Es posible utilizar un punto y coma en lugar de dos puntos después de un case

Se seguirán ejecutando las instrucciones consecutivas normalmente hasta encontrar una instrucción break o alcanzar las llaves de cierre del switch

La sentencia match

Fue añadida en la versión PHP 8.0.

Hace que se seleccione un grupo de sentencias entre varias posibles

Es una alternativa al uso de sentencias elseif anidadas y es similar a la sentencia switch

De forma similar a una sentencia switch, una expresión match tiene una expresión de sujeto que se compara con múltiples alternativas

A diferencia de switch, se evaluará a un valor muy parecido al de las expresiones ternarias

Pero usando una comprobación de identidad (===) en lugar de una comprobación de igualdad débil (==)

Retorna un valor

Los valores posteriores ya no se procesan, como se hace en las sentencias switch

No es posible ejecutar bloques de código en cada condición, como se hace en las sentencias switch

La expresión utilizada en el match, debe ser completa, si no es manejada por ningún case se lanzará la excepción UnhandledMatchError

Dentro del mismo caso puede contener varias expresiones separadas por una coma, es similar a un OR lógico

Un caso especial es el patrón default, que permite hacer coincidir cualquier cosa que no se haya hecho coincidir previamente

Si se utilizan varios patrones default lanzarán la excepción E_FATAL_ERROR

Su sintaxis es:

Vamos a ver como quedaría el ejemplo sobre cervezas que vimos con switch, ahora con match:

La sentencia while

La sentencia while tiene la forma

Los paréntesis no son opcionales

Si se cumple la condición, se ejecuta la instrucción o el bloque de instrucciones y se repite el proceso hasta que deje de cumplirse la condición

La sentencia do

La sentencia do tiene la forma

Es muy similar a la sentencia while, excepto que la condición va después de la instrucción o bloque de instrucciones

Con lo que al menos se ejecutan una vez aunque la condición sea falsa

La sentencia for

En cuando a dicha sentencia, en PHP podemos distinguir dos variantes:

  • El bucle for "clásico"
  • El bucle foreach

El bucle for "clásico"

Este bucle, tiene una sintaxis muy parecida a la de C / C++

En esta sintaxis:

Inicialización crea la variable contador y le da un valor inicial

Condición se debe cumplir para que el bucle se ejecute

Depende de la variable índice

Expresión actualiza el valor de la variable índice

El equivalente de esta expresión con while es:

El bucle foreach

Este bucle, tiene una sintaxis muy parecida al for-each de Java

Itera una variable $var sobre todas las propiedades de un objeto $obj que se le pasa

Así para cada valor de $var se ejecutaran las sentencias del bucle

Por lo tanto, el bucle tendrá tantas iteraciones como propiedades el objeto y en cada iteración la variable tendrá el valor de la propiedad del objeto correspondiente con dicha iteración

Su sintaxis es:

La sentencia break

La sentencia break se puede colocar dentro de un bucle o bucles anidados

Cuando se ejecuta la sentencia break se abandona el bucle más interno

A todos los efectos la sentencia break actúa como un salto a la instrucción siguiente al bucle en el que se ejecuta

La sentencia continue

La sentencia continue, no abandona el bucle si no que hace que se ejecute la siguiente iteración

En el bucle while la ejecución del continue hace que el flujo del programa salte a la condición

En el bucle for la ejecución del continue hace que se ejecute la expresión de incremento, para después continuar normalmente con la condición

Es decir, la ejecución del continue evita que se ejecute el resto del cuerpo del bucle

Si se tiene un switch dentro de un bucle y se desea continuar a la siguiente iteración del ciclo exterior, se utilizá continue 2

Funciones en PHP

Funciones en PHP

Para definir funciones disponemos de la instrucción function

Después de esta palabra reservada se coloca el nombre de la función seguido de una lista de argumentos delimitados por paréntesis y separados por comas

Argumentos

El paso de argumentos es opcional y en algunos casos puede haber funciones que carezcan de ellos

Por ejemplo la función phpinfo no tiene argumentos

Esta función nos muestra información referente al módulo PHP que estamos usando y siempre devuelve el valor entero 1

Tipo de los argumentos

A partir de PHP 7 se puede declarar de forma opcional el tipo de los argumentos pasados a la función

Admite los tipos string, int, float, array, callable y clases

Si el usuario de la función los introduce mal o utiliza otro tipo de dato, PHP devolverá un mensaje de error indicándolo

Argumentos con valor por defecto

En ocasiones necesitamos que un argumento tenga un valor, para evitar un error, aunque el usuario de la función no lo introduzca

Hay que tener en cuenta, que los argumentos con valor por defecto pasan a ser opcionales y que todos los argumentos a la izquierda del primer valor por defecto, son obligatorios

Argumentos por valor o por referencia

Cuando pasamos un valor a una función, aunque lo modifiquemos, al salir de la función conservará su valor original

Esta es la situación por defecto y se denomina que es un argumento por valor

Ya que se utiliza una copia en memoria de la variable y cuando se sale de la función, esa copia de la variable se destruye

En el caso de que quisiéramos que los cambios realizados en el valor de la variable se conservarán después de salir de la función, deberemos usar el símbolo & delante del nombre de la variable

A esta situación se denomina que es un argumento por referencia

Ya que se utiliza una referencia a la variable en memoria, trabajando directamente sobre la variable y cuando se sale de la función, todos los cambios permanecen

Hasta PHP 5.0.5 era posible indicar que una función era por referencia usando el símbolo & delante del nombre de la función

Sin embargo, a partir de PHP 5.3.0 pasaría a indicar con un mensaje call-time pass-by-reference que su uso estaba obsoleto

A partir de PHP 5.4.0 fue totalmente eliminado y actualmente produce un error fatal

Es decir, sólo puede utilizarse el símbolo & al pasar argumentos, nunca en el nombre de la función

Sólo podemos pasar por referencia:

  • Variables
  • Referencias devueltas desde funciones

La sentencia return

La sentencia return es la que permite devolver el resultado de una función

A partir de PHP 7 se puede declarar de forma opcional el tipo devuelto por la función

Admite los tipos string, int, float, array, callable y clases

Para declarar el tipo se escribirá el símbolo : después de los paréntesis que siguen a los argumentos y antes de la llave de inicio {

Funciones predefinidas por el lenguaje

Funciones de visualización

Echo

La función echo sirve para enviar la salida de sus argumentos al navegador

Lo hemos usado continuamente en ejemplos previos

Tiene el formato:

Tiene las siguientes particularidades:

  • Podemos prescindir de los paréntesis en su uso, ya que son opcionales

  • Convierte toda la información a string antes de enviarla al navegador

  • Si utilizamos varios echo seguidos, nos encontraremos que el resultado lo concatena en la misma línea

    Para solucionarlo deberemos utilizar la etiqueta HTML <br/> para que salte de línea

  • Si utilizamos varios echo seguidos, nos encontraremos que el resultado no añade un espacio al final y por tanto, el contenido podría mostrar textos incomprensibles, al carecer de ese espacio

    Para solucionarlo deberemos añadir un espacio al final del primer echo o al principio del siguiente echo

printf

La función printf sirve para enviar la salida de sus argumentos al navegador con un formato

Tiene el formato:

Para formatear un texto deberemos introducir los siguientes caracteres de formato precedidos por el símbolo %:

Caracteres de formato para texto
Caracter Descripción
%

Carácter de porcentaje literal

No requiere un argumento

b

El argumento es tratado como un valor de tipo integer y presentado como un número binario

c

El argumento es tratado como un valor de tipo integer y presentado como el carácter con ese valor ASCII

d

El argumento es tratado como un valor de tipo integer y presentado como un número decimal (con signo)

e

El argumento es tratado con notación científica (por ejemplo 1.2e+2)

El especificador de precisión indica el número de dígitos después del punto decimal a partir de PHP 5.2.1.

En versiones anteriores, se tomaba como número de dígitos significativos (menos uno)

E

Como %e pero utiliza la letra mayúscula (por ejemplo 1.2E+2)

f

El argumento es tratado como un valor de tipo float y presentado como un número de punto flotante (considerando la configuración regional)

F

El argumento es tratado como un valor de tipo float y presentado como un número de punto flotante (sin considerar la configuración regional)

Disponible desde PHP 4.3.10 y PHP 5.0.3.

g

Igual que %e y %f

G

Igual que %E y %f

o

El argumento es tratado como un valor de tipo integer y presentado como un número octal

s

El argumento es tratado y presentado como un string

u

El argumento es tratado como un valor de tipo integer y presentado como un número decimal sin signo

x

El argumento es tratado como un valor de tipo integer y presentado como un número hexadecimal (con las letras en minúsculas)

X

El argumento es tratado como un valor de tipo integer y presentado como un número hexadecimal (con las letras en mayúsculas)

sprintf

La función sprintf sirve para asignar a sus argumentos, de forma formateada, la variable de retorno

Tiene el mismo formato que printf y admite los mismos formatos

print_r

La función print_r sirve para enviar la salida de sus argumentos al navegador, mostrando información entendible por las personas sobre los argumentos

Es útil para poder depurar nuestro código

Tiene el siguiente formato:

Podemos usarlo para ver el contenido completo de un array

Funciones para cadenas

Vamos a ver algunas de las funciones para cadenas de uso más cotidiano

Si necesitas más, la lista completa la puedes encontrar en el manual de PHP

Mayúsculas y minúsculas

La función strtoupper devuelve una copia de la cadena en mayúsculas

La función strtolower devuelve una copia de la cadena en minúsculas

Extraer cadena

La función substr sirve para extraer una subcadena de la cadena que le pasamos como argumento

Tiene el siguiente formato:

Dónde $start es la posición de inicio de la subcadena y $length la longitud que tendrá la subcadena

Puede ser útil cuando necesitamos extraer una palabra de un texto y conocemos previamente su posición y su longitud

Hay que tener en cuenta que la posición $start debe empezar en 0

Longitud de la cadena

La función strlen sirve para contar la longitud de la cadena

Tiene el siguiente formato:

Retomando la cadena del ejemplo anterior

Posición de un carácter en la cadena

La función strpos sirve para encontrar la posición de un carácter concreto en la cadena

Tiene el siguiente formato:

Dónde encontramos la aguja ($needle, es el carácter a buscar) en el pajar ($haystack, es la cadena en la que buscamos) y $offset, que es opcional, es el número inicial en el que se empieza a buscar

Hay que tener en cuenta que la posición inicial empieza en cero

A no ser que especifiquemos el valor de $offset

Encontrar un texto

La función strstr sirve para encontrar la primera aparición de una cadena

Tiene el siguiente formato:

Es muy similar a substr, pero nos ahorra el tener que usar strpos de forma intermedia

Funciones para matrices

Vamos a ver algunas de las funciones para matrices de uso más cotidiano

Si necesitas más, la lista completa la puedes encontrar en el manual de PHP

Contar el número de elementos

La función count sirve para contar el número total de elementos

Tiene el siguiente formato:

De forma opcional podemos utilizar el argumento $mode que por defecto utiliza el valor COUNT_NORMAL (cuenta los elementos secuencialmente) y para arrays multidimensionales COUNT_RECURSIVE (cuenta los elementos de forma recursiva, es decir, recorre todos los arrays multidimensionales y suma el total de elementos)

Buscar un valor en la matriz

Comprobar si un valor existe

La función in_array sirve para comprobar si un valor existe dentro de una matriz

Tiene el siguiente formato:

Dónde encontramos la aguja ($needle, es el carácter a buscar) en el pajar ($haystack, es la cadena en la que buscamos) y $strict, que es opcional, si es TRUE comprobará los tipos de $needle en $haystack

Si $needle es un string, la comparación se realiza considerando las mayúsculas ó minúsculas

Encontrar el primer valor

La función array_search sirve para encontrar el primer valor, si existe, dentro de una matriz

Tiene el siguiente formato:

Dónde encontramos la aguja ($needle, es el carácter a buscar) en el pajar ($haystack, es la cadena en la que buscamos) y $strict, que es opcional, si es TRUE comprobará los tipos de $needle en $haystack

Si $needle es un string, la comparación se realiza considerando las mayúsculas ó minúsculas

Hay que tener cuidado con los valores devueltos por esta función porque puede devolver el valor booleano FALSE, pero también puede devolver un valor no booleano que se evalúa como FALSE

En versiones anteriores a PHP 4.2.0 devolvía NULL en caso de fallo, en lugar de FALSE

A partir de PHP 5.3.0 devuelve NULL si se le pasan parámetros inválidos

Formatos de fecha

PHP no dispone de un tipo para fechas

Para trabajar con fechas utilizar strings formateados con marcas de tiempo al estilo de UNIX

Estas marcas de tiempo son un valor de entero medido en segundos que empiezan a contar a partir del 1 de Enero de 1970

Marcas de tiempo

Para obtener la marca de tiempo actual podemos usar la función time que tiene el siguiente formato:

El valor obtenido es fácil de manipular, ya que podemos sumarle múltiplos:

  • de 3600 para añadirle horas
  • de 86400 para añadirle días
  • de 604800 para añadirle semanas

Cadena con formato

También podemos usar una cadena de formato para trabajar con fechas usando la función date que tiene el siguiente formato:

Donde $format es el cadena con el formato que queremos usar, $timestamp, que es opcional y por defecto se toma la función time, es una marca de tiempo UNIX

Para formatear una fecha deberemos introducir los siguientes caracteres de formato:

Caracteres de formato de fechas
Caracter Descripción
d

Día del mes, 2 dígitos con ceros iniciales

D

Cadena para el día, tres letras

j

Día del mes sin ceros iniciales

l (L minúscula)

Cadena para el día de la semana

N

Representación numérica ISO-8601 del día de la semana

Añadido en PHP 5.1.0.

S

Sufijo ordinal en inglés para el día del mes, 2 caracteres

w

Representación numérica del día de la semana

z

El día del año (comenzando por 0)

W

Número de la semana del año ISO-8601, las semanas comienzan en lunes

F

Una representación textual completa de un mes, como January o March

m

Representación numérica de una mes, con ceros iniciales

M

Una representación textual corta de un mes, tres letras

n

Representación numérica de un mes, sin ceros iniciales

t

Número de días del mes dado

L

Si es un año bisiesto

o

Año según el número de la semana ISO-8601

Esto tiene el mismo valor que Y, excepto que si el número de la semana pertenece al año anterior o siguiente, se usa ese año en su lugar

Añadido en PHP 5.1.0.

Y

Una representación numérica completa de un año, 4 dígitos

y

Una representación de dos dígitos de un año

a

am o pm en minúsculas

A

am o pm en mayúsculas

B

Hora Internet

g

Formato de 12 horas de una hora sin ceros iniciales

G

Formato de 24 horas de una hora sin ceros iniciales

h

Formato de 12 horas de una hora con ceros iniciales

H

Formato de 24 horas de una hora con ceros iniciales

i

Minutos con ceros iniciales

s

Segundos con ceros iniciales

u

Microsegundos

Añadido en PHP 5.2.2.

date() siempre generará 000000 al tomar un parámetro de tipo integer, mientras que DateTime::format() admite microsegundos si el DateTime fue creado con microsegundos

v

Milisegundos

Añadido en PHP 7.0.0.

La misma observación que para u

e

Identificador de zona horaria

Añadido en PHP 5.1.0.

I (i mayúscula)

La fecha está en horario de verano o no

O

Diferencia de la hora de Greenwich (GMT) en horas

P

Diferencia con la hora de Greenwich (GMT) con dos puntos entre horas y minutos

Añadido en PHP 5.1.3

T

Abreviatura de la zona horaria

Z

Índice de la zona horaria en segundos

El índice para zonas horarias al oeste de UTC siempre es negativo, y para aquellas al este de UTC es siempre positivo

c

Fecha ISO 8601

Añadido en PHP 5

r

Fecha con formato RFC 2822

U

Segundos en formato UNIX (1 de Enero del 1970 00:00:00 GMT)

Obtener una fecha desde una cadena

Usando un delimitador

A partir de una cadena podemos recoger una fecha usando la función explode que tiene el siguiente formato:

Donde $delimiter es el carácter usado para delimitar los valores, $string la cadena que contiene la fecha que queremos manipular y $limit un valor opcional cuyo valor por defecto es 1, que indica el máximo de valores devueltos

Si $limit es negativo se devolverán todos los valores eliminando el valor de $limit a partir del final

Y si es 0 se tratará como 1

Y después usaremos la función mktime para crear la marca de tiempo de tipo UNIX, que tiene el siguiente formato:

Donde $hour es la hora, $minute son los minutos, $second, los segundos, $month es el mes, $day es el día, $year es el año y $is_dst es el horario de verano o no (-1 si no lo es)

Todos los parámetros son opcionales, en caso de no introducir ninguno, se tomará el resultado de la función time

A partir de 5.1, cuando se hace la llamada sin argumentos, lanza un aviso de tipo E_STRICT: use la función time() en su lugar

Convirtiendo una cadena a formato de fecha

A partir de una cadena podemos recoger una fecha usando la función strtotime que tiene el siguiente formato:

Donde $time es la cadena de la que queremos obtener la fecha, $now, que es opcional y por defecto se toma la función time, es una marca de tiempo UNIX

A partir de PHP 5.0.0 los microsegundos comenzaron a estar permitidos, pero eran ignorados

En PHP 5 hasta 5.0.2, now y otros momentos relativos son computados erróneamente como la medianoche de hoy

Esto difiere entre versiones donde es computado como el momento actual

A partir de PHP 5.1.0 muestra el error E_STRICT y E_NOTICE cuando ocurren errores con zonas horarias

Y devuelve FALSE si falla, en vez de -1

En PHP 5 hasta 5.2.7, las peticiones de una incidencia de un día de la semana dado en un mes donde ese día de la semana era el primer día del mes, añadía incorrectamente una semana a la marca de tiempo devuelta

Esto fue corregido en 5.2.7 y se mantiene en versiones posteriores

Antes de PHP 5.3.0, 24:00 no era un formato válido y devolvía FALSE

Los formatos de tiempo relativos que se suministraban al parámetro $time como this week, previous week, last week, y next week se interpretaban como un período de 7 días en relación con la fecha y hora actual, en lugar de un período de la semana de Monday a Sunday