如何解决require_once中的致命错误

Posted

技术标签:

【中文标题】如何解决require_once中的致命错误【英文标题】:How to solve the fatal error in require_once 【发布时间】:2020-11-22 13:19:52 【问题描述】:

我的项目有两个入口点

project (root-folder)
/config(folder)
    config.php
/service(folder)
    service.php
index.php

例如

文件 1:/index.php (第一个入口点) - 这里我们包含配置文件夹中的配置

<?php
require_once('config/config.php');
require_once('service/service.php');
?>

文件 2:service/service.php - 这里我们包含配置文件夹中的配置

<?php
require_once('../config/config.php');

?>

如果我调用文件 2:service/service.php 没有致命错误

但是当我调用文件 1:/index.php 时,它变成了致命错误,因为它无法要求 'service/service.php' 因为它再次要求并且配置路径无效

如何解决这个问题。

【问题讨论】:

这似乎不太可能,因为require_once 只需要一次。 不确定../ 是否有所作为,但从技术上讲应该不会。 是否需要动态方式的路径 你能发布确切的错误吗? require_once(): 当我们调用 index.php 时打开所需的 'config/config.php' 失败 【参考方案1】:

原因:

出现此问题是因为您的执行从index.php 开始,然后您需要service/service.php。现在在service.php 中,当您执行../config/config.php 时,PHP 会尝试从index.php 的角度解析目录路径,但找不到任何此类文件或目录。因此,错误。

解决方案:

index.php 中声明一个常量。检查service/service.php 中是否存在此常量。如果不是,则要求它,否则像下面这样跳过它:

index.php:

<?php
   define('INDEX_ENTRY_POINT',true);
   require_once('config/config.php');
   require_once('service/service.php');
?>

service.php:

<?php
   if(!defined('INDEX_ENTRY_POINT'))
     require_once('../config/config.php');
   
?>

注意:最好使用__DIR__ 提供绝对路径而不是相对路径以避免此类问题。

【讨论】:

【参考方案2】:

你必须考虑当你从 index.php 调用 service.php 时,根是 index.php 的根。现在有很多方法可以解决这个问题。您可以决定 service.php 是主控制器,就像 index.php 一样,因此属于根文件夹。如果出于某种原因您想保持原样,那么您必须定义根以使其适应上面的 vivek_23 答案中的情况。就个人而言,我会将 service.php 保留在根文件夹中,这更符合逻辑。

【讨论】:

以上是关于如何解决require_once中的致命错误的主要内容,如果未能解决你的问题,请参考以下文章

require_once() 中的 PHP 致命错误可以 n

致命错误:require_once() [function.require]:无法打开所需的 global.php

致命错误:require_once():

require_once 致命错误(再一次)

致命错误:require_once() 使用绝对路径

致命错误:require_once():需要打开失败