PHP - 要求或包含在循环内不起作用?

时间:2013-07-17 08:33:55

标签: php loops require

我正在尝试遍历路径列表并使用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');

一切正常。

  • 正如您所看到的,我甚至不尝试要求整个目录 虽然消息是这么说的。
  • 我不需要类自动加载器,因为我甚至不包括类 虽然我循环浏览一些时在自动加载器中遇到相同的错误信息 我搜索我的类文件时的路径。
  • 这个功能(这里没有显示)有可能是另一个 path可以指定为参数,因此将所有这些路径添加到 考虑到我的做法,PHP包含路径会破坏应用程序 多个需要类,配置文件,模型,控制器, 意见等。
  • 这不完全是我在我的应用程序中使用的代码,但是说明了我正在尝试做的事情。
  • 原始代码中的回显路径始终输出正确的路径到我需要的文件,所以我确定路径是正确的。
  • 在运行时提取路径,然后清除路径并更正斜杠以匹配当前平台。

2 个答案:

答案 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

希望这会有所帮助!