Está en la página 1de 47

¡GUAUU!

libro electrónico
www.wowebook.org
PHP 7 Programación Cookbook

Más de 80 recetas que se llevará a sus habilidades de desarrollo


web PHP 7 al siguiente nivel!

Doug Bierer

BIRMINGHAM - Bombay

¡GUAUU! libro electrónico


www.wowebook.org
PHP 7 Programación Cookbook

Copyright © 2016 Packt Publishing

Todos los derechos reservados. Ninguna parte de esta publicación puede ser reproducida, almacenada en un sistema de
recuperación o transmitida en cualquier forma o por cualquier medio, sin la previa autorización por escrito del editor, excepto en el
caso de citas breves incorporados en artículos de revistas. Cada esfuerzo se ha hecho en la preparación de este libro para
asegurar la exactitud de la información presentada. Sin embargo, la información contenida en este libro se vende sin garantía, ya
sea expresa o implícita. Ni el autor, ni Packt Publishing, y sus concesionarios y distribuidores serán responsables por cualquier
daño causado o presuntamente causado directa o indirectamente por este libro.

Packt Publishing se ha esforzado para proporcionar información sobre marcas registradas acerca de todas las compañías y productos
mencionados en este libro por el uso apropiado de capitales. Sin embargo, Packt Publishing no puede garantizar la exactitud de esta
información.

Publicado por primera vez: August el año 2016

Producción referencia: 1260816

Publicado por Packt Publishing Ltd. librea


Place 35 librea calle

Birmingham B3 2PB, Reino Unido.

ISBN 978-1-78588-344-6

www.packtpub.com

[FM-2]

¡GUAUU! libro electrónico


www.wowebook.org
créditos

Autor Coordinador del proyecto

Doug Bierer Suzanne Coutinho

Los revisores Corrector de pruebas

Salvatore Pappalardo safis Edición

Vincenzo Provenza

indexador

Editor de puesta en marcha


Rekha Nair

Kunal Parikh

Coordinador de produccion

Editor de adquisición Melwyn Dsa

Kirk D'Costa

trabajo portada

Editor de Desarrollo de Contenidos


Melwyn Dsa

Merint Thomas Mathew

Editor técnico
Madhunikita Sunil Chindarkar

Editor de copia

safis Edición

[FM-3]

¡GUAUU! libro electrónico


www.wowebook.org
[FM-4]

¡GUAUU! libro electrónico


www.wowebook.org
Prefacio

Con PHP 7, obtenemos una serie de nuevas características y mejoras, como el árbol de sintaxis abstracta, errores arrojadizos,
consejos de tipo escalar, tipo de retorno declaraciones, mejoras en la velocidad, y mucho más.

La pregunta que se hacen los desarrolladores de PHP en estos días no es "¿Debo usar las nuevas características?", Sino "¿Cómo

implementar estas características para construir mejores aplicaciones más rápido?" Recuerdo la creación de aplicaciones en PHP 4. Fue

una época más simple para desarrolladores de PHP, ya que podría ser entremezclado con HTML y todo estaba en un archivo. En lugar

de los marcos, tuvimos bibliotecas de funciones que se incluía. Aplicaciones eran básicamente sólo las aplicaciones de escritorio CRUD

que nos dimos cuenta de cómo la pala en la web.

desarrollo de aplicaciones ha cambiado varias veces desde entonces. Nuevos marcos, como AJAX, PHPUnit, compositor y
API-En primer lugar, se introdujeron.

Todas estas cosas, y muchos otros, han influido en la forma en PHP los desarrolladores a crear aplicaciones. Hoy en día, se le rió sin
trabajo si tiene una aplicación basada en paginado que mezclaba HTML y PHP. ¿Entonces que vas a hacer? ¿Cómo va a construir
aplicaciones PHP modernas y APIs? ¿Cómo va a aprovechar todas las nuevas herramientas que PHP da a construir, mejores
aplicaciones rápido, más fuerte? Estoy tan bueno que lo preguntas.

Mi amigo Doug Bierer tiene la respuesta para usted. Esto no es YAUT (Sin embargo, otro Tomé inútil) de información que va a poner
en un estante y nunca utilizar. El libro que tiene en sus manos está destinado a, rápidamente, ser una parte de su cinta adhesiva biblioteca.
(Cada desarrollador tiene una cinta adhesiva
biblioteca. Se compone de esos libros que usted se refiere con tanta frecuencia que ahora se mantienen unidos por
cinta adhesiva.)

Doug se toma el tiempo para mostrarle las nuevas características que usted necesita para comprender, al igual que muchos libros de
desarrolladores por ahí. Cuando este libro es diferente es que el autor toma el tiempo para mostrar cómo resolver problemas del mundo real
utilizando estas nuevas herramientas. No sólo se aprende, pero se puede solucionar de inmediato los problemas con lo que se aprende.

[FM-5]

¡GUAUU! libro electrónico


www.wowebook.org
Usted no tiene que ser un experto en PHP para utilizar conceptos avanzados. Sin embargo, usted tiene que aprender, comprender
y utilizar estos conceptos avanzados si alguna vez la esperanza de crecer como programador. Este libro le ayudará a bajar su
camino para convertirse en un mejor programador.

Cal Evans

PHP nómada
Herder empollón para la World Wide Herd

[FM-6]

¡GUAUU! libro electrónico


www.wowebook.org
Sobre el Autor

Doug Bierer se ha enganchado en los ordenadores desde su primer programa, escrito en Dartmouth BASIC en un DEC
PDP-8, en 1971. En su amplio carrera, este autor ha sido un programador contrato profesional desde 1978, después de
haber escrito aplicaciones en BASIC, PL / yo, ensamblador, adelante, C, C ++, dBase / Foxbase / Clipper, Pascal, Perl,
Java y PHP. Se desplegó su primera página web en 1993 mientras vivía en San Francisco. Habla cuatro idiomas, ha
viajado mucho y ha vivido en los EE.UU., Francia, Holanda, Inglaterra, Suecia, Escocia, y Tailandia. También pasó
algunos años como administrador de sistemas Linux y redes TCP / IP. Él es también un músico consumado (que ha
escrito más de 60 canciones), así como un escritor, bajo el seudónimo de Douglas Alan.

propia compañía de Doug es unlikelysource.com, que se especializa en consultoría, programación PHP, desarrollo de sitios web,
y la formación (sobre todo para Zend Technologies Ltd y Rogue Wave Software Inc.

Sus obras de ficción publicados en https://www.lulu.com/ son El Fin, ¿y después? y


Otras indicaciones. Algunos de sus trabajos técnicos de O'Reilly Media son Aprender PHP y MySQL, Aprender PHP
Seguridad, Aprendizaje MongoDB, y Aprender la doctrina.

En primer lugar, me gustaría dedicar este libro a mi madre, Betty Bierer, quien falleció en mayo de
2016. Ella me animó toda mi vida, y aplaudió mis logros (no importa lo malo!). Ella asistió a todos
mis conciertos de música, compró todos mis CDs y leer todos los libros (aunque no las entendía).
También me gustaría agradecer a mi sufrida esposa, Siri, que pacientemente soportó las horas
que me llevó a escribir este libro sin queja. (Ella, sin embargo, hacer amenazas si yo estaba de
acuerdo para asumir otro ... las negociaciones están en curso.) Por último, me gustaría dar las
gracias a una serie de notables en la comunidad PHP que me permitió compartir ideas o
inspiración les ofreció. Estos incluyen, Matthew Weir O'Phinney, Cal Evans, Daryl madera, Susie
Pollock, Salvatore Pappalardo, Slavey Karadzhov, y Clark Everetts.

[FM-7]

¡GUAUU! libro electrónico


www.wowebook.org
Acerca de los revisores

Salvatore Pappalardo, un friki de la tecnología desde su nacimiento, ha sido un ingeniero de software desde 2002. El ama "desde cero"
desarrollo. Él es un amante de la tecnología, lector de ciencia ficción, entusiasta de la película, y un TED Talks adicto.

Vincenzo Provenza es un desarrollador web con más de 5 años de experiencia con diferentes tecnologías y lenguajes
de programación (principalmente PHP y JavaScript). Le encanta viajar y leer.

[FM-8]

¡GUAUU! libro electrónico


www.wowebook.org
www.PacktPub.com

libros electrónicos, ofertas de descuentos, y más


¿Sabías que Packt ofrece versiones de libros electrónicos de todos los libros publicados, con archivos PDF ePub y disponible? Se puede actualizar

a la versión de libro electrónico en www.PacktPub.com y como un cliente de impresión de libros, usted tiene derecho a un descuento en la copia de

libros electrónicos. Póngase en contacto con nosotros en

customercare@packtpub.com para más detalles. A www.PacktPub.com, también se puede leer una colección de artículos

técnicos gratuitos, crea para una serie de boletines gratuitos y recibe descuentos y ofertas exclusivas en los libros y libros

electrónicos Packt.

https://www2.packtpub.com/books/subscription/packtlib

¿Necesita soluciones inmediatas a sus preguntas de TI? PacktLib es la biblioteca de libros digitales en línea Packt. Aquí, usted
puede buscar, acceder y leer toda la biblioteca de los libros de Packt.

¿Por qué suscribirse?


F Que se puede buscar a través de cada libro publicado por Packt

F Copiar y pegar, imprimir y marcar el contenido

F En la demanda y accesible a través de un navegador web

[FM-9]

¡GUAUU! libro electrónico


www.wowebook.org
¡GUAUU! libro electrónico
www.wowebook.org
Tabla de contenido
Prefacio v
Capítulo 1: La construcción de una Fundación 1
Introducción 1
PHP 7 consideraciones sobre la instalación 1
Uso del servidor Web incorporado en PHP 6
La definición de una base de datos MySQL de prueba 7
Instalación de PHPUnit 8
La implementación de la carga automática de clases 9
Hoovering un sitio web 12
La construcción de un escáner web profunda 15
La creación de un PHP 5 a 7 Código PHP convertidor 18
Capítulo 2: Uso de PHP 7 características de alto rendimiento 25
Introducción 25
Comprender el árbol de sintaxis abstracta 26
entender las diferencias en el análisis sintáctico 30
entender las diferencias en el manejo foreach () 32
Mejorar el rendimiento usando PHP 7 mejoras 36
Iteración a través de un archivo masivo 41
Subir una hoja de cálculo en una base de datos 44
iterador directorio recursivo 47
Capítulo 3: El trabajo con PHP Programación Funcional 53
Introducción 53
funciones en desarrollo 54
Haciendo alusión a los tipos de datos 59
El uso de tipos de datos de valor de retorno 63
Utilización de iteradores 67
Escribir su propio iterador utilizando generadores 75

yo

¡GUAUU! libro electrónico


www.wowebook.org
Tabla de contenido

Capítulo 4: Trabajar con PHP Programación orientada a objetos 81


Introducción 81
El desarrollo de las clases 82
La extensión de las clases 88
El uso de propiedades y métodos estáticos 96
El uso de espacios de nombres 100
Definición de la visibilidad 105
El uso de las interfaces 109
El uso de rasgos 115
La implementación de las clases anónimas 122
Capítulo 5: Interactuar con una base de datos 129
Introducción 129
El uso de DOP para conectarse a una base de datos 130
La construcción de un generador de consultas SQL programación orientada a objetos 143
Manejo de la paginación 146
La definición de entidades para que coincida con las tablas de base 150
Atar las clases de entidad a RDBMS consultas 155
Incorporación de las búsquedas secundarias en resultados de la consulta 164
La implementación de las búsquedas de jQuery tablas de datos PHP 168
Capítulo 6: Creación de sitios web escalables 173
Introducción 173
La creación de un generador elemento de forma genérica 174
La creación de un generador de radio elemento HTML 181
Creación de un generador de selección de elemento HTML 185
La implementación de una fábrica de forma 190
Encadenando $ _POST filtros 196
Encadenando $ _POST validadores 210
Atar validación a un formulario 215
Capítulo 7: Acceso a Servicios Web 223
Introducción 223
La conversión entre PHP y XML 223
La creación de un simple cliente REST 227
Creación de un servidor simple descanso 237
La creación de un simple cliente SOAP 247
Creación de un servidor SOAP sencillo 250
Capítulo 8: Trabajo con fecha / hora y los aspectos internacionales 257
Introducción 257
El uso de emoticonos emoji o en un script de vista 258
La conversión de caracteres complejos 260
Obtener la configuración regional a partir de datos del navegador 263
ii

¡GUAUU! libro electrónico


www.wowebook.org
Tabla de contenido

los números de formato de la configuración regional 266


Manipulación de la moneda de acuerdo al lugar 270
fecha de formateo / hora según el entorno local 276
Creación de un generador de calendario internacional HTML 280
La construcción de un generador de eventos recurrentes 289
Manejo de traducción sin gettext 297
Capítulo 9: Desarrollo de Middleware 307
Introducción 307
Autenticar con el middleware 308
El uso de middleware para implementar el control de acceso 314
Mejorar el rendimiento mediante la caché 323
La implementación de enrutamiento 336
Hacer llamadas al sistema inter-marco 342
El uso de middleware para cruzar idiomas 350
Capítulo 10: En cuanto a los algoritmos avanzados 355
Introducción 355
El uso de captadores y definidores 356
La implementación de una lista enlazada 362
La construcción de una especie de burbuja 368
La implementación de una pila 371
La construcción de una clase de búsqueda binaria 373
La implementación de un motor de búsqueda 377
Viendo una matriz multi-dimensional y la acumulación de los totales 384
Capítulo 11: Implementación de Software Patrones de Diseño 391
Introducción 391
Creación de una matriz de oponerse hydrator 392
La construcción de un objeto a la matriz hydrator 395
La implementación de un patrón de estrategia 397
La definición de un asignador 407
La implementación de objeto-relacional cartografía 418
La implementación del patrón de diseño Pub / Sub 429
Capítulo 12: Mejora de la seguridad Web 435
Introducción 435
Filtrado de datos $ _POST 436
La validación de los datos $ _POST 440
Salvaguardar la sesión de PHP 443
Asegurar formas con un token 449
La construcción de un generador de contraseñas seguras 455
Protección de formas con un CAPTCHA de 461
Cifrar / descifrar sin mcrypt 475

iii

¡GUAUU! libro electrónico


www.wowebook.org
Tabla de contenido

Capítulo 13: Las mejores prácticas, pruebas y depuración 483


Introducción 483
Rasgos y utilizando Interfaces 484
gestor de excepciones universal 489
gestor de errores universal 493
Escribir un ensayo sencillo 497
Escribir un banco de pruebas 515
Generar datos de prueba falsos 518
Personalización de las sesiones utilizando parámetros Session_Start 531
Apéndice: Definir PSR-7 Clases 537
Introducción 537
La implementación de clases de objetos PSR-7 de valor 537
El desarrollo de una clase PSR-7 Solicitud 557
La definición de una clase PSR-7 Respuesta 572
Índice 579

iv

¡GUAUU! libro electrónico


www.wowebook.org
Prefacio
PHP 7 ha tomado la comunidad de código abierto por la tormenta, rompiendo los registros de velocidad, lo que es, metafóricamente,
causando cabezas a girar. En su sentido más fundamental, el equipo de ingeniería básica ha efectuado una importante reescritura de la
lengua, pero se las arregló para mantener la compatibilidad con versiones anteriores en un alto grado. El impacto de estos cambios internos
se manifiesta hacia el exterior en un aumento de casi 200% en la velocidad, con ahorros significativos en el uso de memoria. Desde una
perspectiva de desarrollo, los cambios en la forma en que se analizan los comandos junto con una sintaxis de la variable uniforme han
introducido nuevas formas de escribir código que simplemente eran imposibles en las versiones anteriores de PHP. De la misma manera,
cualquier desarrollador que no es consciente de cómo se interpretan los comandos en PHP 7 puede caer en las trampas invisibles, lo que
hace que el código no funcione correctamente. En consecuencia, el mandato de este libro es ilustrar formas nuevas y emocionantes para
escribir código y para señalar las áreas de incompatibilidad con las versiones anteriores de PHP. También es importante tener en cuenta que
este libro aborda tanto PHP 7.0 y 7.1.

Lo que este libro cubre


Capítulo 1, Construyendo un Fundación, Ayuda a llevar a la configuración inicial y la configuración del entorno de desarrollo de PHP 7.
También presentaremos algunas recetas iniciales contundentes, que demuestran de nuevas características de PHP 7.

Capítulo 2, Uso de PHP 7 Alta Características de rendimiento, toma una inmersión profunda en las nuevas características de la lengua.
Se le presentó a los conceptos del árbol de sintaxis abstracta y la sintaxis de la variable uniforme, entre otros, y aprenderá cómo
estos pueden afectar a la programación del día a día. Esto es seguido por las recetas que se aprovechan de las mejoras de
rendimiento PHP 7, incluyendo nuevos cambios significativos en el para cada() manejo bucle.

Capítulo 3, Trabajando con PHP programación funcional, hace hincapié en la forma en PHP siempre ha tenido la capacidad de trabajar
con bibliotecas definidas por el programador de funciones en lugar de clases, y PHP 7 no es una excepción. En este capítulo, vamos a
echar un vistazo más de cerca a las mejoras en el manejo de funciones, incluyendo la capacidad de proporcionar "consejos de tipo" que
implica tipos de datos básicos, tales como entero, flotante, booleano, y la cadena para la entrada y salida. También proporcionaremos
una amplia cobertura de los iteradores de la biblioteca estándar de PHP, así como la forma de escribir sus propios iteradores tomando
ventaja de un mejor manejo de los generadores.

¡GUAUU! libro electrónico


www.wowebook.org
Prefacio

Capítulo 4, Trabajando con PHP Programación orientada a objetos, explora los conceptos básicos de programación PHP orientado a objetos.
conseguir rápidamente más allá de los fundamentos, usted aprenderá cómo utilizar los espacios de nombres de PHP y rasgos. consideraciones
arquitectónicas serán cubiertos, incluyendo la mejor manera de utilizar interfaces. Por último, una nueva e interesante función de PHP 7, clases
anónimas, se discutirá junto con ejemplos prácticos de su uso.

Capítulo 5, Interactuar con una Base de datos, explora la posibilidad de tener su aplicación leer y escribir en una base de datos, que es
una parte crítica de cualquier sitio web moderno. Lo que es ampliamente entendido mal, sin embargo, es el uso correcto de la
extensión PHP Data Objects (PDO). En este capítulo se presentará una cobertura completa de la DOP, que a su vez permitirá a sus
aplicaciones para interactuar con la mayoría de las bases de datos importantes, como MySQL, Oracle, PostgreSQL, IBM DB2 y
Microsoft SQL Server, sin tener que aprender cualquier otro conjunto de comandos. Además, vamos a cubrir las técnicas avanzadas,
tales como el trabajo con entidades del modelo de dominio, realizar búsquedas secundarias integradas, y la implementación de las
búsquedas de jQuery DataTable utilizando PHP 7.

Capítulo 6, edificio escalable sitios web, profundiza en uno de los clásicos problemas que enfrentan los desarrolladores de PHP construcción de
sitios web interactiva formularios HTML-hardcoding y luego tener que realizar tareas de mantenimiento. Un enfoque orientado a objetos
ordenado y eficiente se presenta en este capítulo, que, con una cantidad mínima de código, le permite generar formularios HTML enteras que
se puede cambiar fácilmente en la configuración inicial. Otro problema igualmente desconcertante es cómo filtrar y validar los datos enviados
desde un formulario. En este capítulo, aprenderá cómo desarrollar un filtrado y validación de fábrica fácilmente configurable, que luego se
pueden aplicar a cualquier dato de entrada de correos.

Capítulo 7, Acceso a Internet Servicios, abarca algo que se está volviendo cada vez más importante para el desarrollo de la web
capacidad de publicar o consumir servicios web. Este capítulo trata sobre los dos enfoques fundamentales: en SOAP y REST. Usted
aprenderá cómo implementar SOAP y REST servidores y clientes. Adicionalmente, en las recetas que se presentan utilizan el patrón
de diseño de adaptador, que permite un alto grado de personalización, lo que significa que no están encerrados en un paradigma de
diseño específico.

Capítulo 8, Trabajando con Fecha / Hora y Aspectos internacionales, le ayuda a hacer frente a la feroz competencia debido al
crecimiento de la World Wide Web (WWW), lo que lleva a más y más clientes que buscan expandir sus negocios en los
mercados internacionales. En este capítulo se le dará al día en todos los aspectos de la internacionalización, incluyendo el
uso de emoticonos, personajes complejos y traducción. Adicionalmente, se le mostrará cómo adquirir y manejar la información
regional, incluyendo la configuración de idioma, el número y formato de moneda, así como la fecha y la hora. Además,
cubriremos recetas que muestran cómo crear calendarios internacionalizadas, que puede manejar eventos recurrentes.

Capítulo 9, Desarrollando middleware, trata el tema más candente en la comunidad de código abierto en este momento middleware.
Como su nombre indica, el middleware es un software que puede ser roto en su lugar, lo que añade valor a una aplicación existente
sin tener que modificar el código fuente de la aplicación. En este capítulo, se le mostrará una serie de recetas, implementado como
PSR-7-compatible middleware (ver Apéndice, Definir PSR-7 clases, para más detalles), que realizan la autenticación, control de
acceso, el almacenamiento en caché, y de enrutamiento.

vi

¡GUAUU! libro electrónico


www.wowebook.org
Prefacio

Capítulo 10, Mirando a Avanzado algoritmos, le ayuda a comprender que, como desarrollador, dado el enorme número de
programadores y compañías que compiten por el mismo negocio, es extremadamente importante que adquiera el dominio de
algoritmos avanzados clave. En este capítulo, el uso de PHP 7, aprenderá la teoría y aplicación de los captadores y
definidores, listas enlazadas, pilas tipo de burbujas, y la búsqueda binaria. Además, este capítulo examina cómo utilizar estas
técnicas para implementar un motor de búsqueda, y cómo manejar matrices multidimensionales.

Capítulo 11, La implementación de patrones de diseño de software, funciona en un aspecto importante de la programación orientada
a objetos, es decir, una comprensión de los patrones de diseño clave de software. Sin este conocimiento, al solicitar una nueva
posición o el intento de atraer a nuevos clientes, que, como desarrollador, estará en una grave desventaja. Este capítulo trata sobre
varios patrones de importancia crítica, incluyendo hidratación, Estrategia, Mapper, Object Relational Mapping, y Pub / Sub.

Capítulo 12, La mejora de web Seguridad, aborda cuestiones que surgen de la naturaleza penetrante de la Internet hoy en día. Vemos
ataques cibernéticos están lanzando cada vez con mayor frecuencia, a menudo con la pérdida financiera y personal devastadora.
En este capítulo, vamos a presentar recetas prácticas sólidas que, de aplicarse, darán a sus sitios web un impulso exponencial en
términos de seguridad y protección. Los temas cubiertos incluyen el filtrado y validación, la protección de la sesión, presentación del
formulario seguro, la generación de contraseñas seguras, y el uso de letras cifradas. Además, una receta se presenta que le
mostrará cómo cifrar y descifrar los datos sin necesidad de utilizar la extensión PHP mcrypt, que está en desuso en PHP 7.1 (y en
última instancia será removido de la lengua).

Capítulo 13, mejor Prácticas, pruebas y depuración, cubre las mejores prácticas y la depuración de su código para producir un
código bien escrito que funciona. En este capítulo, también aprenderá cómo configurar y crear pruebas unitarias, controlar errores
y excepciones inesperadas, y generar datos de prueba. Se presentan varias nuevas características de PHP 7, incluyendo la
forma en PHP 7 puede "tirar" errores. Es importante observar que mejor prácticas Se identifican en todo el libro, no sólo en este
capítulo!

Apéndice, Definir PSR-7 clases, direcciones aceptadas recientemente Normas PHP Recomendación 7, que define
interfaces utilizadas en conjunción con middleware. En este apéndice, se le mostrará implementaciones sólidas del
PSR-7 clases que incluyen objetos de valor, tales como URI, el cuerpo y la carga de archivos, así como objetos de
petición y respuesta.

Lo que necesita para este libro


Todo lo que necesita para implementar con éxito las recetas presentadas en este libro será una computadora, 100 MB de espacio de
disco adicional, y un editor de texto o código (no es un procesador de texto!). El primer capítulo cubre cómo configurar un entorno de
desarrollo de PHP 7. Tener un servidor Web es opcional ya que PHP 7 incluye un servidor web de desarrollo. No se requiere una
conexión a Internet, pero podría ser útil para descargar código (tales como el conjunto de interfaces de PSR-7), y revisar la
documentación de PHP 7.x.

vii

¡GUAUU! libro electrónico


www.wowebook.org
Prefacio

para quien es este libro


Este libro es para arquitectos de software, gerentes técnicos, desarrolladores de intermedio a avanzado, o simplemente los curiosos.
Usted necesita tener un conocimiento básico de programación PHP, especialmente la POO.

secciones
En este libro, se encuentran varias partidas que aparecen con frecuencia (Preparación, Cómo se hace, cómo funciona, Hay
más, y ver también).

Para dar instrucciones claras sobre cómo completar una receta, utilizamos estas secciones de la siguiente manera:

preparándose

Esta sección le indica lo que debe esperar en la receta, y describe cómo configurar ningún software o cualquier configuración
preliminares necesarios para la receta.

Cómo hacerlo…

Esta sección contiene los pasos necesarios para seguir la receta.

Cómo funciona…

Esta sección normalmente consiste en una explicación detallada de lo sucedido en la sección anterior.

Hay más…

Esta sección consta de información adicional sobre la receta con el fin de hacer que el lector más
conocedores de la receta.

Ver también

Esta sección proporciona enlaces útiles a otra información útil para la receta.

viii

¡GUAUU! libro electrónico


www.wowebook.org
Prefacio

convenciones
En este libro, encontrará una serie de estilos de texto que distinguen entre diferentes tipos de información. Estos son algunos ejemplos

de estos estilos y una explicación de su significado. Las palabras de código en el texto, nombres de tabla de base de datos, nombres de

carpeta, nombres de archivo, extensiones de archivo, nombres de ruta, URL ficticias, la entrada del usuario, y las manijas de Twitter se

muestran como sigue: "Por último, tomar la clase LotsProps se define en el tercer punto y colocarlo en un archivo separado,

chap_10_oop_using_getters_and_setters_magic_call.php ".

Un bloque de código se establece como sigue:

protegida función estática loadFile ($ file) {

si (file_exists ($ archivo)) {
archivo $ require_once; return
TRUE; }

falso retorno; }

Cuando deseamos llamar su atención sobre una parte específica de un bloque de código, las líneas o los artículos pertinentes se establecen en

negrita:

$ Params = [
'Db' ​=> __DIR__. '/../data/db/php7cookbook.db.sqlite'];

$ Dsn = sprintf (' sqlite:'. $ params [ 'db']);

Cualquier entrada o salida de línea de comandos se escribe como sigue:

cd / ruta / a / php recetas -S

localhost: 8080

Los nuevos términos y Palabras importantes se muestran en negrita. Palabras que se ven en la pantalla, por ejemplo, en los
menús y cuadros de diálogo, aparecen en el texto así: "Cuando el Las compras
se hace clic en el botón, la información de compra inicial aparece ".

Advertencias o notas importantes aparecen en un cuadro como este.

Consejos y trucos aparecen así.

ix

¡GUAUU! libro electrónico


www.wowebook.org
Prefacio

comentarios de los lectores

Los comentarios de nuestros lectores es siempre bienvenido. Háganos saber lo que piensa de este libro, lo que gustó o no.

comentarios de los lectores es importante para nosotros, ya que nos ayuda a desarrollar títulos que usted realmente va a obtener el

máximo provecho de. Para enviar comentarios generales, simplemente por e-mail feedback@packtpub.com, y mencione el título del libro

en el asunto del mensaje.

Si hay un tema que tiene experiencia en y usted está interesado en cualquiera de escritura o contribuir a
un libro, ver nuestra guía de Autor www.packtpub.com/authors.

Atención al cliente
Ahora que usted es el orgulloso propietario de un libro Packt, tenemos una serie de cosas para ayudarle a obtener el máximo provecho de
su compra.

La descarga del código de ejemplo

Puede descargar los archivos de código de ejemplo para este libro de su cuenta al http: // www. packtpub.com. Si ha adquirido este libro

otra parte, se puede visitar http: //www.packtpub. es / support y registrarse para tener los archivos enviados por correo electrónico

directamente a usted. Puede descargar los archivos de código siguiendo estos pasos:

1. Inicie sesión o regístrese en nuestro sitio web utilizando su dirección de correo electrónico y la contraseña.

2. Pase el puntero del ratón sobre el APOYO pestaña en la parte superior.

3. Haga clic en Código Descargas y erratas.

4. Introduzca el nombre del libro en el Buscar caja.


5. Seleccionar el libro para el que usted está buscando para descargar los archivos de código.

6. Elija en el menú desplegable en el que adquirió este libro de.


7. Haga clic en Descarga el código.

También puede descargar los archivos de código haciendo clic en el Los archivos de código botón en la página web del libro en la
página web de Packt Publishing. Esta página se puede acceder introduciendo el nombre del libro en el Buscar caja. Tenga en cuenta
que necesita estar conectado a su cuenta de Packt.

¡GUAUU! libro electrónico


www.wowebook.org
Prefacio

Una vez descargado el archivo, por favor asegúrese de que descomprimir o extraer la carpeta utilizando la última versión de:

F WinRAR / 7-Zip para Windows

F Zipeg / IZIP / UnRarX para Mac

F Uso de las utilidades de Linux o 7-Zip / PeaZip El paquete de código para el libro también está alojado
en GitHub en https://github.com/ Packt Publishing / PHP-7-Programación-libro de cocina. También tenemos otros
paquetes de código de nuestro rico catálogo de libros y videos disponibles en https://github.com/ Packt Publishing
/. Comprobar a cabo!

Errata

Aunque hemos tomado todas las precauciones para asegurar la exactitud de nuestro contenido, los errores ocurren. Si encuentra
un error en uno de nuestros libros, tal vez un error en el texto o el código-estaríamos agradecidos si pudiera informar de esto a
nosotros. Al hacerlo, puede ahorrar otros lectores de la frustración y ayudar a mejorar las versiones posteriores de este libro. Si
encuentra alguna errata, por favor informe al visitar http://www.packtpub.com/submit-errata, la selección de su libro, hacer clic en el Formulario
de Presentación de erratas enlace, e introducir los detalles de su fe de erratas. Una vez que su fe de erratas se verifican, su
presentación será aceptado y la fe de erratas se cargará en nuestra página web o añadir a cualquier fe de erratas existentes en la
sección de erratas de ese título. Para ver la fe de erratas presentada anteriormente, vaya a https://www.packtpub.com/books/
contenido / soporte y escriba el nombre del libro en el campo de búsqueda. La información requerida aparecerá bajo el Errata sección.

Piratería

La piratería de material con copyright en Internet es un problema constante en todos los medios. En Packt, tomamos la protección de nuestros

derechos de autor y licencias muy en serio. Si se encuentra con todas las copias ilegales de nuestros trabajos en cualquier forma en Internet,

por favor nos proporcione la dirección de ubicación o el nombre del sitio web inmediatamente para que podamos presentar un recurso. Por

favor, póngase en contacto con nosotros en copyright@packtpub.com con un enlace a la sospecha de material pirateado.

Apreciamos su ayuda en la protección de nuestros autores y nuestra capacidad para lograr que el contenido valioso.

xi

¡GUAUU! libro electrónico


www.wowebook.org
Prefacio

preguntas

Si usted tiene un problema con cualquier aspecto de este libro, puede ponerse en contacto con nosotros en preguntas @ packtpub.com, y

haremos nuestro mejor esfuerzo para resolver el problema.

xii

¡GUAUU! libro electrónico


www.wowebook.org
1
La construcción de una Fundación

En este capítulo, vamos a cubrir los siguientes temas:

F PHP 7 consideraciones sobre la instalación

F Uso del servidor Web incorporado en PHP

F La definición de una base de datos MySQL de prueba

F Instalación de PHPUnit

F La implementación de la carga automática de clases

F Hoovering un sitio web

F La construcción de un escáner web profunda

F La creación de un PHP 5 a 7 Código PHP convertidor

Introducción
En este capítulo se ha diseñado como una Inicio rápido que les permite conocer y que se ejecuta en PHP 7 para que pueda
empezar a aplicar las recetas de inmediato. La suposición subyacente de este libro es que usted ya tiene un buen conocimiento de
PHP y programación. Aunque este libro no va a entrar en detalles sobre la instalación real de PHP, ya que PHP 7 es relativamente
nuevo, vamos a hacer todo lo posible para señalar las peculiaridades y trampas que pueden surgir durante la instalación de PHP 7.

PHP 7 consideraciones sobre la instalación

Hay tres medios principales de adquisición de PHP 7:

F Descarga e instalación directamente desde el código fuente

F Instalación pre-compilado binarios

F Instalación de un paquete * AMP (es decir, XAMPP, WAMP, LAMP, MAMP, y así sucesivamente)

¡GUAUU! libro electrónico


www.wowebook.org
La construcción de una Fundación

Cómo hacerlo…

Los tres métodos se enumeran en orden de dificultad. Sin embargo, el primer enfoque, aunque tedioso, le dará
el control más finita sobre extensiones y opciones.

Instalar directamente desde la fuente


A fin de utilizar este enfoque, se necesita tener un compilador de C disponible. Si está ejecutando Windows, MinGW es un compilador

libre que ha demostrado ser popular. Se basa en el Colección de compiladores de GNU (GCC) compilador proporcionada por el ÑU proyecto.

compiladores no libres incluyen el clásico Turbo C compilador de Borland, y, por supuesto, el compilador que es preferido por los

desarrolladores de Windows es Estudio visual. Este último, sin embargo, está diseñado principalmente para el desarrollo de C ++, por lo

que cuando se compila PHP, tendrá que especificar el modo C. Cuando se trabaja en un Apple Mac, la mejor solución es instalar el Herramientas

de Desarrollo de Apple.

Se puede utilizar el Xcode IDE compilar PHP 7, o correr gcc desde una ventana de terminal. En un entorno Linux, desde una
ventana de terminal, ejecute gcc.

Al compilar desde una línea de comandos de la ventana o terminal, el procedimiento normal es el siguiente:

F configurar

F hacer

F realizar la prueba

F make install

Para obtener información sobre las opciones de configuración (es decir, cuando se ejecuta configurar), utilizar el ayuda

opción:

configure --help

Los errores que pueden surgir durante la fase de configuración se mencionan en la siguiente tabla:

Error Fijar

configurar: No se ha encontrado xml2config: Sólo tiene que instalar libxml2. Por este error, consulte el
error. Por favor, compruebe la instalación siguiente enlace:
libxml2
http://superuser.com/ preguntas / 740399 /
cómo-a-fix-phpinstallation-cuando-xml2-config-IsMissing

configure: error: Por favor, vuelva a instalar Instalar libreadline-dev


readline - No puedo encontrar readline.h

¡GUAUU! libro electrónico


www.wowebook.org
Capítulo 1

Error Fijar

configurar: ADVERTENCIA: no No es un gran trato. Estas opciones son valores por defecto y no necesitan
reconocido opciones: ser incluidos. Para más detalles, consulte el siguiente enlace:
- - enable-spl, --enablereflection,
--con-libxml
http://jcutrer.com/howto/linux/howto-compile-php7-on-ubuntu-14-04

Instalación de PHP 7 a partir de binarios precompilados


Como el título indica, pre-compilado binarios son un conjunto de archivos binarios que alguien más ha compilado amablemente desde

PHP 7 código fuente y ha puesto a disposición. En el caso de Windows, vaya a http://windows.php.net/. Va a encontrar un buen conjunto de

consejos en la columna de la izquierda que se refieren a la versión para elegir, a salvo de amenazas versus de no lectura segura,

Etcétera. A continuación, puede hacer clic en descargas y buscar el archivo ZIP que se aplica a su entorno. Una vez que
el archivo ZIP se ha descargado, extraer los archivos en la carpeta de su elección, añadir php.exe a su ruta, y configurar
PHP 7 utilizando el php.ini archivo. Para instalar los binarios pre-compilados en un sistema Mac OS X, lo mejor es incluir
un sistema de gestión de paquetes. Las recomendadas para PHP incluyen los siguientes:

F MacPorts

F Liip

F Soplón

F homebrew

En el caso de Linux, el sistema de envasado utilizado depende de la distribución de Linux que esté utilizando. La
siguiente tabla, organizado por la distribución de Linux, resume dónde buscar el paquete PHP 7.

Distribución Dónde encontrar PHP 7 notas

Debian packages.debian.org/stable/php Utilice este comando:

sudo apt-get install php7


repos-source.zend.com/zendserver/early-access/php7/php7*DEB*

Alternativamente, se puede utilizar una


herramienta de gestión de paquetes
gráfico como
Sináptica.

Asegúrese de seleccionar php7


(Y no php5).

¡GUAUU! libro electrónico


www.wowebook.org
La construcción de una Fundación

Distribución Dónde encontrar PHP 7 notas

Ubuntu packages.ubuntu.com Utilice este comando:

sudo apt-get install php7


repos-source.zend.com/zendserver/early-access/php7/php7*DEB*

Asegúrese de elegir la versión correcta

de Ubuntu. Alternativamente, se puede

utilizar una herramienta de gestión de

paquetes gráfico como

Sináptica.

Fedora / Red Hat paquetes admin.fedoraproject.org/pkgdb/ Asegúrese de que usted es el usuario root:

Do
repos-source.zend.com/zendserver/early-access/php7/php7*RHEL*
Utilice este comando:

DNF instalar php7


Alternativamente, se puede utilizar una
herramienta gráfica de gestión de
paquetes como el Administrador de
GNOME paquete.

OpenSUSE php7 software.opensuse.org/package/ Utilice este comando:

php7 YaST -i
Como alternativa, puede ejecutar

zypper, o usar YaST como una herramienta

gráfica.

La instalación de un paquete de AMP *

AMPERIO se refiere a Apache, MySQL, y PHP ( además Perl y Pitón). El * se refiere a Linux, Windows, Mac, y así sucesivamente
(es decir, LAMP, WAMP, MAMP y). Este enfoque es a menudo el más fácil, pero le da menos control sobre la instalación inicial
de PHP. Por otra parte, siempre se puede modificar el php.ini archivar e instalar extensiones adicionales para personalizar la
instalación según sea necesario. La siguiente tabla resume una serie de paquetes populares * AMP:

Paquete ¿Dónde se encuentra ¿Gratis? Soporta *


XAMPP www.apachefriends.org/download. html Y WML

AMPPS www.ampps.com/downloads Y WML

MAMP www.mamp.info/en Y WM

WampServer wampserver sourceforge.net/projects/ Y W

¡GUAUU! libro electrónico


www.wowebook.org
Capítulo 1

Paquete ¿Dónde se encuentra ¿Gratis? Soporta *


EasyPHP www.easyphp.org Y W

www.zend.com/en/products/zend_ servidor Zend norte WML


servidor

En la tabla anterior, hemos contratado los paquetes * * AMP, donde se sustituye por W para ventanas, METRO para Mac
OS X, y L para Linux.

Hay más…

Cuando se instala un binario pre-compilado a partir de un paquete, sólo se núcleo se instalan las extensiones. extensiones PHP no
esenciales deben instalarse por separado.

Vale la pena señalar que la instalación de PHP 7 en plataformas de computación en nube menudo seguirá el procedimiento de
instalación descrito para los binarios pre-compilados. Averiguar si su entorno de nube usa Linux, Mac o Windows máquinas
virtuales, y luego siga el procedimiento adecuado como se menciona en esta receta.

Es posible que PHP 7 aún no ha alcanzado su repositorio favorito para binarios pre-compilados. Siempre se puede instalar desde el
código fuente, o considerar la instalación de uno de los paquetes de AMP * (ver la siguiente sección). Una alternativa para los sistemas
basados ​en Linux es utilizar el Personal Archivo Paquete
( PPA) enfoque. Debido a que las APP no han sido sometidos a un riguroso proceso de selección, sin embargo, la
seguridad puede ser una preocupación. Una buena discusión sobre las consideraciones de seguridad para las APP se
encuentra en http://askubuntu.com/questions/35629/are-ppas-safe-to-add-to-mysystem-and-what-are-some-red-flags-to-watch-out-fo.

Ver también

Consideraciones generales de instalación, así como las instrucciones para cada una de las tres principales plataformas de sistemas
operativos (Windows, Mac OS X, y Linux), se pueden encontrar en http://php.net/manual/en/ install.general.php.

El sitio web de MinGW es http://www.mingw.org/.

Las instrucciones sobre cómo compilar un programa en C utilizando Visual Studio se pueden encontrar en
https://msdn.microsoft.com/en-us/library/bb384838.

Otra posible forma de probar PHP 7 es mediante el uso de una máquina virtual. Aquí hay un par de herramientas con sus enlaces, que
pueden resultar útiles:

F Vagabundo: https://github.com/rlerdorf/php7dev ( php7dev es un Debian 8


imagen vagabundo que está preconfigurado para probar aplicaciones PHP y el desarrollo de extensiones en muchas
versiones de PHP)

F Estibador: https://hub.docker.com/r/coderstephen/php7/ ( que contiene una


PHP7 acoplable contenedor)

¡GUAUU! libro electrónico


www.wowebook.org
La construcción de una Fundación

Uso del servidor Web incorporado en PHP


Aparte de las pruebas unitarias y se ejecuta PHP directamente desde la línea de comandos, la manera obvia de probar sus
aplicaciones es el uso de un servidor web. Para proyectos a largo plazo, sería beneficioso desarrollar una definición de host virtual para
un servidor web que refleja más de cerca posible al utilizado por su cliente. La creación de estas definiciones de los diversos servidores
web (es decir, Apache, Nginx, y así sucesivamente) está más allá del alcance de este libro. Otra alternativa rápida y fácil de usar (que
tenemos espacio para discutir aquí) es utilizar el servidor web integrado 7 en PHP.

Cómo hacerlo…

1. Para activar el servidor web PHP, primero cambie al directorio que servirá como la base para su código.

2. A continuación, deberá suministrar el nombre de host o la dirección IP y, opcionalmente, un puerto. Aquí hay un ejemplo que puede

utilizar para ejecutar las recetas suministradas con este libro:

cd / ruta / a / php recetas -S


localhost: 8080

Verá una salida en la pantalla que se ve algo como esto:

