PHP · Referencia y buenas prácticas

# 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ículos·3 pistas

[Ver todos los operadores](https://www.angelcruz.dev/post/operadores-php)

Operadores

## 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](https://www.angelcruz.dev/post/operadores-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.](https://www.angelcruz.dev/post/operadores-php)

  [\[Referencia\]\[Todos\]](https://www.angelcruz.dev/post/operadores-php)

  [6 min de lecturaLeer](https://www.angelcruz.dev/post/operadores-php)
- ### [Operador ternario en PHP](https://www.angelcruz.dev/post/el-operador-ternario-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.](https://www.angelcruz.dev/post/el-operador-ternario-php)

  [\[?:\]\[Elvis\]\[match\]](https://www.angelcruz.dev/post/el-operador-ternario-php)

  [5 min de lecturaLeer](https://www.angelcruz.dev/post/el-operador-ternario-php)
- ### [== vs === en PHP: igualdad suelta vs estricta](https://www.angelcruz.dev/post/igual-vs-identico-php)
  [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.](https://www.angelcruz.dev/post/igual-vs-identico-php)

  [\[==\]\[===\]\[PHP 8\]](https://www.angelcruz.dev/post/igual-vs-identico-php)

  [5 min de lecturaLeer](https://www.angelcruz.dev/post/igual-vs-identico-php)
- ### [Null coalescing en PHP: el operador ?? y ??=](https://www.angelcruz.dev/post/null-coalescing-php)
  [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.](https://www.angelcruz.dev/post/null-coalescing-php)

  [\[??\]\[??=\]\[isset\]](https://www.angelcruz.dev/post/null-coalescing-php)

  [4 min de lecturaLeer](https://www.angelcruz.dev/post/null-coalescing-php)
- ### [Operador spaceship (<=>) en PHP](https://www.angelcruz.dev/post/operador-spaceship-php)
  [El operador nave espacial (<=>): qué devuelve exactamente y su uso estrella, ordenar arrays con usort en ascendente, descendente y por varios criterios.](https://www.angelcruz.dev/post/operador-spaceship-php)

  [\[<=>\]\[usort\]\[Orden\]](https://www.angelcruz.dev/post/operador-spaceship-php)

  [3 min de lecturaLeer](https://www.angelcruz.dev/post/operador-spaceship-php)

Seguridad

## 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](https://www.angelcruz.dev/post/hashing-passwords-con-php)
  [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.](https://www.angelcruz.dev/post/hashing-passwords-con-php)

  [\[password\_hash\]\[bcrypt\]\[Argon2id\]](https://www.angelcruz.dev/post/hashing-passwords-con-php)

  [10 min de lecturaLeer](https://www.angelcruz.dev/post/hashing-passwords-con-php)
- ### [La importancia del archivo composer.lock en PHP](https://www.angelcruz.dev/post/importancia-composer-lock-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.](https://www.angelcruz.dev/post/importancia-composer-lock-php)

  [\[composer.lock\]\[Reproducibilidad\]](https://www.angelcruz.dev/post/importancia-composer-lock-php)

  [3 min de lecturaLeer](https://www.angelcruz.dev/post/importancia-composer-lock-php)
- ### [Composer 2.10: bloqueo de malware y políticas de dependencias](https://www.angelcruz.dev/post/composer-2-10-bloqueo-malware-politicas-dependencias)
  [Bloqueo de malware nativo, el objeto config.policy unificado para advisories y paquetes abandonados, e inmutabilidad de versiones estables.](https://www.angelcruz.dev/post/composer-2-10-bloqueo-malware-politicas-dependencias)

  [\[Composer 2.10\]\[Malware\]\[Advisories\]](https://www.angelcruz.dev/post/composer-2-10-bloqueo-malware-politicas-dependencias)

  [9 min de lecturaLeer](https://www.angelcruz.dev/post/composer-2-10-bloqueo-malware-politicas-dependencias)

Escribir mejor

## 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](https://www.angelcruz.dev/post/patron-abstract-factory-php)
  [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.](https://www.angelcruz.dev/post/patron-abstract-factory-php)

  [\[Patrones\]\[Arquitectura\]](https://www.angelcruz.dev/post/patron-abstract-factory-php)

  [4 min de lecturaLeer](https://www.angelcruz.dev/post/patron-abstract-factory-php)
- ### [Uso Eficiente de Memoria en PHP con WeakMaps](https://www.angelcruz.dev/post/ahorro-memoria-php-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.](https://www.angelcruz.dev/post/ahorro-memoria-php-weakmaps)

  [\[WeakMap\]\[Memoria\]\[GC\]](https://www.angelcruz.dev/post/ahorro-memoria-php-weakmaps)

  [2 min de lecturaLeer](https://www.angelcruz.dev/post/ahorro-memoria-php-weakmaps)

Alrededor

## 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.

### [Aprende Laravel desde cero](https://www.angelcruz.dev/laravel-fundamentals)

[El framework sobre este mismo lenguaje, en una serie que sí se lee en orden: de la instalación al deploy.](https://www.angelcruz.dev/laravel-fundamentals)

### [Agentes de IA](https://www.angelcruz.dev/guia-agentes-ia)

[Qué son, cómo se construyen, y una pista específica sobre lo que hay hoy para quien programa en PHP.](https://www.angelcruz.dev/guia-agentes-ia)

FAQ

## 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.

Por dónde empezar

## 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.

[Ver todos los operadores de PHP](https://www.angelcruz.dev/post/operadores-php)

---

Canónico HTML: [https://www.angelcruz.dev/guia-php](https://www.angelcruz.dev/guia-php)
Índice del sitio: [/sitemap.md](https://www.angelcruz.dev/sitemap.md)
