---
title: 'PHP 7.2 from 7.1: object Type, Widening, Libsodium & Migration | DevSense'
description: 'Guía de actualización de PHP 7.2: indicación de tipo object, ampliación del tipo de parámetro, volcados de depuración PDO, LDAP EXOP, API sockets addrinfo, libsodium—además de BC (count, get_class, conversiones object/array) y mcrypt eliminado a PECL.'
faq:
    - { question: "¿Qué es la nueva indicación de tipo 'object' en PHP 7.2?", answer: "PHP 7.2 introduce una indicación de tipo genérica 'object' para los parámetros de funciones y los tipos de retorno, lo que permite pasar o devolver cualquier instancia de objeto." }
    - { question: '¿Qué es la ampliación del tipo de parámetro (parameter type widening)?', answer: 'La ampliación del tipo de parámetro permite que un método de una subclase omita las indicaciones de tipo en sus parámetros que están presentes en el método de la clase o interfaz padre, alineándose con la contravarianza del Principio de Sustitución de Liskov (LSP).' }
    - { question: "¿Cómo cambia la función 'count()' en PHP 7.2?", answer: "Llamar a 'count()' en tipos no contables (como null, enteros, booleanos o clases que no implementan la interfaz Countable) ahora genera un E_WARNING." }
    - { question: '¿Qué pasó con la extensión mcrypt en PHP 7.2?', answer: 'La extensión mcrypt se ha eliminado por completo del núcleo de PHP y se ha movido a PECL. Se anima a los desarrolladores a migrar a OpenSSL o a la nueva extensión Sodium integrada.' }
published: '2026-05-31'
---
# PHP 7.2: Características Principales

¿Qué pasaría si al verificar la longitud de una variable de repente se inundaran sus registros de errores con advertencias? PHP 7.2 introduce una higiene estricta en las advertencias de count, exponiendo miles de errores latentes en los que los desarrolladores llamaban a `count()` en tipos no contables como null o boolean. Ajusta el desarrollo diario con la indicación de tipo genérica `object`, la ampliación de tipo de parámetro, la integración nativa de libsodium y una estricta higiene de advertencias de count.

## Índice
* [Tipo `object`](#object-type)
* [Ampliación del tipo de parámetro (Type widening)](#type-widening)
* [PDO: `debugDumpParams()` más rico](#pdo-debug)
* [Operaciones extendidas LDAP (EXOP)](#ldap-exop)
* [Sockets: `socket_addrinfo_*`](#sockets-addrinfo)
* [Sodium (libsodium) en el núcleo](#sodium)
* [Extensiones destacadas y stdlib](#extensions-stdlib)
* [Recetas prácticas](#practical-recipes)
* [Errores Comunes](#common-mistakes)
* [Limitaciones](#limitations)
* [Cambios incompatibles con versiones anteriores](#backward-incompatible)
* [Depreciaciones (corregir pronto)](#deprecations)
* [Otros cambios y compilación](#other-changes)
* [Quiz interactivo](#interactive-quiz)
* [Reflexiones finales](#closing-thoughts)

---

<a id="object-type"></a>
## Tipo `object`

Puede declarar **`object`** para parámetros y tipos de retorno; cualquier instancia de objeto lo cumple. Esto se empareja con las reglas de covarianza de tipo de retorno / contravarianza de parámetros a medida que PHP evolucionó a lo largo de 7.x.

```php
// src/ObjectHandler.php
function acceptsAnyObject(object $x): void 
{
    // Hacer algo con el objeto
}
```

> [!NOTE]
> ¿Sabía que? Antes de PHP 7.2, no se podían indicar tipos de objetos genéricos. Los desarrolladores tenían que confiar en las anotaciones PHPDoc o verificar manualmente con `is_object()`.

---

<a id="type-widening"></a>
## Ampliación del tipo de parámetro (Parameter type widening)

Las implementaciones pueden **omitir las indicaciones de tipo de parámetro** que aparecen en el método padre/interfaz (sigue siendo seguro para la contravarianza). **No puede** estrechar o cambiar a un tipo no relacionado en las cadenas de clases abstractas/interfaces; PHP rechazará las sobrescrituras incompatibles.

```php
// src/Logger.php
interface Logger {
    public function log(string $msg);
}

class MyLogger implements Logger {
    // El tipo de parámetro se omite (se amplía), lo cual es válido en PHP 7.2
    public function log($msg) {
        echo $msg;
    }
}
```

> [!NOTE]
> ¿Sabía que? La ampliación del tipo de parámetro permite a las librerías actualizar sus interfaces sin romper inmediatamente las implementaciones de terceros, ya que las subclases pueden omitir la indicación de tipo.

---

<a id="pdo-debug"></a>
## PDO: `debugDumpParams()` más rico

`PDOStatement::debugDumpParams()` puede mostrar el **SQL completo** enviado al servidor para las **consultas preparadas emuladas**, incluidos los valores asociados; esto es muy útil al depurar la construcción de consultas (solo cuando la emulación está activada).

```php
// src/DatabaseDebug.php
$stmt = $pdo->prepare("SELECT * FROM users WHERE status = :status");
$stmt->execute(['status' => 'active']);
$stmt->debugDumpParams();
```

---

<a id="ldap-exop"></a>
## Operaciones extendidas LDAP (EXOP)

Nuevas funciones auxiliares como **`ldap_exop()`**, **`ldap_exop_passwd()`**, **`ldap_exop_whoami()`**, **`ldap_parse_exop()`**, además de constantes como **`LDAP_EXOP_START_TLS`**—cubriendo flujos comunes de EXOP sin código de conexión LDAP manual y rudimentario.

---

<a id="sockets-addrinfo"></a>
## Sockets: `socket_addrinfo_*`

**`socket_addrinfo_lookup()`**, **`socket_addrinfo_connect()`**, **`socket_addrinfo_bind()`**, **`socket_addrinfo_explain()`** envuelven la resolución y la configuración de conexiones al estilo de **`getaddrinfo()`**—prefiera esto en lugar del análisis manual de `AF_INET` cuando necesite familias de direcciones modernas.

---

<a id="sodium"></a>
## Sodium (libsodium) en el núcleo

La extensión **Sodium** se incluye con PHP 7.2+, exponiendo las primitivas AEAD, de hashing y KDF de libsodium. Considérelo la opción por defecto para **criptografía nueva** en lugar de **mcrypt** (eliminada del núcleo—ver más abajo).

```php
// src/CryptoHelper.php
$nonce = random_bytes(SODIUM_CRYPTO_SECRETBOX_NONCEBYTES);
$key = sodium_crypto_secretbox_keygen();
$ciphertext = sodium_crypto_secretbox('message', $nonce, $key);
```

---

<a id="extensions-stdlib"></a>
## Extensiones destacadas y stdlib

* **`utf8_encode()` / `utf8_decode()`** se movieron a las **funciones de cadena del núcleo** (ya no dependen de la extensión XML).
* **`mail()` / `mb_send_mail()`** aceptan **arrays de cabeceras** además de cadenas de texto.
* **DBA** gana soporte para el backend **LMDB**.
* **GD**: **`imageantialias()`** con libgd del sistema; **`imagegd()`** almacena truecolor de manera más fiel.
* **`session_module_name('user')`** ahora lanza un **error recuperable** en lugar de fallar silenciosamente.

---

<a id="practical-recipes"></a>
## Recetas prácticas

### Proteger `count()`

```php
// src/recipes.php
if (is_array($x) || $x instanceof \Countable) {
    $n = count($x);
}
```

(`is_countable()` llega en PHP 7.3—en 7.2 use la verificación explícita.)

### Obtener clase de manera segura (`get_class()`)

```php
// src/recipes.php
$cls = is_object($obj) ? get_class($obj) : self::class;
```

---

<a id="common-mistakes"></a>
## ⚠️ Errores Comunes

Aquí tiene los fallos típicos en PHP 7.2:

### 1. Contar variables no contables
Llamar a `count()` en `null`, booleanos, enteros u objetos estándar ahora genera una advertencia (Warning).
```php
// src/BadCount.php
// Malo: Null no es contable, lanza Warning: count(): Parameter must be an array or an object that implements Countable
$data = null;
echo count($data); 
```
```php
// src/GoodCount.php
// Bueno: Verifique si la variable es contable antes de contar
$data = null;
echo (is_array($data) || $data instanceof \Countable) ? count($data) : 0;
```

### 2. Pasar `null` a `get_class()`
En versiones anteriores, `get_class(null)` devolvía el nombre de la clase desde donde se llamaba. En PHP 7.2, emite una advertencia de tipo E_WARNING.
```php
// src/BadGetClass.php
// Malo: Lanza E_WARNING si $obj es null
$className = get_class($obj); 
```
```php
// src/GoodGetClass.php
// Bueno: Proteja la llamada comprobando si la variable es un objeto
$className = is_object($obj) ? get_class($obj) : 'DefaultClass';
```

---

<a id="limitations"></a>
## Limitaciones

* **Tipo genérico `object`**: No puede especificar *qué* estructura de objeto espera; simplemente valida que el valor sea una instancia de objeto. No puede usarlo para permitir ciertas clases rechazando `stdClass` dinámicamente.
* **Integración de libsodium**: Expone funciones criptográficas de bajo nivel. Aunque es extremadamente seguro, requiere comprender conceptos criptográficos (como nonces y claves) para evitar fallos de seguridad.

---

<a id="backward-incompatible"></a>
## Cambios incompatibles con versiones anteriores

### Núcleo y tipos

* **`number_format()`** ya no devuelve **`-0`** para ciertos casos decimales límite en punto flotante.
* **Conversión de arrays/objetos con claves numéricas**: acceder a **`$obj->{0}`** / **`$obj->{'0'}`** y el acceso inverso mediante conversión **`(array)`** es **consistente** para claves de tipo entero.
* **`get_class(null)`** ahora **genera advertencias**; omita el argumento o pase un objeto.
* **`count()`** (y **`sizeof()`**) en tipos **no contables** emite una advertencia **`E_WARNING`**; el código que dependía de `count(null) === 0` dejará de funcionar correctamente.
* **`spl_autoload_register()`**: depreciación del método mágico heredado **`__autoload`**.

### Extensiones

* **La extensión MCrypt se elimina del núcleo**—instálela desde **PECL** si realmente lo necesita, pero se recomienda **migrar a OpenSSL/Sodium**.

---

<a id="deprecations"></a>
## Depreciaciones (corregir pronto)

Elementos clave:

* **`__autoload()`**—use **`spl_autoload_register()`**.
* Las palabras reservadas sin comillas (barewords) que antes generaban un **Notice** ahora emiten un **Warning** (en el futuro: `Error`).
* Funciones heredadas como **`create_function()`**, **`each()`**, **`assert()`** basado en cadenas, **`parse_str()`** con un solo argumento, el alias **`read_exif_data()`**, **`gmp_random()`**, **`png2wbmp` / `jpeg2wbmp`**.

---

<a id="interactive-quiz"></a>
## Quiz interactivo

Ponga a prueba sus conocimientos sobre PHP 7.2:

1. **¿Qué sucede si ejecuta `count(null)` en PHP 7.2?**
   * A) Devuelve `0` silenciosamente.
   * B) Lanza un error fatal.
   * C) Emite un `E_WARNING` y devuelve `0`.
   * D) Devuelve `false`.

   <details>
   <summary>Haga clic para ver la respuesta</summary>
   
   **Respuesta correcta: C**  
   PHP 7.2 emitirá una advertencia: `count(): Parameter must be an array or an object that implements Countable`, pero seguirá devolviendo `0` por motivos de compatibilidad hacia atrás.
   </details>

2. **¿Cuál de las siguientes afirmaciones es correcta sobre la ampliación del tipo de parámetro en PHP 7.2?**
   * A) Una clase hija puede estrechar el tipo de parámetros heredados de su clase padre.
   * B) Una clase hija puede omitir por completo las indicaciones de tipo de parámetro presentes en la clase padre.
   * C) Requiere el uso de la palabra clave `widen`.
   * D) Solo es aplicable a los tipos de retorno.

   <details>
   <summary>Haga clic para ver la respuesta</summary>
   
   **Respuesta correcta: B**  
   Bajo la ampliación de tipo de parámetro, las clases hijas que sobrescriben métodos tienen permitido omitir las indicaciones de tipo definidas en los métodos de la clase padre (ampliando el rango de entrada aceptado).
   </details>

3. **¿Cuál es el reemplazo recomendado para la extensión mcrypt que ha sido depreciada?**
   * A) Crypt
   * B) OpenSSL o Sodium
   * C) md5
   * D) Hash

   <details>
   <summary>Haga clic para ver la respuesta</summary>
   
   **Respuesta correcta: B**  
   Sodium ahora se incluye en el núcleo de PHP 7.2, y OpenSSL es la alternativa estándar para criptografía heredada, haciendo que mcrypt quede obsoleta.
   </details>

---

<a id="closing-thoughts"></a>
## Reflexiones finales

PHP 7.2 es un buen momento para **eliminar las rutas de código de mcrypt**, buscar llamadas a **`count(`** en valores potencialmente nulos y corregir **`get_class(null)`**. Después continúe hacia PHP 7.3+ para disfrutar de `JsonException`, `is_countable()` y mejoras en la usabilidad de heredoc.