PHP_8.2_RC1_blog

Versión candidata de PHP 8.2 en los servidores de SiteGround

¡Ha llegado la época del año en que todos los buenos desarrolladores de PHP han estado esperando! Santa (ElePHPant) ha llegado temprano como de costumbre en SiteGround y ha traído muchas cosas nuevas que facilitan a los desarrolladores trabajar en sus proyectos.

Ahora mismo, PHP 8.2 se encuentra en estado Release Candidate 1 (RC1). Estamos en las últimas etapas de desarrollo y corrección de errores para esta versión y solo unos pocos proveedores de hostings como SiteGround están poniendo ahora el RC a disposición de sus clientes para que lo prueben. De hecho, la nueva versión de PHP aún no está en producción, pero es posible usar el RC para probarla.

Así que echemos un vistazo a algunas de las próximas noticias.

Nuevas funciones

Primero, echemos un vistazo a algunas de las nuevas características que serán de interés para los desarrolladores de PHP. Ésta no es una lista exhaustiva de las novedades, más bien es una lista corta de las cosas que creo que interesarán a la mayoría de los desarrolladores de PHP.

Clases readonly 

En PHP 8.1 conseguimos propiedades readonly para las clases. Esto fue un gran salto hacia adelante para muchos proyectos. Sin embargo, todavía había un pequeño agujero que necesitaba ser tapado: las clases. Sí, puedes hacer que cada propiedad escrita en una clase sea de solo lectura y listo, pero, sinceramente, esto requiere mucho trabajo y muchos desarrolladores como yo somos bastante vagos. Con PHP 8.2, podemos marcar una clase completa como readonly.

readonly class MyClass {
    public int $myProp;
    public string $myOtherProp;
    public __construct(string $myOtherProp, int $myProp) 
 {
    $this->myProp = $myProp;
    $this->myOtherProp = $myOtherProp;
  }
}

Aquí tenemos una clase definida como readonly. Tenemos 2 propiedades de la clase y ambas son inherentemente solo lectura. Las reglas de solo lectura de PHP 8.1 aún se aplican y solo puedes inicializar la propiedad una vez, después de lo cual queda configurada.

$myObj = new MyClass(‘Cal was here’,42);

Sin embargo, una vez inicializadas, ahora son inmutables.

$myObj->myProp = ‘Cal is no longer here’;
// Fatal Error: Uncaught Error: Cannot modify readonly property MyClass::myProp

Otro comportamiento de la clase readonly es que las propiedades no se pueden agregar dinámicamente a la clase. A continuación, hablamos sobre la deprecación de las propiedades dinámicas y cómo esto es algo bueno. También hay una anotación que te permite ignorar esto. Sin embargo, si marcas una clase como readonly, no se puede sobrescribir.

Constantes en Traits

Los traits (rasgos) han estado con nosotros desde PHP 5.4. Han sido durante mucho tiempo la respuesta a la “composición sobre la herencia”. Ahora los traits obtienen una característica nueva e interesante, la capacidad de definir constantes en un trait.

trait MyTrait {
    private const MY_CONSTANT = 42;
}

Ahora, si tu trait usa una constante, puedes definirlo en el trait y no tener que acordarte de definirlo en cada clase que usa el trait.

trait MyTrait {
private const MY_CONSTANT = 42;
public function meaningOfLife() : int
 {
   return self::MY_CONSTANT;
 }
}
class MyClass {
   use MyTrait;
}
$myObj = new MyClass();
echo $myObj->meaningOfLife(); // prints 42

Como todo en la vida, hay algunas reglas.

Los traits pueden definir constantes de clase. Si una clase usa ese trait, también puede definir la misma constante de clase siempre que tanto la visibilidad como el valor sean exactamente los mismos. Por lo tanto, el ejemplo anterior funciona, pero el siguiente desencadenará un error fatal.

trait MyTrait {
private const MY_CONSTANT = 42;
public function meaningOfLife() : int
 {
   return self::MY_CONSTANT;
 }
}
class MyClass {
    use MyTrait;
    public const MY_CONSTANT = 42;
}

Aún así, incluso con las reglas que debes seguir, éste es un verdadero paso hacia adelante. Los traits son una excelente manera de compartir código entre clases y ahora son aún más autónomos.

Extensión aleatoria 5.x + mejora de extensión aleatoria

