0

パスのリストをループして、foreach ループを使用してこれらの PHP スクリプトを要求しようとしています。ただし、次のエラーが表示されます。

Warning: require_once(/opt/lampp/htdocs/framework): failed to open stream: No such file or directory in /opt/lampp/htdocs/framework/system/classes/config.cls.php on line 47

Fatal error: require_once(): Failed opening required '' (include_path='.:/opt/lampp/lib/php') in /opt/lampp/htdocs/framework/system/classes/config.cls.php on line 47

同じパスを使用してループの外でrequire関数を実行すると、常に問題なく動作します。(相対パスではなくフルパスを使用しています)

これを 100 通りの方法で 100 回チェックしてテストしましたが、ループ内でファイルが必要になるたびにエラーが発生します。

Windows と Linux の両方でテストしましたが、Windows では「アクセスが拒否されました....」などのメッセージが表示されます。

XAMPP 1.8.1 XAMPP 1.8.2、LAMPP 1.8.1 LAMPP 1.8.2、AMPPS 2.0 などでテストしましたが、毎回同じエラーが発生します。

ファイル パスとアクセス許可を 100 回確認しましたが、パスが原因ではないと確信しています。

これはPHPの制限ですか、それとも私が何か間違ったことをしていますか?

コード例:

$paths = array('path1', 'path2', path3);

foreach ($paths => $p) {
    if (file_exists($p) && require_once($p)) {
        break;
    }
}

上記のコード例は、静的クラスにあるメソッド内にもあります

編集:複数のファイルから複数の定義を使用しているため、元のコードを追加できません。ループ内でファイルを要求しようとすると、どこでもエラーが発生します。ただし、ここに私がやろうとしていることをよりよく示すいくつかのコードがあります:

abstract class _config
{        
    public static function load($file_name)
    {
        $locations = array(
            '/opt/lampp/htdocs/framework/application/configs/',
            '/opt/lampp/htdocs/framework/system/configs/'
        );

        foreach ($location as $path) {
            $file = $path.$file_name.'.php';

            echo $file.'<br/>';

            if (file_exists($file) && require_once($file)) {
                break;
            }
        }
    }
}

私が使用する場合:

_config::load('test');

出力は次のとおりです。

/opt/lampp/htdocs/framework/application/configs/test.php
/opt/lampp/htdocs/framework/system/configs/test.php

And the error message....

私がしようとすると:

require_once('/opt/lampp/htdocs/framework/application/configs/test.php');
// or
require_once('/opt/lampp/htdocs/framework/system/configs/test.php');

すべて正常に動作します。

  • ご覧のとおり、メッセージにそのように記載されていても、ディレクトリ全体を要求しようとしているわけではありません。
  • クラスファイルを検索するときにいくつかのパスをループすると、オートローダーで同じエラーメッセージが表示されますが、クラスを含めないため、クラスオートローダーは必要ありません。
  • 関数 (ここには示されていません) には、別のパスをパラメーターとして指定できる可能性があるため、これらすべてのパスを PHP インクルード パスに追加すると、クラス、構成ファイル、モデル、コントローラー、ビューに対して複数の要求を作成することを考えると、アプリケーションが台無しになります。等
  • これは、私のアプリケーションで使用するコードとまったく同じではありませんが、私がやろうとしていることを示しています。
  • 元のコードでエコーされたパスは、必要なファイルへの正しいパスを常に出力するので、パスが正しいと確信しています。
  • パスは実行時に抽出され、その後クリーンアップされ、現在のプラットフォームに一致するようにスラッシュが修正されます。
4

2 に答える 2

1

あなたがしようとしているのは、特定のファイルの複数のパスを検索することです。あなたがそれを実装した方法には問題があります。を使用しphp include_pathて、特定のファイルの追加の検索パスを提供します。

$paths = array('path1', 'path2', 'path3');
$paths[] = get_include_path();
set_include_path(implode(PATH_SEPERATOR, $paths));

require_once($file)そして、で定義されたすべてのパスを検索するあなたを行うことができます$path

于 2013-07-17T08:49:06.230 に答える
0

scandirファイルが存在するかどうかを確認する PHPの機能を試してください。その後、必要な情報が得られ、require/require_once/include をループで実行する必要はありません。

scandir関数 に関する情報は次のとおりです。 http://php.net/manual/en/function.scandir.php

これが役立つことを願っています!

于 2013-07-17T08:49:25.907 に答える