¡GUAUU! libro electrónico


www.wowebook.org
Capítulo 1

3. Como el servidor web integrado sigue solicitudes de servicio, también podrá ver la información de acceso, códigos
de estado HTTP, y solicitar información.

4. Si es necesario configurar la raíz de documentos del servidor web a un directorio distinto al actual, se puede utilizar el
- t bandera. La bandera debe entonces ser seguida por una ruta de directorio válido. El servidor web integrado tratará a
este directorio como si fuera la raíz de documentos web, que es útil por razones de seguridad. Por razones de
seguridad, algunos marcos, como Zend Framework, requiere que la raíz de documentos web es diferente de donde
reside el código fuente real. Aquí hay un ejemplo usando el - t bandera:

php -S localhost: 8080 fuente -t ​/ Chapter01

Aquí está un ejemplo de la salida:

La definición de una base de datos MySQL de prueba

Para propósitos de prueba, junto con el código fuente para el libro, hemos proporcionado un archivo SQL con datos de
ejemplo en https://github.com/dbierer/php7cookbook. El nombre de la base de datos utilizada en las recetas de este libro es php7cookbook.

¡GUAUU! libro electrónico


www.wowebook.org
La construcción de una Fundación

Cómo hacerlo…

1. Definir una base de datos MySQL, php7cookbook. También asignar derechos a la nueva base de datos
a un usuario llamado cocinar con la contraseña libro. La siguiente tabla resume estos valores:

