我正在尝试遍历路径列表并使用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上我得到了“Access Denied ....”或类似内容。
我每次都在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');
一切正常。
答案 0 :(得分:1)
您尝试做的是搜索特定文件的多个路径。你实现它的方式是有问题的。使用php
include_path
为特定文件提供其他搜索路径。
$paths = array('path1', 'path2', 'path3');
$paths[] = get_include_path();
set_include_path(implode(PATH_SEPERATOR, $paths));
然后您可以执行require_once($file)
搜索$path
答案 1 :(得分:0)
尝试使用PHP的scandir
函数来检查文件是否存在。然后你就得到了你想要的信息,而不必在循环中运行require / require_once / include。
以下是有关scandir
功能的一些信息:
http://php.net/manual/en/function.scandir.php
希望这会有所帮助!