2012-05-07 39 views
2

我有奇怪的错误,其中在下面的代码,其中所述基名()完成后除去$filePHP基名()除去变量,奇效

$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

+1

什么'的var_dump($文件);'之前和之后的'basename'节目? – zerkms

+0

@zerkms这表明它是一个字符串(63),而 –

+1

之后什么也没有定义“请求”。同时显示2个变量的**确切输出**,因为它在您的屏幕上。 – zerkms

回答

1

var_dump给出了不同的长度为你的字符串比它显示了人类可读的字符数(具体来说,每个长度比通常应该大6)。

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

基本名()是语言环境感知,所以它才能看到正确的基本名称与 多字节字符路径,匹配的语言环境必须可以使用 setlocale()函数进行设置。

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

  1. 使用bin2hex或类似地看到,弥补每个路径的所有字节序的东西;这会告诉你路径名中的哪些字符不是单字节。 6字节的差异意味着它的可能将会是三个字符,所以我的心理能力告诉我,www可能不完全是它的样子。

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

  3. 如果上述是不可能的,则:

    一个。找出什么编码返回的路径在

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

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

+0

是的,这对我来说在过去已经有好几百次了,但现在还没有。 –

2

你可以通过添加这一条线上您的代码是否正常工作与否的顶部检查..

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