2012-02-19 66 views
3

我的应用程序结构如下为什么不能在PHP中工作,这些相对路径

application -> views -> templates 
          // some more files 
        page.php 
      -> controllers 
        home.php   
      -> models 
        items.php 
      router.php 
index.php 

第一种情况:

的index.php

include 'application/routes.php'; 

routes.php文件

require "controllers/home.php"; 

controllers/home.php

require '/application/models/clusters.php'; //works 
require 'application/models/clusters.php'; //works 
require '../models/clusters.php'; //doesn't work 

为什么第一行工作但不是最后一行?

第二种情况:

的index.php

include 'application/views/page.php'; 

page.php文件

glob("application/views/templates/*.php") // array of files 
glob("templates/*.php") // empty array 

我觉得有什么不对我的路在PHP是如何工作的理解,但我无法弄清楚它是什么。有时候路径似乎是相对于当前的脚本,ADN相对的index.php其他时间,但不必拘泥于当我开始/

回答

5

的路径,请试试这个:

require 'application/controllers/home.php'; 

require 'application/models/clusters.php'; 

的问题是PHP中的路径总是相对于第一个文件路径,在本例中是index.php。所以你必须包含目录'应用程序'。

另一种方法是使用通过set_include_path:http://php.net/manual/pt_BR/function.set-include-path.php

编辑

要查看您的include_path:

echo ini_get('include_path'); 
+2

如果你不想通过set_include_path,但你遍历多个文件每个都包含'require(dirname(__ FILE __)。'/ path');'将会工作 – 2012-02-19 14:42:52

+0

这就是我认为的......那么为什么'“controllers/home.php”;'在application/router.php中工作/?与'''''''''''''有什么关系? – wheresrhys 2012-02-19 14:43:26

+1

请看Mark Ba​​ker的解答,我们不知道你的include_path值,所以很难,但我会像我说的那样去做。我也编辑了我的答案,以显示如何查看包含的路径 – jribeiro 2012-02-19 14:55:05

1

它总是让我感到吃惊,有多少人不理解的include_path的意义。

除非你为你的include/require指定了一个绝对路径(即以/开头的路径),否则PHP使用include_path来依次处理每个include路径条目来尝试找到文件。通常,包含路径中的第一个条目是。这意味着当前目录(如果它在脚本执行点由GETCWD()返回。

+0

是的,这绝对是我的知识缺口。 include_path被设置为'。; [PEAR路径]'。但是,我试过在所有调用的文件中运行'echo getcwd();'它总是返回webroot文件夹...所以我仍然很奇怪为什么“controllers/home.php”成功包含 – wheresrhys 2012-02-19 15:17:44

-4

试试这个

require '/../models/clusters.php'; //doesn't work 
相关问题