El generador de números aleatorios de PHP original todavía está en el código base. Nunca ha sido genial y es absolutamente inútil para usos criptográficos. En PHP 7, conseguimos un par de funciones nuevas, random_int() y random_bytes(). Recorrieron un largo camino para solucionar los problemas, pero bajo el capó, son solo interfaces para el generador de números aleatorios del sistema operativo nativo. En ese momento, ésta era una buena solución, pero el problema es que es lento.

Ahora con PHP 8.2 no solo conseguimos un generador de números aleatorios completamente nuevo, sino que está integrado en PHP, y obtenemos una interfaz extensible orientada a objetos.

Éstos son en realidad dos RFC diferentes que estoy agrupando. Después de votar y aprobar la primera “Extensión aleatoria 5.x”, resultó que había algunos problemas con ella. Se preparó y votó una segunda RFC, “Mejora de extensión aleatoria”, para abordar los problemas encontrados con la primera.

El resultado final es un nuevo conjunto de clases que nos brinda mejores números pseudoaleatorios en PHP.

Si bien estamos obteniendo varios generadores de números aleatorios (RNG) nuevos, para simplificar, hablaré sobre la nueva clase Random\Engine\Secure.

$engine = new Random\Engine\Secure();
$randomString = $engine->generate(); // a random binary string
echo bin2hex($randomString); 

Ahora, si queremos hacer algo como ordenar una matriz, necesitamos uno de los nuevos objetos Randomizer.

$randomizer = new Random\Randomizer($engine);
$items = range(1, 10);
$randomizedItems = $randomizer->shuffleArray($items);
print_r($randomizedItems);

En el ejemplo anterior, usamos el motor Secure. El motor Secure no acepta una semilla (seed) y siempre generará una cadena que no se puede reproducir. Los motores que te permiten especificar una semilla producirán los mismos resultados cada vez que uses la misma semilla.

La clase Randomizer también proporciona muchos otros métodos que son realmente lo que buscan los desarrolladores de PHP.

  • getInt() : int
    This replaces the old mt_rand() function
  • getInt(int $min, int $max) : int
    This replaces both the old mt_rand() function as well as the newer random_int() function.
  • getBytes(int length): string
    This replaces the random_bytes() function 
  • shuffleArray(array $array): array
    This replaces the old shuffle_array() function
  • shuffleString(string $string): string
    This replaces the old str_shuffle() function

Entre otras cosas, dado que esto reúne todas las características de aleatorización en un área del motor, agiliza el código principal y facilitará las mejoras adicionales.

Gracias por todo y seguimos adelante

Todas las cosas buenas llegan a su fin y eso incluye algunas características y comandos de PHP. Echemos un vistazo a un par de deprecaciones importantes que, si no tienes cuidado, terminarán causándote problemas.

Propiedades dinámicas obsoletas 

A primera vista, parece que esto va a ser un gran problema. Desde que PHP obtuvo el modelo de objeto actual, ha sido posible agregar propiedades a un objeto en cualquier momento. Ahora alguien piensa que este comportamiento es algo malo. (PISTA: Esto siempre ha sido algo malo, pero muchos desarrolladores se han aprovechado de ello).

class MyClass {
  public string $name;
}
$myObj = new MyClass():
$myObj->nmae = ‘Cal Evans’;

Ten en cuenta que he escrito mal el nombre (name) de la propiedad. Sé que probablemente soy el único desarrollador que ha escrito mal el nombre de una propiedad, pero en PHP cuando sucede, obtengo una nueva propiedad en el objeto y la propiedad original permanece sin cambios. Esa no era mi intención.

Comenzando con PHP 8.2, esto emitirá un DEPRECATED WARNING (ADVERTENCIA DE DEPRECACIÓN).

Hay 3 excepciones a esta nueva regla. 

  1. Cualquier instancia de StdClass aún podrá aceptar propiedades dinámicas.
  2. Cualquier clase con métodos __get() y __set() todavía aceptará cualquier propiedad.
  3. Cualquier clase que tenga la anotación del compilador #[AllowDynamicProperties]y cualquier subclase permitirá establecer propiedades dinámicas.

Entonces, aunque no todo está perdido para aquellos que dependen de esta “característica” de PHP, si todavía vas a usarla, tendrás que hacer algunos cambios en tu código.

