我正在构建一个小的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。我使用../
返回一个目录那为什么我不能要求文件?
答案 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修补之后,它永远不会让我感到惊讶。