Todo sobre PHP, en español.
La mayoría de la gente llega aquí buscando qué hace un símbolo que acaba de ver en el código de otro. Esa parte está entera y ordenada. Y después, las dos cosas donde equivocarse en PHP no da un error sino una brecha: las contraseñas y las dependencias.
10 artículos3 pistas
Qué hace ese símbolo
La referencia completa primero y luego uno por operador, porque así es como llega la gente: buscando qué significa exactamente lo que acaba de ver en el código de otro.
Todos los operadores de PHP
El índice de todos: aritméticos, de asignación, comparación, lógicos, cadena, incremento, bit a bit, ternario y null coalescing, con ejemplos de cada uno.
[Referencia][Todos]7 min de lecturaLeerOperador ternario en PHP
El más buscado del cluster. La sintaxis, el Elvis (?:), su relación con ??, cuatro casos reales, cuándo conviene un if o un match, y por qué anidarlo sale mal.
[?:][Elvis][match]5 min de lecturaLeer== vs === en PHP: igualdad suelta vs estricta
La comparación que más bugs causa: conversión de tipos, qué cambió en PHP 8, los gotchas de switch y de in_array, y cómo comparar arrays y objetos.
[==][===][PHP 8]5 min de lecturaLeerNull coalescing en PHP: el operador ?? y ??=
Valores por defecto sin warnings con ?? y su versión de asignación ??=, el encadenamiento, y la diferencia con el ternario que casi nadie explica bien.
[??][??=][isset]4 min de lecturaLeerOperador spaceship (<=>) en PHP
El operador nave espacial (<=>): qué devuelve exactamente y su uso estrella, ordenar arrays con usort en ascendente, descendente y por varios criterios.
[<=>][usort][Orden]3 min de lecturaLeer
Contraseñas y dependencias
Las dos cosas de un proyecto PHP donde equivocarse no da un error, da una brecha: cómo se guardan las contraseñas y qué código acaba realmente instalado en producción.
password_hash y bcrypt
bcrypt y Argon2id, el parámetro cost, la anatomía del hash $2y$, el límite de 72 bytes que trunca en silencio y por qué md5 no es una opción.
[password_hash][bcrypt][Argon2id]10 min de lecturaLeerLa importancia del archivo composer.lock en PHP
Qué hace el composer.lock y por qué commitearlo no es opcional: es la diferencia entre que producción instale lo que probaste o lo que salió esta mañana.
[composer.lock][Reproducibilidad]3 min de lecturaLeerComposer 2.10: bloqueo de malware y políticas de dependencias
Bloqueo de malware nativo, el objeto config.policy unificado para advisories y paquetes abandonados, e inmutabilidad de versiones estables.
[Composer 2.10][Malware][Advisories]9 min de lecturaLeer
Dos piezas para código que aguanta
Ni son urgentes ni las busca nadie por su nombre, y aun así son las que se notan en un proyecto que crece: cómo estructurar familias de objetos y cómo no comerse la memoria.
Entendiendo el patrón Abstract Factory
El patrón Abstract Factory explicado sobre un ejemplo que se sostiene, para cuando necesitas crear familias de objetos sin acoplar el código a sus clases concretas.
[Patrones][Arquitectura]4 min de lecturaLeerUso Eficiente de Memoria en PHP con WeakMaps
WeakMap resuelve el caché que mantiene vivos objetos que deberían haberse liberado. Poco conocido y exactamente lo que necesitas cuando la memoria no baja.
[WeakMap][Memoria][GC]2 min de lecturaLeer
Hacia dónde se sigue
PHP casi nunca se usa solo. Estas dos guías son los caminos naturales desde aquí, según si lo tuyo es el framework o los agentes.
Preguntas frecuentes
¿Cuál es la diferencia entre == y === en PHP?
== compara valores después de convertir tipos, === compara valor y tipo sin convertir nada. La regla práctica es usar === por defecto y == solo cuando la conversión sea exactamente lo que quieres, que es menos veces de las que parece. PHP 8 cambió parte de esas conversiones, y ese cambio está cubierto en el post de igualdad.
¿Cuándo uso el ternario y cuándo ??
El ternario evalúa una condición; ?? comprueba si algo es null o no existe. Si lo que quieres es un valor por defecto para una clave que puede faltar, ?? es la respuesta y además no lanza warning. Si hay una condición de verdad que decidir, es el ternario.
¿Cómo se hashean contraseñas en PHP?
Con password_hash y password_verify, nunca con md5 ni sha1. password_hash elige el algoritmo por ti (bcrypt por defecto, Argon2id disponible) y mete la sal dentro del propio hash. El detalle que sorprende es el límite de 72 bytes de bcrypt, que trunca sin avisar.
¿Hay que commitear el composer.lock?
Sí, siempre, en aplicaciones. Es lo que garantiza que producción instale exactamente las versiones que probaste. En una librería es distinto: ahí el lock no se publica, porque las versiones las resuelve el proyecto que la consume.
¿Esta guía sirve para Laravel?
Sirve para el PHP que hay debajo, que es el mismo. Lo específico del framework (Eloquent, rutas, Blade, deploy) está en la guía de Laravel desde cero, que es un curso y se lee en orden, al contrario que esta página.
Empieza por el símbolo.
Si has llegado buscando qué significa ?? o cuál es la diferencia entre == y ===, la referencia de operadores tiene los ocho grupos con ejemplos de cada uno.