Mientras probaba si mi script php es compatible con php-8 , me quedé atascado en el siguiente código:
function getDir($a, $o = 2) { $d = Floor($a / $o); return ($d % 2 === 0); }Antes de php-8 , esto funcionaba bien, sin embargo, en php-8 arroja:
Error fatal: no se puede volver a declarar getDir()
Después de buscar por un tiempo, encontré que php-8 introdujo un nuevo alias para dir() :
/** @param resource $context */ function getdir(string $directory, $context = null): Directory|false {}dir() no menciona el aliasRespuesta corta: Whoopsie
Respuesta larga: https://externals.io/message/113982
Por el momento, planeo que esto desaparezca para la versión 8.0.5. Lo siento por la interrupción y gracias a Chris por presentar un informe de error sobre esto: https://bugs.php.net/bug.php?id=80914
Esto resultó ser mucho más interesante de lo que esperaba.
La respuesta corta es que getdir() realmente es nuevo en PHP 8.0.0, pero esto fue un error, y probablemente será eliminado en 8.0.4 u 8.0.5.
La parte interesante es que getdir() no es de hecho un alias, sino el nombre real de la función internamente; es solo que hasta la versión 8.0, solo era accesible a través de su alias, dir(). Para explicar eso, tenemos que retroceder más de 20 años...
La función dir() se agregó en PHP 3.0. Por alguna razón, quizás un cambio de nombre de última hora, la función C que la implementó se llamó "php3_getdir" y no "php3_dir". Eso no importó, porque cada nombre de función se asignó explícitamente, así:
function_entry php3_dir_functions[] = { {"opendir", php3_opendir, NULL}, {"closedir", php3_closedir, NULL}, {"chdir", php3_chdir, NULL}, {"rewinddir", php3_rewinddir, NULL}, {"readdir", php3_readdir, NULL}, {"dir", php3_getdir, NULL}, {NULL, NULL, NULL} };No mucho después, llegó PHP 4 y las definiciones de funciones pasaron a usar macros para hacer coincidir el nombre de C con el nombre de PHP. Dado que el nombre de la función y la implementación no coincidían, "dir" terminó etiquetado como un "alias"; pero no se agregó ninguna entrada adicional para "getdir":
static zend_function_entry php_dir_functions[] = { PHP_FE(opendir, NULL) PHP_FE(closedir, NULL) PHP_FE(chdir, NULL) PHP_FE(rewinddir, NULL) PHP_FE(readdir, NULL) PHP_FALIAS(dir, getdir, NULL) {NULL, NULL, NULL} };Un alias sin un objetivo realmente no tiene sentido (y había una macro PHP_NAMED_FE solo para este propósito) pero funcionó, así que supongo que nadie se dio cuenta.
De hecho, a través de todos los cambios de PHP 5 y PHP 7, siguió funcionando, básicamente con la misma línea de código C hasta 7.4 .
PHP_FALIAS(dir, getdir, arginfo_dir)Sin embargo, durante el trabajo en PHP 8, se construyó un sistema para generar información de funciones internas a partir de "stubs" de PHP. Como parte de esto , se agregaron stubs para todos los alias de funciones , y getdir() terminó con su propio stub :
/** @param resource $context */ function getdir(string $directory, $context = null): Directory|false {} /** * @param resource|null $context * @alias getdir */ function dir(string $directory, $context = null): Directory|false {}Esto luego se usó para volver a generar las definiciones de C, y finalmente getdir() tenía su propia entrada de función
ZEND_FE(getdir, arginfo_getdir) ZEND_FALIAS(dir, getdir, arginfo_dir)Esto hizo que getdir() fuera un nombre de función incorporado real, y significaba que no podía tener una función con el mismo nombre.
A partir de ahí han pasado cuatro cosas: