Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

373
Vistas
PHP 8, función de compatibilidad de alias `getdir()`

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()

3v4l.org


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 {}

php-src línea 709

Preguntas

  • ¿Puedo hacer que mi código funcione en php-8 sin cambiar el nombre de la función?
  • ¿Hay una lista de todos los alias de funciones nuevas?
    • dir() no menciona el alias
    • El anuncio de lanzamiento de PHP 8 tampoco menciona el alias
over 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

Respuesta 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

over 4 years ago · Santiago Trujillo Denunciar

0

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:

  • 29 de marzo de 2021: 0stone0 publicó esta pregunta.
  • Chris Haas trató de localizar el problema y abrió un error en el rastreador de errores de PHP , pensando que el problema estaba relacionado con la distinción entre mayúsculas y minúsculas. También confirmaron que getdir() era el único alias en basic_functions.stub.php que no estaba en el manual.
  • 6 de abril de 2021: Pensando que iba a corregir rápidamente la documentación, me interesé y desaparecí por la madriguera de arriba. Publiqué mis hallazgos en la lista de correo interna de PHP y me acosté una hora más tarde de lo que pretendía.
  • Sara Golemon (una de las gerentes de lanzamiento de PHP 8.0) respondió y acordó que debería tratarse como un error y revertirse en el próximo lanzamiento de 8.0.x. Ella también publicó una respuesta aquí ya que yo aún no lo había hecho.
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda