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

试试scandirPHP 的函数来检查文件是否存在。然后你就得到了你想要的信息,而不必在循环中运行 require/require_once/include 。

scandir以下是有关该功能 的一些信息:http: //php.net/manual/en/function.scandir.php

希望这会有所帮助!

于 2013-07-17T08:49:25.907 回答