1

我有第一张图片的数据结构。

下面的代码来自 Class.CIBootstrap.php

正如你所看到的,我在第 4 行:

require 'Class.CIAjaxHandler.php';

这很好用。现在,如果它不是 ajax 我想加载正确的控制器......

这不起作用。从结构中可以看出,CIAjaxHandler 与 CIBootstrap 位于同一文件夹中,但我尝试访问的 CILoginController 不是,但为什么我不能通过

require '../controllers/Class.CILoginController.php'?

结构 代码

4

2 回答 2

3

定义绝对路径可能是个好主意。因为:

  • 文件/文件夹将来可能会更改位置
  • 防止像您的问题这样的问题(不同呼叫的父文件不能相同)
  • 如果您查看代码,您就知道应该在哪里找到文件

因此,只需包含一个常量文件,您可以在其中生成级联路径,如下所示:

define('PATH_ROOT'    ,__DIR__.'/');
define('PATH_CLASSES' , PATH_ROOT.'classes/');
// ...

在你的脚本中

require_once PATH_CLASSES.'controller/Class.CIAjaxHandler.php';

在这种情况下,您绝对确定要包含的内容,并且 WHERE 是您想要包含的文件。

假设你有这个结构:

/root.php

<?php echo "Hello World";

/index.php

 <?php 
 include 'path1/path1.php';

/path1/path1.php

<?php 
include '../root.php';

在这种情况下,如果您调用/path1/path1.php脚本有效,因为在父文件夹中包含 root.php 就可以了。但是如果你调用/index.php它不起作用,因为包含文件已经相对于父文件夹。

因此,如果您计划在您的软件中调用不同位置的不同文件,使用常量可能是一种解决方案。

另一种解决方案可以设置包含路径__DIR__或在相对路径的开头始终指定绝对路径。

于 2012-11-27T20:12:56.400 回答
2

如有疑问,请使用相对于当前文件的路径:

require_once dirname(__FILE__).'/../controller/Class.CILoginController.php';

或在 php 5.3+ 中:

require_once __DIR__.'/../controller/Class.CILoginController.php';

当有请求时,您的代码可以工作$_GET['page'] == 'ajax',但是这个请求最有可能在misc文件夹中的某个位置发出到哪个文件)?但是当$_GET['page'] !== 'ajax'它可能被其他脚本(如index.php外部misc目录)调用时,因此 php 进程的当前工作目录可能会有所不同。

于 2012-11-27T20:03:46.820 回答