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

コードの上にこの1行を追加して、機能しているかどうかを確認できますか..

echo basename('/home/shop/www/admin/controller/module/cloudbackup.php', '.php'); exit;
于 2012-05-07T11:13:19.470 に答える
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 に答える
1

var_dumpは、表示される人間が読める文字数とは異なる長さを文字列に与えます (具体的には、各長さは通常よりも 6 長くなります)。

これは、パス名にマルチバイト文字が含まれていることを意味しますが、ドキュメントにbasename

basename() はロケールに対応しているため、マルチバイト文字パスで正しいベース名を確認するには、setlocale() 関数を使用して一致するロケールを設定する必要があります。

だから、私が提案する問題を解決するために:

  1. または同様のものを使用bin2hexして、各パスを構成するすべてのバイトの序数を確認します。これにより、パス名のどの文字がシングルバイトでないかがわかります。6 バイトの違いは、おそらく3 文字になることを意味するので、私の超能力にwwwよると、見た目とまったく同じではない可能性があります。

  2. 可能であれば、問題のあるディレクトリの名前を変更して、パスが 1 バイト文字列になるようにすると、問題は自動的に解決されます。

  3. 上記が不可能な場合は、次のようにします。

    を。返されたパスのエンコーディングを調べる

    b. マルチバイト文字列関数を使用する独自の実装を作成basenameし、エンコーディングを渡します。

于 2012-05-07T11:13:07.187 に答える