【发布时间】:2013-07-15 17:14:24
【问题描述】:
我正在尝试遍历路径列表并要求使用 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 包含路径会破坏应用程序 对类、配置文件、模型、控制器、 意见等。
- 这不完全是我在应用程序中使用的代码,但它说明了我正在尝试做的事情。
- 原始代码中的回显路径总是输出正确的路径到我需要的文件,所以我确定路径是正确的。
- 在运行时提取路径,然后进行清理,同时更正斜线以匹配当前平台。
【问题讨论】:
-
require实际上不是一个函数,而是一个语句,所以我怀疑它会像那样工作。你想在那里检查什么? -
那是你在测试时实际使用的foreach循环吗? (这是错误的)。
-
您确定路径 && 权限不是问题,但错误消息中另有说明。它实际上看起来好像您正在尝试包含整个目录:
/opt/lamp/htdocs/framework,来自文件/opt/lamp/htdocs/framewrok/system/classes/config.cls.php。显然,路径是问题 -
我们需要看到一个更好的例子来说明你失败了,你的代码示例有一个损坏的 foreach,第三个“路径”甚至没有被引用。
-
在做你自己的自动加载器之前先看看这个,php.net/manual/en/language.oop5.autoload.php