在开始我的问题之前,大家好,我要粘贴一张文件夹结构的照片,以便于查看。
好的,在上面突出显示的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
文件时,出现此错误:
正在required_once
的init.php正在运行。但是,似乎没有找到init.php
文件本身所需的文件(与init.php在同一目录中)。为什么会这样?
注意:当我在admin/admin_pages/index.php
页面上玩耍时,所有路径均可用。
编辑:这是我的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}");
}
?>
编辑:这就是给出错误消息仅供参考的原因。我已经设置了自动加载器功能。但是,该文件并不丢失,应该以任何一种方式加载。
答案 0 :(得分:1)
由于您已经进行了一些编辑,因此在其中(除了其他方面)向我们介绍了自动装带器的存在,因此我重新阅读了您的问题。跳出两个重要的事情:
index.php
中。classAutoloader()
。admin/admin_pages/index.php
毫无疑问。)似乎这仍然是一个路径问题,类似于下面提到的问题。从~/index.php
调用自动加载器时,它正在检查您的根目录是否包含includes/db_object.php
,不是这种情况。
您可以通过指定相对于自动加载器文件的include文件夹的路径来解决此问题,如下所示:
$path = __DIR__ ."/path/to/includes/{$class}.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";
?>
请注意:
require_once
不是函数而是语句,因此您可以这样称呼它。 require
,include
和include_once
也是如此。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.php
和users.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";
。我会亲自删除自动装带器中的模具行,因为您可能需要注册多个自动装带器-这些可以与您的包含路径一样堆叠。