包含未通过require_once()找到的文件

时间:2018-07-07 21:22:28

标签: php path include require

在开始我的问题之前,大家好,我要粘贴一张文件夹结构的照片,以便于查看。

enter image description here

好的,在上面突出显示的header.php中,我有以下代码行:

<?php require_once("admin/admin_pages/includes/init.php"); ?>

在该init.php文件中:

<?php
require_once("functions.php");
require_once("db_config.php");
require_once("database.php");
require_once("user.php");
require_once("session.php");
require_once("photo.php");
require_once("db_object.php");
?>

但是,当我尝试打开位于我的根目录中的index.php文件时,出现此错误:

enter image description here

正在required_once的init.php正在运行。但是,似乎没有找到init.php文件本身所需的文件(与init.php在同一目录中)。为什么会这样?

注意:当我在admin/admin_pages/index.php页面上玩耍时,所有路径均可用。

enter image description here

编辑:这是我的include文件夹中内容的屏幕截图。

<?php
//Just in case an includes file is not called in the init.php file.
function classAutoloader($class)
{
    $class = strtolower($class);
    $path = "includes/{$class}.php";

    if (file_exists($path)) {
        require_once($path);
    } else {
        die("The file named {$class}.php was not found.");
    }
}

spl_autoload_register('classAutoloader');

function redirect($location)
{
    header("Location: {$location}");
}
?>

编辑:这就是给出错误消息仅供参考的原因。我已经设置了自动加载器功能。但是,该文件并不丢失,应该以任何一种方式加载。

4 个答案:

答案 0 :(得分:1)

编辑:

由于您已经进行了一些编辑,因此在其中(除了其他方面)向我们介绍了自动装带器的存在,因此我重新阅读了您的问题。跳出两个重要的事情:

  1. 此问题发生在您位于网站根目录的index.php中。
  2. 打印的错误源于classAutoloader()
  3. (您对admin/admin_pages/index.php毫无疑问。)

似乎这仍然是一个路径问题,类似于下面提到的问题。从~/index.php调用自动加载器时,它正在检查您的根目录是否包含includes/db_object.php,不是这种情况。

您可以通过指定相对于自动加载器文件的include文件夹的路径来解决此问题,如下所示:

$path = __DIR__ ."/path/to/includes/{$class}.php";

尽管我看不到此解决方案有任何问题,但对我来说,它看起来并不优雅。或者,您可以从根目录指定路径。


与您的init.php文件有关。

通过要求admin/admin_pages/includes/init.php,您可以从需要文件的init.php中运行代码。如果这样的话。您可以在header.php中编写以下内容,其行为与要求init.php相同:

<?php
require_once("functions.php");
require_once("db_config.php");
require_once("database.php");
require_once("user.php");
require_once("session.php");
require_once("photo.php");
require_once("db_object.php");
?>

您可能会注意到这没有任何意义,因为从header.php调用时这些路径不正确。您可以使用__DIR__常量来解决此问题:

  

文件目录。如果在include中使用,则目录   返回包含的文件。这相当于   目录名( FILE )。此目录名称不带斜杠   除非它是根目录。 〜The Manual


使用上述信息,您可能会自己弄清楚,但要使我的答案完整,请将init.php中的代码更改为:

<?php
require_once __DIR__ . "/functions.php";
require_once __DIR__ . "/db_config.php";
require_once __DIR__ . "/database.php";
require_once __DIR__ . "/user.php";
require_once __DIR__ . "/session.php";
require_once __DIR__ . "/photo.php";
require_once __DIR__ . "/db_object.php";
?>

请注意:

  1. require_once不是函数而是语句,因此您可以这样称呼它。 requireincludeinclude_once也是如此。
  2. 根据您的问题,只有db_object.php的要求失败了……这似乎有点奇怪。

专业提示(如AnyhonyB的评论中所述):

  

最大的烦恼之一是必须写一长串   包括在每个脚本的开头(每个类一个)。

     

在PHP 5中,这不再是必需的。 spl_autoload_register()   函数注册任意数量的自动加载器,从而启用类和   当前不自动加载的接口   定义。通过注册自动加载器,PHP获得了最后的机会   在因错误而失败之前加载类或接口。 〜The Manual

答案 1 :(得分:1)

将db_object.php 文件放在init.php 文件中users.php 文件的上面,就可以找到了。我正在学习同一门课程,这就是解决方案

答案 2 :(得分:0)

大家好,谢谢大家的投入。我终于找到了我的代码的问题。这不是因为自动加载器功能。

我不知道在init.php中调用文件的顺序很重要。我只是重新排序了require_once()语句。

db_object.php文件实际上是包含我的对象(照片和用户)的父类的文件。 photo.phpusers.php包含从db_object.php继承的类。这对于为什么我们需要首先找到db_object.php是有意义的。

之前:

<?php
require_once("functions.php");
require_once("db_config.php");
require_once("database.php");
require_once("user.php");
require_once("session.php");
require_once("photo.php");
require_once("db_object.php");
?>

之后:

<?php
require_once("functions.php");
require_once("db_config.php");
require_once("database.php");
require_once("db_object.php");
require_once("user.php");
require_once("session.php");
require_once("photo.php");
?>

答案 3 :(得分:0)

这不是答案,但可能会有所帮助

请考虑以下内容。

如果我们在同一目录中有三个文件:

a.php:

<?php
require_once 'b.php';
require_once 'c.php';

b.php:

<?php
class B extends C
{}

c.php:

<?php
class C
{}

如果我运行a.php,则会得到以下输出:

 Fatal error: Class 'C' not found in /var/www/stackoverflow/req_test2/b.php on line 3

这表明订单与require呼叫有关。

如果我将a.php的内容换成以下内容并运行它:

<?php
spl_autoload_register();

$b = new B;
var_dump($b);

我得到以下输出:

object(B)#1 (0) {
}

不带参数的spl_autoload_register()这里使用spl_autoload()的默认实现:对名为Foo的类的引用将看起来包括您的包含路径中的文件foo.php。

B的初始化在这里引用了C类,并且上面的自动加载器将负责根据需要提供适当的文件。

我建议将每个类定义放在自己的文件中。文件名到类的一对一映射。您可能还对PSR-4样式感兴趣。

尽早声明您的自动装带器。实用程序功能也可以预先包含。

代码的一种解决方法是将include文件夹添加到include路径,并将require行更改为$path = "{$class}.php";。我会亲自删除自动装带器中的模具行,因为您可能需要注册多个自动装带器-这些可以与您的包含路径一样堆叠。