パスのリストをループして、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 インクルード パスに追加すると、クラス、構成ファイル、モデル、コントローラー、ビューに対して複数の要求を作成することを考えると、アプリケーションが台無しになります。等
- これは、私のアプリケーションで使用するコードとまったく同じではありませんが、私がやろうとしていることを示しています。
- 元のコードでエコーされたパスは、必要なファイルへの正しいパスを常に出力するので、パスが正しいと確信しています。
- パスは実行時に抽出され、その後クリーンアップされ、現在のプラットフォームに一致するようにスラッシュが修正されます。