当需要来自类的文件时,require_once无法正常工作

时间:2014-12-22 11:52:09

标签: php

我正在构建一个小的PHP MVC框架,这是我的文件夹结构

/app
  /controllers
  /models
  /views
  /templates
  /config
    /config.php
  /core
    /Controller.php
    /Router.php
    /init.php
/index.php

在作为前端控制器的index.php中,我有这段代码需要来自/app/core/init.php的init.php

的index.php

<?php
require_once 'app/core/init.php'
$Router = new Router();
$Controller = new Controller();
?>

应用程序/核心/的init.php

<?php
require_once 'Controller.php';
require_once 'Router.php';
?>

init.php需要/ core目录中的每个基本控制器和classe,包括Controller.php和Router.php,这里index.php也实例化类

此时每件事都运行正常,因为我通过在Controller.php和Router.php中创建构造函数来测试它,所以这两个文件中的代码将是这样的

应用程序/核心/ Controller.php这样

<?php
class Controller {
    public function __construct() {
        echo 'OK!';
    }
}
?>

应用程序/核心/ Router.php

<?php
class Router {
    public function __construct() {
        echo 'OK!';
    }
}
?>
在index.php里面它回应了OK!因为类是正确实例化的,但问题是当我想在/app/core/Controller.php中使用此代码包含位于/app/config/config.php中的config.php时

<?php
class Controller {
    public function __construct() {
        require_once '../config/config.php';
    }
}
?>

每当我这样做时都会返回此错误

Controller::include(../config/config.php) [controller.include]: failed to open stream: No such    file or directory in C:\AppServ\www\myapp\app\core\Controller.php on line 6

Controller::include() [function.include]: Failed opening '../config/config.php' for inclusion (include_path='.;C:\php5\pear') in C:\AppServ\www\myapp\app\core\Controller.php on line 6

我认为我使用了正确的位置,我正在使用/app/core/Controller.php,并希望需要/app/config/config.php。我使用../

返回一个目录

那为什么我不能要求文件?

3 个答案:

答案 0 :(得分:2)

根据我个人使用相对文件路径的经验,在某些时候会导致令人头疼的问题。所以我通常使用go来获取文件的绝对路径。这也具有更快的优点。 然后,如果在某个时刻出现包含错误,则更容易找到错误,因为您可以使用整个路径。

为了能够制作绝对路径,我建议你在index.php文件(前控制器)中添加一个常量。如下所示:

 define('ROOT_PATH', realpath(dirname(__FILE__)) . DIRECTORY_SEPARATOR);

此处的功能define()realpath()dirname()的文档。

这定义了一个名为ROOT_PATH的常量,它引用index.php文件所在的目录,从而引用根目录。同时我在末尾添加了一个目录分隔符,以便更容易编写路径。要使用它,你会写。

require_once ROOT_PATH . 'config/config.php';

奖励信息

但是如果你在controller.php课程中使用这种方法,你就会依赖于那个常数。要解决此问题,您可以将根路径作为构造函数中的变量传递。

public function __construct($root) {...

然后使用它如下:

public function __construct($root) {

    require_once($root . 'config/config.php');

}

希望这有帮助。

答案 1 :(得分:0)

我不知道发生了什么,但是require_once()不会引发错误,将自己称为include(),因为这些是不同的函数,而且,如果这是整个代码,那么错误行号也与您的require_once()致电热线不匹配,因为它应该是4.尝试重新启动您的网络服务器,看看它是否能解决问题,否则您可能会搞砸了什么

答案 2 :(得分:0)

虽然AnotherGuy已经提供了正确的解决方案,但我想补充一点,PHP显示的行为实际上非常奇怪。我设置了一个包含树的小树,其中脚本A包括B,其中包括C(全部在单独的目录中),但是如果我指定相对于A的路径,则B将仅包括C,即使此时_FILE__常量显示B的路径我猜文档中提到的调用脚本不是我期望的调用此函数的脚本,而是最初为请求服务的脚本。

我会全心全意地同意不使用相对路径,但经过多年的PHP修补之后,它永远不会让我感到惊讶。