Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

371
Visualizações
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 Respostas
Responde à pergunta

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 Relatório

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda