named()给出未记录的返回值NULL

时间:2018-08-03 08:48:53

标签: php php-7.2

从PHP7.0更新到PHP7.2后,某些代码停止工作,我不明白为什么:

$res = rename($tmpfile, $output_file);
if ($res !== true) {
   throw new Exception("Unable to rename temporary file");
}

在php7.2中,触发了异常,尽管重命名成功完成,但文件可读性很好,没有发生任何错误。我仍然得到异常,因为返回值为NULL。我插入了一些调试代码:

$res = rename($tmpfile, $output_file);
log('Debug: $res ' . $res);
log('Debug: $res true? ' . $res === true);
log('Debug: $res type ' . gettype($res));
if ($res !== true) {
    throw new Exception("Unable to rename temporary file");
}

这将提供以下输出:

2018-08-03 10:37:39 Debug: $res 
2018-08-03 10:37:39 
2018-08-03 10:37:39 Debug: $res type NULL
2018-08-03 10:37:39 CURL_DOWNLOAD Exception: Unable to rename temporary file
#0 /var/www/formr.org/application/Library/Functions.php(1470): CURL::DownloadUrl('http://docs.goo...', '/var/www/formr....', NULL, 'GET', Array, Array)

如您所见,没有输出,类型为NULL。这是未记录的行为。 According to the php documentation的返回值只能是true或false。

我找不到任何有关此功能的行为已更改的文档。有人明白吗?

感谢帮助!

编辑:var_dump输出

$res = rename($tmpfile, $output_file);
ob_start();
var_dump($res);
$contents = ob_get_contents();
ob_end_clean();
log('Debug $res: ' . $contents);

礼物:

2018-08-03 12:37:40 Debug $res: NULL

在终端中测试rename()函数:

user$ sudo su www-data -s /bin/bash
www-data$ php -a
Interactive mode enabled

php > $old='/var/www/path/changed/filename.xlsx';
php > $new='/var/www/path/changed/newfilename.xlsx';
php > $res = rename($old, $new);
php > var_dump($res);
bool(true)

(出于隐私原因更改了文件名和路径,但我在原始文件上对其进行了测试。)

PHP版本:

$ php --version
PHP 7.2.7-0ubuntu0.18.04.2 (cli) (built: Jul  4 2018 16:55:24) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies
    with Zend OPcache v7.2.7-0ubuntu0.18.04.2, Copyright (c) 1999-2018, by Zend Technologies

已安装的PHP版本是Ubuntu 18.04随附的版本。我自己没有重新编译它。

正如我刚刚注意到的那样,该程序有两次自己的重命名功能。但是它们并不是要重命名文件,而是要重命名数据库中的某些内容。

它们都只有一个参数。 PHP不支持按参数数量重载或区分,因此是否可能会有干扰?到目前为止,这还不是问题。而且,由于该文件实际上已被重命名,所以我不认为调用了错误的函数。

1 个答案:

答案 0 :(得分:0)

由Apokryfos的最后评论解决:正确地调用带有命名空间\rename($old,$new)的重命名函数会给我bool(true)作为返回值。