PHP 8 ya está disponible y en esta serie te estamos hablando de sus novedades una a una y de forma detallada. En esta cuarta entrega te explicaré qué es el operador Nullsafe y porqué será muy util para el desarrollo de tus aplicaciones web.

En la serie sobre el Patrón Null Object en Laravel hablamos del helper optional que nos permite protegernos del error «trying to get property of non-object».

Veamos un ejemplo extraído de dicha serie:

<div class="card-body">
    <p>Bio: {{ $user->profile->bio }}</p>
    <p>Website: {{ $user->profile->website }}</p>
</div>

Aquí queremos mostrar la bio y el website del perfil del usuario. Muy sencillo en apariencia, pero si el usuario no tiene perfil obtendremos el error:

«trying to get property of non-object»

Por lo tanto debemos programar defensivamente:

<div class="card-body">
    <p>Bio: {{ $user->profile ? $user->profile->bio : '' }}</p>
    <p>Website: {{ $user->profile ? $user->profile->website : '' }}</p>
</div>

Ahora el código funciona pero ya no es tan limpio como antes. Es por esto que Laravel incluye el helper optional:

<div class="card-body">
    <p>Bio: {{ optional($user->profile)->bio }}</p>
    <p>Website: {{ optional($user->profile)->website : '' }}</p>
</div>

La idea es agrupar cualquier objeto que pueda ser opcional, en este caso $user->profile en esta llamada al helper optional y así prevenimos el error si el usuario no tiene perfil.

Pero el helper optional es un poco de «magia» (de hecho internamente usa los métodos mágicos de PHP) y nunca puedo evitar pensar en el rendimiento (aunque la diferencia no es para nada notable) y en características que incluyen otros lenguajes. Hasta ahora.

PHP 8 incluye un nuevo operador llamado Nullsafe que soluciona este problema:

<div class="card-body">
    <p>Bio: {{ $user->profile?->bio }}</p>
    <p>Website: {{ $user->profile?->website : '' }}</p>
</div>

Si el usuario tiene un perfil el código funcionará como antes, sino, no se intentará leer la propiedad (bio o website) y simplemente se retornará null.

Podemos encadenar métodos y propiedades con el uso del Nullsafe Operator, aunque ten cuidado de no violar mucho la Ley de Demeter:

<?php
$country = $session?->user?->getAddress()?->country;

Si la variable $session, la propiedad user o el método getAddress() retorna null la cadena se rompe y el código retorna null en vez de provocar un error.

Puedes usar Patrones de Diseño para crear un código más limpio usando la programación orientada a objetos con PHP.

Únete a nuestra comunidad en Discord y comparte con los usuarios y autores de Styde, 100% gratis.

Únete hoy

Regístrate hoy en Styde y obtén acceso a todo nuestro contenido.

Lección anterior Nueva expresión MATCH de PHP 8 (reemplaza tus sentencias SWITCH...CASE) Lección siguiente Cambios a la comparación no estricta entre cadenas y números en PHP 8