如何解决PHP 8,函数别名兼容性`getdir()` 问题
在测试我的 php 脚本是否与 php-8 兼容时,我遇到了以下代码:
function getDir($a,$o = 2) {
$d = Floor($a / $o);
return ($d % 2 === 0);
}
在 php-8 之前,这运行良好,但是,在 php-8 上它抛出:
致命错误:无法重新声明 getDir()
搜索一段时间后,我发现 php-8 为 dir()
引入了一个新别名:
/** @param resource $context */
function getdir(string $directory,$context = null): Directory|false {}
问题
- 我可以让我的代码在 php-8 不重命名函数吗?
- 是否有所有新函数别名的列表?
-
dir()
没有提到别名 - PHP 8 Release Announcement 也没有提到别名
-
解决方法
简答:哎呀
长答案:https://externals.io/message/113982
目前,我计划在 8.0.5 之前将其删除。抱歉打扰了,感谢 Chris 提交关于此的错误报告:https://bugs.php.net/bug.php?id=80914
,事实证明这比我预期的要有趣得多。
简短的回答是 getdir() 在 PHP 8.0.0 中确实是新的,但这是一个错误,它可能会在 8.0.4 或 8.0.5 中被删除。
有趣的是,getdir() 实际上并不是别名,而是函数内部的真实名称;只是在 8.0 之前,它只能通过其别名 dir() 访问。为了解释这一点,我们必须追溯到 20 多年前...
dir() 函数是在 PHP 3.0 中添加的。无论出于何种原因——也许是在最后一刻更改了名称——实现它的 C 函数被称为“php3_getdir”而不是“php3_dir”。这并不重要,因为每个函数名称都被显式映射,如下所示:
function_entry php3_dir_functions[] = {
{"opendir",php3_opendir,NULL},{"closedir",php3_closedir,{"chdir",php3_chdir,{"rewinddir",php3_rewinddir,{"readdir",php3_readdir,{"dir",php3_getdir,{NULL,NULL,NULL}
};
不久之后,PHP 4 出现了,函数定义 moved to using macros 将 C 名称与 PHP 名称相匹配。由于函数和实现的名称不匹配,“dir”最终被标记为“别名”;但没有为“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}
};
没有目标的别名实际上没有意义(并且有一个 PHP_NAMED_FE 宏就是为了这个目的)但它有效,所以我想没有人注意到。
事实上,通过 PHP 5 和 PHP 7 的所有变化,它继续工作,with basically the same line of C code right up to 7.4。
PHP_FALIAS(dir,arginfo_dir)
然而,在 PHP 8 的工作期间,构建了一个系统来从 PHP“存根”生成内部函数信息。作为此 stubs were added for all function aliases 的一部分,getdir() 以 its own 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 {}
然后用它重新生成 C 定义,最后 getdir() had its own function entry
ZEND_FE(getdir,arginfo_getdir)
ZEND_FALIAS(dir,arginfo_dir)
这导致 getdir() 成为真正的内置函数名,这意味着您不能拥有同名的函数。
从那时起,发生了四件事:
- 2021 年 3 月 29 日:0stone0 发布了这个问题。
- Chris Haas 试图追查该问题,并打开 a bug on the PHP bug tracker,认为该问题与区分大小写有关。他们还确认 getdir() 是 basic_functions.stub.php 中唯一不在手册中的别名。
- 2021 年 4 月 6 日:我以为我要快速修复文档,于是产生了兴趣,然后消失在了上面的兔子洞里。我posted my findings to the PHP internals mailing list比预期晚了一个小时上床睡觉。
- Sara Golemon(PHP 8.0 发布经理之一)回复同意应将其视为错误并在下一个 8.0.x 版本中恢复。她也posted an answer here,因为我还没有。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。