ít. notas

Nombre de la base de datos php7cookbook

Base de datos de usuarios cocinar

contraseña de usuario de base de datos libro

2. A continuación se muestra un ejemplo de SQL necesario para crear la base de datos:

CREAR BASE DE DATOS SI NO EXISTE nombredb DEFAULT CHARACTER SET utf8 COLLATE
utf8_general_ci;
CREATE USER 'usuario' @ '%' identificado con mysql_native_password; Contraseña establecida para
'usuario' @ '%' = PASSWORD ( 'userPassword'); Conceder a todos los privilegios en nombredb * a
'usuario' @ '%'.; Conceder a todos los privilegios en nombredb * a 'usuario' @ 'localhost'.; FLUSH
PRIVILEGES;

3. Importar los valores de la muestra en la nueva base de datos. El archivo de importación, php7cookbook.
sql, se encuentra en https://github.com/dbierer/php7cookbook/blob/ maestro / php7cookbook.sql.

Instalación de PHPUnit
Prueba de la unidad es posiblemente el medio más popular de código de prueba PHP. La mayoría de los desarrolladores estarán de acuerdo en

que un conjunto sólido de pruebas es un requisito para cualquier proyecto desarrollado adecuadamente. En realidad pocos desarrolladores

escriben estas pruebas. Unos pocos afortunados tienen un grupo de prueba independiente que escribe las pruebas para ellos! Después de meses

de escaramuzas con el grupo de prueba, sin embargo, los restos de los pocos afortunados tienden a quejarse y quejarse. En cualquier caso, todos

los libros sobre PHP no estaría completa sin al menos un movimiento de cabeza y un guiño hacia las pruebas. El lugar para encontrar la última

versión del PHPUnit es https://phpunit.de/. PHPUnit5.1 y por encima de PHP soporte 7. Haga clic en el enlace de la versión deseada, y va a descargar

una phpunit.phar archivo. A continuación, puede ejecutar comandos utilizando el archivo, de la siguiente manera:

php phpunit.phar <comando>

los Phar comando significa Archivo PHP. La tecnología se basa en


alquitrán, que a su vez se utilizó en UNIX. UN Phar archivo es una colección de archivos PHP que se embalan
juntos en un solo archivo para mayor comodidad.

¡GUAUU! libro electrónico


www.wowebook.org
Capítulo 1

La implementación de la carga automática de clases

En el desarrollo de PHP utilizando una programación orientada a objetos (POO) enfoque, la recomendación es colocar cada
clase en su propio archivo. La ventaja de seguir esta recomendación es la facilidad de mantenimiento a largo plazo y mejorar
la legibilidad. La desventaja es que cada archivo de definición de la clase debe ser incluido (es decir, el uso de incluir o sus
variantes). Para abordar esta cuestión, hay un mecanismo incorporado en el lenguaje PHP que se

autocarga cualquier clase que no se haya incluido específicamente.

preparándose

El requisito mínimo para la carga automática de PHP es definir un mundial __ autocarga () función. Esto es un magia función
llamada automáticamente por el motor de PHP cuando se solicita una clase, pero en la que dicha clase no se ha incluido. El
nombre de la clase solicitada aparecerá como un parámetro cuando __ autocarga () se invoca (suponiendo que ha definido él!). Si
está utilizando espacios de nombres de PHP, se pasará el nombre de espacio de nombres completo de la clase. Porque __

autocarga () es un función, debe estar en el espacio de nombres global; Sin embargo, hay limitaciones en su uso. En
consecuencia, en esta receta, vamos a hacer uso de la spl_autoload_register ()
función, lo que nos da más flexibilidad.

Cómo hacerlo…

1. La clase vamos a cubrir en esta receta es Aplicación \ carga automática \ Loader. En orden
para tomar ventaja de la relación entre los espacios de nombres de PHP y de carga automática, nombramos el
archivo Loader.php y colocarlo en el directorio / ruta / a / libro de cocina / archivos / Aplicación / carga automática carpeta.

2. El primer método que presentaremos simplemente carga un archivo. Usamos El archivo existe() a
comprobar antes de ejecutar requerir una vez(). La razón de esto es que si no se encuentra el archivo, requerir una vez() generará
un error grave que no puede ser capturado con nuevas capacidades de manejo de error de PHP de 7:

protegida función estática loadFile ($ file) {

si (file_exists ($ archivo)) {
archivo $ require_once; return
TRUE; }

falso retorno; }

3. A continuación, podemos probar el valor de retorno de cargar archivo() en el programa de llamada y el bucle

a través de una lista de directorios alternativos antes de lanzar una Excepción si es en última instancia, no puede cargar el
archivo.

¡GUAUU! libro electrónico


www.wowebook.org
La construcción de una Fundación

Usted se dará cuenta de que los métodos y propiedades de esta clase son estáticos. Esto nos da
mayor flexibilidad al registrar el método de carga automática, y también nos permite tratar a la Cargador
como una clase Semifallo.

4. A continuación, se define el método que llama cargar archivo() y en realidad realiza la lógica
para localizar el archivo basado en el nombre de clase de espacio de nombres. Este método se deriva un nombre de
archivo mediante la conversión del espacio de nombres de PHP separador \ en el separador de directorios adecuada a
este servidor y anexas. php: autoLoad función pública estática (clase $) {

$ Éxito = false;
$ Fn = str_replace ( '\\', DIRECTORY_SEPARATOR, clase $)
. '.php';
foreach (self :: $ directorios como $ comenzar) {
$ File = $ inicio. DIRECTORY_SEPARATOR. $ Fn; si (self :: loadFile ($
archivo)) {
$ Éxito = TRUE; descanso;
}}

if (! $ éxito) {
if (! self :: loadFile (__ DIR__
. DIRECTORY_SEPARATOR. $ Fn)) {throw new \
Excepción (
self :: UNABLE_TO_LOAD. ''. clase $); }}

devolver $ éxito; }

5. A continuación, el método de bucle a través de una serie de directorios que llamamos self :: $ directorios, utilizando

cada directorio como un punto de partida para el nombre de archivo derivada. Si no tiene éxito, como último
recurso, el método intenta cargar el archivo desde el directorio actual. Si aún no es exitosa, una Excepción es
aventado.

6. A continuación, tenemos un método que puede añadir más directorios a nuestra lista de directorios para poner a prueba. Observe que si
el valor proporcionado es una matriz, array_merge () se utiliza. De lo contrario, simplemente se añade la cadena de directorio a la self :: $
dirs formación:

addDirs públicas estáticas de función () {$ dirs

if ($ is_array (directorios)) {
self :: $ dirs = array_merge (self :: $, $ directorios directorios); } Else {

10

¡GUAUU! libro electrónico


www.wowebook.org
Capítulo 1

self :: $ directorios [] = $ dirs; }}

7. A continuación, llegamos a la parte más importante; tenemos que dejar constancia de nuestra autocarga ()

método como una Biblioteca estándar de PHP (SPL) cargador automático. Esto se logra utilizando
spl_autoload_register () con el en eso() método:

pública init función estática ($ dirs = array ()) {

if ($) {directorios
self :: $ addDirs (directorios); }

si (self :: $ == registrada 0) {
spl_autoload_register (__ class__ ':: carga automática'.); self :: $ registrada ++; }}

8. En este punto, podemos definir __ construir(), que llama self :: init (dirs $).
Esto nos permite crear también una instancia de Cargador Si es deseado:

__construct función pública ($ dirs = array ()) {

self :: init ($ dirs); }

Cómo funciona…

Con el fin de utilizar la clase cargador automático que acabamos de definir, que tendrá que requerir Loader. php. Si los archivos de
espacio de nombres se encuentran en un directorio distinto al actual, también debe ejecutar Cargador :: init () y el suministro de rutas
de directorios adicionales.

Con el fin de asegurarse de que funciona el cargador automático, también necesitaremos una clase de prueba. He aquí una definición de

/path/to/cookbook/files/Application/Test/TestClass.php:

<? Php
espacio de nombres de programa \ prueba;
TestClass clase {

getTest función pública () {

volver __METHOD__; }}

11

¡GUAUU! libro electrónico


www.wowebook.org
La construcción de una Fundación

Ahora crear una muestra chap_01_autoload_test.php archivo de código para probar el cargador automático:

<? Php
requerir __DIR__. '/../Application/Autoload/Loader.php'; Aplicación \ carga automática \
cargador :: init (__ DIR__ '/ ..'.);

A continuación, obtener una instancia de una clase que no se haya cargado:

$ Test = nueva aplicación \ Test \ TestClass (); echo $ Test-> getTest


();

Por último, trate de obtener una falso clase que no existe. Tenga en cuenta que esto generará un error:

$ = Falso nueva aplicación \ Test \ FakeClass (); echo $ fake->


getTest ();

Hoovering un sitio web


Muy frecuentemente, es de interés para escanear una página web y extraer información de las etiquetas específicas. Este mecanismo
básico se puede utilizar en la red en busca de trozos de útiles de información. En otras ocasiones es necesario obtener una lista de < IMG>
las etiquetas y la SRC atributo o < A> las etiquetas y los correspondientes HREF atributo. Las posibilidades son infinitas.

Cómo hacerlo…

1. En primer lugar, tenemos que agarrar el contenido del sitio web de destino. A primera vista parece que deberíamos
hacer una solicitud cURL, o simplemente utilizar file_get_contents ().
El problema con estos enfoques es que vamos a llegar a tener que hacer una gran cantidad de manipulación
de cadenas, lo más probable tener que hacer uso excesivo de la expresión regular temida. Para evitar todo
esto, vamos a simplemente tomar ventaja de una clase PHP 7 ya existente DOMDocument. Así se crea una DOMDocument

ejemplo, poniéndolo a UTF-8. No se preocupan por espacios en blanco, y el uso de la mano


loadHTMLFile () método para cargar el contenido de la página web en el objeto:

getContent función pública ($ url) {

if (! $ this-> content) {
(si stripos ($ url, 'http') == 0) {
$ Url = 'http: //'. $ Url; }

$ This-> content = new DOMDocument ( '1,0', 'utf-8'); $ This-> contenido->


PreserveWhitespace = false; // @ utilizado para suprimir avisos generados a partir //
páginas web configurados incorrectamente @ $ this-> contenido-> loadHTMLFile ($
url); }

12

¡GUAUU! libro electrónico


www.wowebook.org
Capítulo 1

return $ this-> contenido; }

Tenga en cuenta que preceden a la llamada a la loadHTMLFile () método con un @. Esto no se hace para
ocultar la mala codificación (!) Al igual que a menudo el caso en PHP 5! Más bien, el @ suprime los avisos
generados cuando el analizador encuentra HTML mal escrito. Presumiblemente, podríamos capturar los
avisos y registrarlos, capaces de dar nuestra Aspiradora clase una capacidad de diagnóstico también.

2. A continuación, tenemos que extraer las etiquetas que son de interés. Usamos el
getElementsByTagName () Método para este propósito. Si deseamos extraer
todas etiquetas, podemos suministrar * como argumento:

