Great work. Thank you for allowing Lists to return on foreach.
El soporte para generadores ha sido añadido mediante la palabra reservada yield. Los generadores proporcionan una manera sencilla de implementar iteradores simples sin la carga adicional o la complejidad de implementar una clase que implemente la interfaz Iterator.
Un ejemplo sencillo que reimplementa la función range() como un generador (al menos para valores positivos de paso):
<?php
function xrange($inicio, $límite, $paso = 1) {
for ($i = $inicio; $i <= $límite; $i += $paso) {
yield $i;
}
}
echo 'Números impares de un dígito: ';
/*
* Observe que nunca se crea o devuelve un array,
* lo que ahorra memoria.
*/
foreach (xrange(1, 9, 2) as $número) {
echo "$número ";
}
echo "\n";
?>
El resultado del ejemplo sería:
Números impares de un dígito: 1 3 5 7 9
Los bloques try-catch ahora admiten un bloque finally para el código que debería ejecutarse pese a si se ha lanzado una excepción o no.
Se ha añadido una nueva API de hash de contraseñas que facilita el empleo de hash de forma segura y administrar contraseñas usando la misma biblioteca subyacente como crypt() de PHP. Véase la documentaicón para password_hash() para más detalles.
La esctructura de control foreach ahora admite el desempaquetamiento de arrays anidados en variables por separado mediante el constructor list(). Por ejemplo:
<?php
$array = [
[1, 2],
[3, 4],
];
foreach ($array as list($a, $b)) {
echo "A: $a; B: $b\n";
}
?>
El resultado del ejemplo sería:
A: 1; B: 2 A: 3; B: 4
Hay disponible más información en la página del manual de foreach.
Ahora se admite pasar una expresión arbitraria en lugar de una variable a empty(). Por ejemplo:
<?php
function siempre_falso() {
return false;
}
if (empty(siempre_falso())) {
echo "Esto se imprimirá.\n";
}
if (empty(true)) {
echo "Esto no se imprimirá.\n";
}
?>
El resultado del ejemplo sería:
Esto se imprimirá.
Los arrays y los literales de tipo string ahora se pueden derreferenciar directamente para acceder a elementos y caracteres individuales:
<?php
echo 'Derreferencición de array: ';
echo [1, 2, 3][0];
echo "\n";
echo 'Derreferencición de string: ';
echo 'PHP'[0];
echo "\n";
?>
El resultado del ejemplo sería:
Derreferencición de array: 1 Derreferencición de string: P
Es posible usar NombreClase::class para obtener el nombre de clase completamente cualificado de NombreClase. Por ejemplo:
<?php
namespace Espacio\De\Nombres;
class NombreClase {}
echo NombreClase::class;
echo "\n";
?>
El resultado del ejemplo sería:
Espacio\De\Nombres\NombreClase
La caché de códigos de operación de Zend Optimiser+ se ha añadido a PHP como la nueva extensión OPcache. OPcache mejora el rendimiento de PHP almacenando código de byte de un script precompilado en la memoria compartida, eliminando así la necesidad por parte de PHP de cargar y analizar scripts en cada petición. Véase las instrucciones de instalación para más detalles de cómo habilitar y usar OPcache.
foreach ahora admite claves de cualquier tipo. Aunque las claves no escalares no pueden darse en arrays nativos de PHP, es posible que Iterator::key() devuelva un valor de cualquier tipo, por lo que ahora serán tratados correctamente.
La SAPI del manejador de Apache 2.4 ahora está soportada en Windows.
Se han realizado varias mejoras a la extensión GD, las cuales son:
Yield is awesome... it's starts to look like a real language now ;-)
class myList {
public $list;
public function __construct($list) {
$this->list = $list;
}
public function select(...$keys) {
$keys_array = array_fill_keys($keys, null);
$items = $this->list;
foreach($items as $item) {
yield array_merge($keys_array, array_intersect_key($item, $keys_array));
}
}
}
After PHP 5.5, foreach with reference in arbitrary array does not generate an error:
foreach ([1, 2, 3, 4] as $key => &$value) {
$value = $value . ' R$';
}
before 5.4, will generate "Cannot create references to elements of a temporary array expression"