PHP basename() 删除变量,奇怪的效果


PHP basename() removing variable, strange effect

我有一个奇怪的错误,在下面的代码中,basename((完成了删除$file

$files = glob(DIR_APPLICATION . 'controller/module/*.php');
if ($files) {
    foreach ($files as $file) {
        $extension = basename($file, '.php');
        print($file).'<br />';

调试时,如果我在basename上方添加print()代码,它会按预期工作。如果我将其添加到下面,它将完全删除$file.

这可能是什么原因呢?

if ($files) {
    foreach ($files as $file) {
        echo $file . '<br />';
        var_dump($file);
        echo '<br />';
        $extension = basename($file, '.php');
        var_dump($file);
        echo '<br /><br />';

PHP 版本 5.3.10

对我来说

似乎很好:

<?php
$file = '/path/to/some/file.php';
var_dump($file);
var_dump(basename($file, '.php'));
var_dump($file);
string(22) "/path/to/some/file.php"
string(4) "file"
string(22) "/path/to/some/file.php"

http://codepad.org/E9Nb1SUG

你能通过在代码顶部添加这一行来检查它是否有效吗?

echo basename('/home/shop/www/admin/controller/module/cloudbackup.php', '.php'); exit;

var_dump为字符串提供的长度与它显示的人类可读字符数不同(具体来说,每个长度比正常情况下大 6(。

这意味着您的路径名包含多字节字符,而basename的文档说

basename(( 是区域设置感知的,因此它可以看到正确的 basename 多字节字符路径,必须使用 setlocale(( 函数。

因此,为了解决这个问题,我建议:

  1. 使用 bin2hex 或类似的东西来查看构成每个路径的所有字节的序号;这将告诉您路径名中的哪些字符不是单字节。6个字节的差异意味着它可能是三个字符,所以我的精神力量告诉我,www可能不完全是它看起来的样子。

  2. 如果可能,重命名有问题的目录,使路径成为单字节字符串,问题将自动解决。

  3. 如果上述方法不可行,则:

    a. 了解返回路径的编码方式

    b. 编写自己的使用多字节字符串函数的basename实现,并将它们传递给编码。