La buena noticia es que todo lo que sucederá en este momento es que la advertencia emitida aparecerá en los archivos de registro. Por lo tanto, si bien puede llenar tus archivos de registro recordándote que necesitas arreglar esto, PHP 8.2 no romperá tu código. Eso sucederá en PHP 9.0 cuando la advertencia, y la capacidad de agregar propiedades dinámicas automáticamente, se elimine de PHP.

(Parcial) Deprecación ${} string interpolation

Esta es otra deprecación que al principió pensé que iba a ser un gran problema. Resulta que probablemente no afectará a muchos desarrolladores.

Hay 4 formas de implementar la sintaxis “{$variableName}”, 2 que tienen sentido y dos que no. Las dos que no lo tienen, se van. Veámoslas juntos:

echo “$meaningOfLife”;

Con diferencia, esta es la versión más común de interpolación de cadenas. Simplemente coloca la variable en una cadena con comillas dobles. Si lo haces así, entonces todo bien, esta es una de las dos formas que se quedan.

echo “{$meaningOfLife}”;
echo “{$dogulasAdams->meaningOfLife()}”;

Siempre he considerado esta manera de la “vieja escuela”. Sí, solíamos hacerlo en el pasado, pero no lo he hecho de esta manera en mucho tiempo. Aún así, funciona, es limpio y es fácil de entender. Esta es la otra forma que se queda.

Este es también el único método que te permite usar propiedades y métodos de objeto. Por lo tanto, si deseas usar la interpolación de cadenas con un objeto, necesitarás este método.

echo “${meaningOfLife}”;

Esta se va a ir. Sí, hace lo mismo que las dos primeras, pero es un poco más confuso porque $ está fuera de las llaves.

$fourtyTwo = 42;
$meaningOfLife = ‘fourtyTwo’;
echo “${meaningOfLife}”;

Finalmente, tenemos la forma en que puedes usar “variables variables” desde dentro de la interpolación de cadenas. Esto es simplemente demasiados niveles de indirección. En el código de arriba, eventualmente llegamos al punto donde hacemos echo out 42, pero tomamos el camino más largo.

A partir de PHP 8.2, las dos últimas estructuras emitirán una ADVERTENCIA DE DEPRECACIÓN en tus archivos de registro. En PHP 9.0, dejarán de funcionar por completo y harán que tu programa no funcione (o lanzará un error que puedes detectar, pero del que probablemente no puedas recuperarte).

En resumen 

Ésta es la primera versión candidata definitiva de PHP 8.2. No la reproduzcas en ningún sitio en producción. Si quieres probarla con un sitio existente, configura un nuevo sitio de pruebas, clona tu sitio de producción en él y prueba de ese modo. Cuando hayas terminado, puedes simplemente eliminarlo.

Mientras trabajas en tu nuevo entorno de prueba, comprueba los archivos de registro después de cada prueba. Asegúrate de que no haya errores y busca nuevas advertencias.

Si PHP 8.2 es algo así como PHP 8.0 y PHP 8.1, no espero que el código PHP moderno tenga ningún problema con él. Afortunadamente, los ingenieros de SiteGround hacen que sea increíblemente fácil para ti probar las cosas para asegurarte de que tu sitio pueda funcionar lo más rápido posible con PHP 8.2.

Hablando de rendimiento, PHP 8.2 aún no se ha evaluado adecuadamente, pero esperamos que cada versión de PHP sea un poco más rápida que las versiones anteriores. Con los cambios en el sistema CSPRNG y otras cosas como eliminar la antigua libmysql, es una apuesta segura que esta versión será más rápida que PHP 8.1.

Mientras pruebas, clonas y observas los resultados, asegúrate de tomarte el tiempo para tuitear un enorme GRACIAS a todas las personas que hicieron posible este lanzamiento. Muestra tu aprecio en twitter.com/php_net.

Cal Evans

Evangelista PHP

Una de las personas más admiradas de la comunidad PHP, que ha dedicado más de 16 años a construir la increíble comunidad PHP y asesorar a la próxima generación de desarrolladores. Nos sentimos extremadamente honrados de que él también sea un amigo muy especial de SiteGround.

Iniciar discusión

Artículos relacionados

Ha llegado el momento de practicar

Ha llegado el momento de practicar

Elige el proveedor de alojamiento que te ayude a comenzar de manera fácil, a construir rápidamente y a crecer fuerte. Está libre de riesgos con nuestra garantía de devolución de dinero de 30 días.