为什么这些相对路径在php中不能正常工作?

4

我的应用程序结构如下

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路径的工作原理存在一些误解,但我无法弄清楚是什么。有时路径似乎与当前脚本相关,而有时则相对于index.php,但不一定与我是否以/开头的路径有关。

3个回答

8
请尝试以下操作:
require 'application/controllers/home.php';

require 'application/models/clusters.php';

问题在于PHP中的路径始终相对于第一个文件路径,即index.php。因此您必须包括目录'application'。
另一种选择是使用set_include_path:http://php.net/manual/pt_BR/function.set-include-path.php 编辑:
要查看您的include_path:
echo ini_get('include_path');

4
如果您不想设置include路径,但需要遍历包含多个文件的目录,并且每个文件中都有include语句,“require(dirname(FILE).'/path');”可以起到作用。 - Dave Lasley
这就是我想的...那么为什么在application/router.php中"controllers/home.php";能够工作呢?这与" "' '有关吗? - wheresrhys
1
请查看Mark Baker的答案,以获取您想要的解释。我们不知道您的include_path值,所以很难确定。但我会按照我说的那样去做。我还编辑了我的答案,以展示您如何查看已包含的路径。 - jribeiro

0

让我惊讶的是有多少人不理解 include_path 的重要性。

除非你已经为你的 include/require 指定了绝对路径(即以 / 开头的路径),否则 PHP 会使用 include_path 来尝试按顺序处理每个包含路径条目来查找文件。通常,包含路径中的第一个条目是 .,表示当前目录(如果在脚本的那一点执行 getcwd() 将返回当前目录)。


是的,那绝对是我知识上的一个漏洞。include_path被设置为.;[path to PEAR]。然而,我已经尝试在所有被调用的文件中运行echo getcwd();,它总是返回webroot文件夹...所以对我来说,“controllers/home.php”为什么能够成功地被包含仍然是个谜。 - wheresrhys

-6

试一下这个

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接