我正在使用symfony并尝试引用父目录中的文件,如下所示:
require_once('../MyClass.class.php');
它似乎没有工作,虽然它一直说它在我运行任务时找不到文件。我在我的个人WAMP服务器上尝试了相同的代码(而不是通过这个服务器)并且没有使用symfony,它工作正常。
我不确定为什么symfony找不到它?
由于
答案 0 :(得分:2)
当include
相对路径时,路径相对于“顶级”脚本 - 即应用程序的入口点 - 而不是当前正在执行的脚本。
在处理框架时,入口点通常是名为index.php
的Web根目录顶部的文件。对于此示例,我们假设此文件为~/application/index.php
。
您的index.php文件必然包含来自框架其他部分的文件,而其中一个文件可能是您尝试执行include。让我们说你正在尝试从控制器文件中包含。我们将为其指定文件名~/application/controllers/example.php
。
现在,当您执行include "../MyClass.class.php"
时,您认为正在发生的事情是您认为文件名将比当前正在执行的脚本高一级 - 即您认为,因为您'在~/application/controllers/example.php
中,父目录将为~/application/controllers
,因此您将包含~/application/MyClass.class.php
。
实际会发生什么,相对路径将根据入口点~/application/index.php
的位置确定,因此父目录将为~/
,并且PHP将尝试包含不存在的文件~/MyClass.class.php
。
我不知道Symfony,所以我不知道它的自动加载器是如何工作的,但你应该能够调用一个框架函数来为你加载你的类。如果你真的必须手动include
该文件,那么你需要包含相对于index.php文件的文件。大多数框架都有常量(例如BASEDIR
),您可以使用这些常量来轻松生成绝对路径。
还可以使用两个PHP定义的常量:
__FILE__
将为当前正在执行的脚本(不是上面的主/顶级脚本)提供脚本名称,因此您可以使用dirname(__FILE__)
来获取当前目录,或类似dirname(dirname(__FILE__))
获取父目录。 __DIR__
(对于PHP> = 5.3.0)将为您提供当前正在执行的脚本的目录,因此您可以使用dirname(__DIR__)
来获取父目录。同样,你的框架可能会为你处理这个问题,但是在你处理非框架脚本的时候知道这个很好。
答案 1 :(得分:1)
你的文件结构是什么?这表明MyClass.class.php位于运行此脚本的what-ever文件的父文件夹中。
此错误表示MyClass.class.php不在该目标文件夹中。查看数据树结构,您可以从包含运行此脚本的文件的文件夹中创建链接路径;或者你可以直接从你的主目录链接。