我正在使用 symfony 并尝试引用父目录中的文件,如下所示:
require_once('../MyClass.class.php');
尽管它一直说在我运行任务时找不到文件,但它似乎不起作用。我在我的个人 WAMP 服务器上尝试了相同的代码(而不是通过这个服务器),它不使用 symfony,它运行良好。
我不确定为什么symfony找不到它?
谢谢
当您include
使用相对路径时,该路径是相对于“顶级”脚本——即应用程序的入口点——而不是当前正在执行的脚本。
在处理框架时,入口点通常是位于 Web 根目录顶部的一个文件,名为index.php
. 对于这个例子,我们假设这个文件是~/application/index.php
.
您的 index.php 文件必须包含来自框架其他部分的文件,并且您可能会尝试在其中之一中执行包含。假设您正在尝试从控制器文件中包含。我们会给它文件名~/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__)
来获取父目录。同样,您的框架可能会为您处理这个问题,但最好知道您何时处理非框架脚本。
你的文件结构是什么?这表明 MyClass.class.php 位于运行此脚本的任何文件的父文件夹中。
此错误表明 MyClass.class.php 不在该指定文件夹中。查看您的数据树结构,您可以从包含运行此脚本的文件的文件夹中创建链接路径;或者你可以从你的主目录直接链接。