我有一个奇怪的错误,在下面的代码中,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(( 函数。
因此,为了解决这个问题,我建议:
-
使用
bin2hex
或类似的东西来查看构成每个路径的所有字节的序号;这将告诉您路径名中的哪些字符不是单字节。6个字节的差异意味着它可能是三个字符,所以我的精神力量告诉我,www
可能不完全是它看起来的样子。 -
如果可能,重命名有问题的目录,使路径成为单字节字符串,问题将自动解决。
-
如果上述方法不可行,则:
a. 了解返回路径的编码方式
b. 编写自己的使用多字节字符串函数的
basename
实现,并将它们传递给编码。