0

我正在使用 symfony 并尝试引用父目录中的文件,如下所示:

require_once('../MyClass.class.php');

尽管它一直说在我运行任务时找不到文件,但它似乎不起作用。我在我的个人 WAMP 服务器上尝试了相同的代码(而不是通过这个服务器),它不使用 symfony,它运行良好。

我不确定为什么symfony找不到它?

谢谢

4

2 回答 2

2

当您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__)来获取父目录。

同样,您的框架可能会为您处理这个问题,但最好知道您何时处理非框架脚本。

于 2013-01-12T06:28:38.057 回答
1

你的文件结构是什么?这表明 MyClass.class.php 位于运行此脚本的任何文件的父文件夹中。

此错误表明 MyClass.class.php 不在该指定文件夹中。查看您的数据树结构,您可以从包含运行此脚本的文件的文件夹中创建链接路径;或者你可以从你的主目录直接链接。

于 2013-01-12T06:14:55.590 回答