2

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

$files = glob(DIR_APPLICATION . 'controller/module/*.php');

if ($files) {

    foreach ($files as $file) {

        $extension = basename($file, '.php');
        print($file).'<br />';

调试时,如果我在print()上面添加代码,basename它会按预期工作。如果我在它下面添加它完全删除$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

4

3 回答 3

2

对我来说似乎很好:

<?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

于 2012-05-07T11:00:08.857 回答
2

您可以通过在代码顶部添加这一行来检查它是否正常工作..

echo basename('/home/shop/www/admin/controller/module/cloudbackup.php', '.php'); exit;
于 2012-05-07T11:13:19.470 回答
1

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

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

basename() 是区域设置感知的,因此要使用多字节字符路径查看正确的基本名称,必须使用 setlocale() 函数设置匹配的区域设置。

所以,为了解决我建议的问题:

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

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

  3. 如果以上都做不到,那么:

    一种。找出返回路径的编码是什么

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

于 2012-05-07T11:13:07.187 回答