getTags de función pública ($ url, $ tag) {

$ recuento = 0;
$ Resultado = array ();
$ Elementos = $ this-> getContent ($ url)
- > getElementsByTagName ($ tag);
foreach ($ elementos como $ nodo) {
$ Resultado [$ count] [ 'valor'] = trim (
preg_replace ( '/ \ s + /', '', $ node-> nodeValue)); if ($ nódulo-> hasAttributes
()) {
foreach ($ node-> atributos como el nombre $ => $ attr) {

$ Resultado [count $] [ 'atributos'] [$ name] =


$ Attr-> valor; }}

$ Contar ++; }

return $ resultado; }

3. También podría ser de interés para extraer ciertos atributos en lugar de las etiquetas. De acuerdo con ello, definimos otro
método para este propósito. En este caso, tenemos que analizar a través de todas las etiquetas y el uso getAttribute (). Se dará
cuenta de que hay un parámetro para el dominio DNS. Hemos añadido esto con el fin de mantener la exploración dentro del
mismo dominio (si usted está construyendo un árbol web, por ejemplo):

getAttribute función pública ($ url, $ attr, $ domain = NULL) {

$ Resultado = array ();


$ Elementos = $ this-> getContent ($ url)
- > getElementsByTagName ( '*');
foreach ($ elementos como $ nodo) {

13

¡GUAUU! libro electrónico


www.wowebook.org
La construcción de una Fundación

if ($ node-> hasAttribute ($ attr)) {


$ Valor = $ node-> getAttribute ($ attr); if ($ dominio) {

(si stripos (valor de $, $ dominio)! == false) {


$ Resultado [] = trim ($ value); }} Else {

$ Resultado [] = trim ($ value); }}}

return $ resultado; }

Cómo funciona…

Para utilizar el nuevo Aspiradora clase, inicializar el cargador automático (descrito anteriormente) y crear una instancia de la Aspiradora

clase. A continuación, puede ejecutar el Hoover :: getTags () Método para producir una serie de etiquetas desde la URL que

especifique como argumento. Aquí es un bloque de código de chap_01_vacuuming_website.php que utiliza el Aspiradora

clase para escanear la página web de O'Reilly < A> tags:

<? Php
// modificar según sea necesario

define ( 'DEFAULT_URL', 'http://oreilly.com/'); define ( 'DEFAULT_TAG', 'a');

requerir __DIR__. '/../Application/Autoload/Loader.php'; Aplicación \ carga automática \


cargador :: init (__ DIR__ '/ ..'.);

// obtener la clase de "vacío"


$ Vac = nuevo programa \ Web \ Hoover ();

// NOTA: se utiliza el operador de PHP se unen 7 nula $ url = strip_tags ($ _ GET [


'url'] ?? DEFAULT_URL); $ tag = strip_tags ($ _ GET [ 'tag'] ?? DEFAULT_TAG);

'El lanzamiento de las etiquetas:' eco. PHP_EOL; var_dump


($ VCA> getTags ($ url, $ tag));

14

¡GUAUU! libro electrónico


www.wowebook.org
Capítulo 1

La salida será algo como esto:

Ver también

Para obtener más información sobre DOM, consulte la página de referencia en PHP http://php.net/manual/ es /
class.domdocument.php.

La construcción de un escáner web profunda

A veces es necesario para escanear una página web, pero ir un nivel más profundo. Por ejemplo, usted quiere construir un diagrama de árbol

web de un sitio web. Esto se puede lograr mediante la búsqueda de todos los < A> las etiquetas y después de la HREF atribuye a la siguiente
página web. Una vez que haya adquirido las páginas secundarias, a continuación, puede continuar con el escaneado con el fin de completar el

árbol.

15

¡GUAUU! libro electrónico


www.wowebook.org
La construcción de una Fundación

Cómo hacerlo…

1. Un componente central de un escáner web profunda es una condición básica Aspiradora clase, como se describe

previamente. El procedimiento básico que se presenta en esta receta es para explorar el sitio web de destino y la
aspiradora todo el HREF atributos. Para este fin, se define una Aplicación \ Web \ Profundo clase. Añadimos una propiedad
que representa el dominio DNS:

espacio de nombres de programa \ Web; Profundo


clase {

protected $ dominio;

2. A continuación, se define un método que Hoover las etiquetas para cada sitio web representada en la lista de exploración. Con
el fin de evitar que el escáner de la pesca de arrastre de la totalidad Red mundial (WWW), hemos limitado la exploración al
dominio de destino. La razón por la cual de rendimiento a partir se ha agregado es porque necesitamos para producir toda la
matriz producida por
Hoover :: getTags (). los de rendimiento a partir la sintaxis nos permite tratar la matriz como un sub-generador:

exploración de la función pública ($ url, $ tag) {

$ aspiradora = New Hoover ();


$ = $ Escanear VCA> getAttribute ($ url, 'href',
$ This-> GetDomain ($ url)); $ Resultado
= array ();
foreach ($ escanear como $ subsitio) {
de rendimiento a partir VCA $> $ getTags (subsitio, $ etiqueta); }

count ($ escaneo) de retorno; }

El uso de de rendimiento a partir convierte el escanear() método en un generador de delegante PHP 7.


Normalmente, se inclinaría a almacenar los resultados de la exploración en una matriz. El problema, en este
caso, es que la cantidad de información recuperada podría ser potencialmente masiva. Por lo tanto, es
mejor para obtener inmediatamente los resultados con el fin de conservar la memoria y para producir
resultados inmediatos. De lo contrario, no habría una espera larga, lo que probablemente sería seguido por
un error de falta de memoria.

3. Con el fin de mantener dentro del mismo dominio, necesitamos un método que devolverá el dominio de
la URL. Usamos la práctica parse_url () funcionar para este propósito:

GetDomain función pública ($ url) {

if (! $ this-> dominio) {

dieciséis

¡GUAUU! libro electrónico


www.wowebook.org
Capítulo 1

$ This-> = dominio parse_url ($ url, PHP_URL_HOST); }

return $ this-> dominio; }

Cómo funciona…

En primer lugar, seguir adelante y definir el Aplicación \ Web \ Profundo clase definida anteriormente, así como la Aplicación \

Web \ Hoover clase definida en la receta anterior. A continuación, definir un bloque de código de chap_01_deep_scan_website.php que

pone en marcha la carga automática (como se describe anteriormente en este capítulo):

<? Php
// modificar según sea necesario

define ( 'DEFAULT_URL', unlikelysource.com '); define (


'DEFAULT_TAG', 'img');

requerir __DIR__. '/../../Application/Autoload/Loader.php'; Aplicación \ carga automática \ cargador ::


init (__ DIR__ '/../ ..'.);

A continuación, obtener una instancia de nuestra nueva clase:

$ Profunda = nuevo programa \ Web \ profunda ();

En este punto, se puede recuperar URL y etiquetar la información de parámetros de URL. El PHP 7 se unen nula operador es útil
para establecer los valores de retorno:

$ url = strip_tags ($ _ GET [ 'url'] ?? DEFAULT_URL); $ tag = strip_tags ($ _


GET [ 'tag'] ?? DEFAULT_TAG);

Algunos HTML simple mostrará los resultados:

foreach ($ profundas> Barrido ($ url, $ tag) como $ item) {


$ Src = $ item [ 'atributos'] [ 'src'] ?? NULO;
if ($ && src (stripos ($ src, 'png') || stripos ($ src, 'jpg'))) {
printf ( '<br> <img src = "% s" />', $ src); }}

Ver también

Para obtener más información sobre los generadores y de rendimiento a partir, consulte el artículo en
http://php.net/manual/en/language.generators.syntax.php.

17

¡GUAUU! libro electrónico


www.wowebook.org
La construcción de una Fundación

La creación de un PHP 5 a 7 Código PHP convertidor


En su mayor parte, el código PHP 5.x puede funcionar sin cambios en PHP 7. Hay algunos cambios, sin embargo, que se
clasifican como revés incompatibles. Lo que esto significa es que si su código PHP 5 está escrito de una manera determinada, o
utiliza funciones que han sido retirados, el código se romperá, y que tendrá un error desagradable en sus manos.

preparándose

los PHP 5 a 7 Convertidor de código PHP hace dos cosas:

F Escanea el archivo de código y convierte PHP 5 funcionalidad que se ha quitado a su


equivalente en PHP 7

F Agrega comentarios con // ADVERTENCIA donde se han producido cambios en el uso del lenguaje,
pero donde una re-escritura no es posible

Tenga en cuenta que después de ejecutar el convertidor, su código es no garantizado para trabajar en PHP 7.
Usted todavía tendrá que revisar la // ADVERTENCIA etiquetas añadidas. Al menos, esta receta le dará una
buena ventaja de convertir su código PHP 5 para trabajar en PHP 7.

El núcleo de esta receta es la nueva PHP 7 preg_replace_callback_array () función. Lo que este sorprendente función le permite hacer
es presentar una serie de expresiones regulares como llaves, con el valor que representa una devolución de llamada
independiente. A continuación, puede pasar la cadena a través de una serie de transformaciones. No sólo eso, el tema de la serie
de devoluciones de llamada puede
sí mismo ser una matriz.

Cómo hacerlo…

1. En una nueva clase Aplicación \ Analizar \ Convert, comenzamos con una escanear() método, que acepta un nombre de
archivo como un argumento. Se comprueba si existe el archivo. Si es así, se llama al PHP archivo() función, que carga el
archivo en una matriz, con cada elemento de la matriz que representa una línea:

exploración de la función pública ($ archivo) {

if (! file_exists ($ archivo)) {
arrojar nueva Excepción (
self :: EXCEPTION_FILE_NOT_EXISTS); }

$ contenidos = archivo ($ archivo);


'Procesamiento:' eco. $ Nombre de archivo. PHP_EOL;

$ Resultado = preg_replace_callback_array ([

18

¡GUAUU! libro electrónico


www.wowebook.org
Capítulo 1

2. A continuación, empezar a pasar una serie de pares clave / valor. La clave es una expresión regular, que se procesa en contra de
la cadena. Cualquier coincidencia se pasan a la devolución de llamada, que se representa como la parte del valor del par
clave / valor. Comprobamos para las etiquetas de apertura y cierre que se han eliminado de PHP 7:

// reemplazar que ya no apoyados por la apertura de las etiquetas '^ \ <\%


(\ n |)!' =>
función (coincidencia $) {
retorno '<? php'. $ Partido [1]; },

// reemplazar que ya no apoyados por la apertura de las etiquetas '^ \ <\%


= (\ n |)!' =>
función (coincidencia $) {
retorno '<? php echo'. $ Partido [1]; },

// reemplazar sin el apoyo de más largo etiqueta de cierre '! \% \>!' =>

función (coincidencia $) {
retorno '?>'; },

3. A continuación hay una serie de advertencias cuando se detectan ciertas operaciones y existe un potencial código-ruptura
entre cómo se manejan en PHP 5 frente a PHP 7. En todos estos casos, el código no es re-escrito. En cambio, un
comentario en línea con la palabra ADVERTENCIA
está agregado:

// cambios en cómo se maneja $$ interpretación xxx '! (. *?) \ $ \ $!' =>

función (coincidencia $) {
retorno '// ADVERTENCIA: la interpolación de variables
. 'Ahora se produce de izquierda a derecha'. PHP_EOL
. '// ver: http://php.net/manual/en/'
. '// migration70.incompatible.php'
. $ Partido [0];
},

// cambios en cómo se maneja la lista () operador de! (. *?) lista (\ s *?)? \ (! '=>

función (coincidencia $) {
retorno '// ADVERTENCIA: se han realizado cambios'
. 'En la lista () manejo del operador.
. A ver: http://php.net/manual/en/ '
. 'Migration70.incompatible.php'
. $ Partido [0];

19

¡GUAUU! libro electrónico


www.wowebook.org
La construcción de una Fundación

},

// instancias de \ u { '! (. *?) \\\ U


\ {!' =>
función (coincidencia $) {
retorno '// ADVERTENCIA: \\ u {xxx} ahora se considera'
. 'Sintaxis de escape Unicode'. PHP_EOL
. '// ver: http://php.net/manual/en/'
. 'Migration70.new-features.php'
. '# Migration70.new-features.unicode-'
. 'De escape de punto de código-sintaxis'. PHP_EOL
. $ Partido [0];
},

// confiar en set_error_handler () '! (. *?) Set_error_handler (\ s *?)?.


* \ (!' =>
función (coincidencia $) {
retorno '// ADVERTENCIA: no podría'
. 'Atrapar todos los errores'
. '// ver: http://php.net/manual/en/'
. '// language.errors.php7.php'
. $ Partido [0];
},

// session_set_save_handler (xxx)
'! (. *?) Session_set_save_handler (\ s *?)? \ ((. *?) \)!' =>
función (coincidencia $) {
if (isset ($ partido [3])) {
retorno '// ADVERTENCIA: un error introducido en'
. 'PHP 5.4 que'
. 'Afecta al controlador asignado por'
. 'Session_set_save_handler () y'
. 'Donde ignore_user_abort () es TRUE
. 'Ha sido fijado en PHP 7.'
. 'Potencialmente, esto podría romper'
. Su código de la sección "
. 'ciertas circunstancias.' . PHP_EOL
. A ver: http://php.net/manual/en/ '
. 'Migration70.incompatible.php'
. $ Partido [0];
} Else {
devolver $ partido [0]; }},

20

¡GUAUU! libro electrónico


www.wowebook.org
Capítulo 1

4. Cualquier intento de utilizar << o >> con un operador negativa, o más allá de 64, se envuelve en una
try {xxx} catch () {} xxx bloque, buscando una ArithmeticError para ser lanzado:

// envuelve operaciones de desplazamiento de bits en try / catch '^ (\ d + \ s *


(\ <\ <| \> \>?) \ S * - \ d +)! (*.?) (.? *) $! ' =>
función (coincidencia $) {
retorno '// ADVERTENCIA: negativo y'
. 'Bit a bit de salida de rango'
. 'Operaciones de cambio a partir de ahora
. 'Lanzar una ArithmeticError'. PHP_EOL
. A ver: http://php.net/manual/en/ '
. 'Migration70.incompatible.php'
. 'tratar {' . PHP_EOL
. "\ T". $ Partido [0]. PHP_EOL
. '} Catch (\\ ArithmeticError $ e) {'
. "\ T". 'Error_log ( "Archivo:"
. $ E-> getFile ()
. "Mensaje:". $ E-> getMessage ());'
. '}'. PHP_EOL;
},

PHP 7 ha cambiado cómo se manejan los errores. En algunos casos, los errores se mudaron a
una clasificación similar como excepciones, y pueden ser capturados! Ambos Error y el Excepción
clase implemente el throwable
interfaz. Si se desea capturar o bien una Error o un Excepción, captura
Throwable.

5. A continuación, el convertidor vuelve a escribir cualquier uso de call_user_method * (), que tiene
ha eliminado en PHP 7. Estos son reemplazados con el uso del equivalente call_user_ func * ():

// reemplaza "call_user_method ()" con // "call_user_func ()"

'Call_user_method \ ((*), (*) (*) \.?.?.?) (\ B |;)!' =>


función (coincidencia $) {
$ Params = $ partido [3] ?? '';
retorno '// ADVERTENCIA: call_user_method () tiene'
. 'Sido retirado de PHP 7'. PHP_EOL
. 'Call_user_func (['. Trim ($ partido [2]). ''
. trim ($ partido [1]). ']'. $ Params. ');';
},

// reemplaza "call_user_method_array ()" // con


"call_user_func_array ()"
'Call_user_method_array \ ((*), (*), (*) \.?.?.?) (\ B |;)!' =>

21

¡GUAUU! libro electrónico


www.wowebook.org
La construcción de una Fundación

función (coincidencia $) {
retorno '// ADVERTENCIA: call_user_method_array ()'
. 'Ha sido retirado de PHP 7'
. PHP_EOL
. 'Call_user_func_array (['
. trim ($ partido [2]). ''
. trim ($ partido [1]). '],'
. $ Partido [3]. ');';
},

6. Por último, cualquier intento de utilizar preg_replace () con el / mi modificador se reescribe usando
un preg_replace_callback ():

'! ^ (. *?) Preg_replace. *? / E (. *?) $!' => Función


(coincidencia $) {
$ Última strrchr = ($ partido [2], '');
$ Arg2 = substr ($ partido [2], 2, -1 * (strlen ($ última))); $ Arg1 = substr ($ partido [0],

strlen ($ partido [1]) + 12,


- 1 * (strlen ($ arg2) + strlen ($ última)));
$ Arg1 = trim ($ arg1, '(');
$ Arg1 = str_replace ( '/ E', '/', $ arg1); $ Arg3 = '// ADVERTENCIA: preg_replace () "/
e" modificador
. 'Ha sido retirado de PHP 7'
. PHP_EOL
. $ Partido [1]
. 'Preg_replace_callback ('
. $ arg1
. 'Función ($ m) {return'
. str_replace ( '$ 1', '$ m', $ partido [1])
. trim ($ arg2, '"\ ''). ';}',
. trim ($ última, '');
str_replace ( '$ 1', '$ m', $ arg3) return; },

// array final],

// esto es el blanco de los contenidos transformaciones $

);
// devuelve el resultado como una implosión de retorno
de cadena ( '', $ resultado); }

22

¡GUAUU! libro electrónico


www.wowebook.org
Capítulo 1

Cómo funciona…

Para utilizar el convertidor, ejecute el código siguiente desde la línea de comandos. Tendrá que suministrar el nombre de archivo del

código de PHP 5 que va a escanear como un argumento. Este bloque de código, chap_01_php5_to_php7_code_converter.php, ejecutar

desde la línea de comandos, llama al convertidor:

<? Php
// obtener nombre de archivo para escanear desde la línea de comandos $
archivo = $ argv [1] ?? '';

if (! $ filename) {
echo 'Sin nombre proporcionado'. PHP_EOL; 'Uso:' eco.
PHP_EOL;
__FILE__ eco. '<Nombre de archivo'. PHP_EOL; salida; }

// carga automática de clase de instalación

requerir __DIR__. '/../Application/Autoload/Loader.php';

// Añadir directorio actual a la ruta


Aplicación \ carga automática \ cargador :: init (__ DIR__ '/ ..'.);

// obtener la clase "análisis en profundidad"

$ = Convertir nueva aplicación \ Analizar \ Convert (); echo $ convert->


Barrido ($ archivo); eco PHP_EOL;

Ver también

Para obtener más información sobre los cambios hacia atrás incompatibles, consulte http: // php. net /
manual / en / migration70.incompatible.php.

23

¡GUAUU! libro electrónico


www.wowebook.org
¡GUAUU! libro electrónico
www.wowebook.org

También podría gustarte