2

我目前正在重构一个半心半意地移植到 Yii 的项目。components 文件夹中有一些类包含在带有 PHP“use”-keyword 的控制器中。这给了我一个“include(protected/components/classes/SClass.php): failed to open stream: No such file or directory”错误。

真正奇怪的是,将名称(由“use”使用)更改为不存在的文件会给我一个致命错误。有任何想法吗?

4

2 回答 2

4

PHP 中的use关键字本身不包含其他文件。它只是告诉 PHP 语句中定义的名称空间use可能被当前 PHP 文件中更下方的代码引用。

但是,这里可能发生的是您的系统autoload定义了一个函数。如果有一个autoload函数,PHP 将在遇到无法识别的类名时调用该函数。该autoload函数搜索要加载的类文件,如果可以找到,则将其包含在内。这可能是您发生错误的地方。

在第一种情况下,这是事件的顺序:

  • use语句引用了一个有效的命名空间,但在代码中引用了该命名空间中的一个类之前,它会被忽略。
  • 当类被引用时,PHP 会说“我还不知道这个类,让我们自动加载它吧”。
  • 自动加载器功能运行,并构建一个包含路径。这通常来自类的命名空间和类名,但可以是编写的自动加载函数所期望的任何内容。
  • 在这种情况下,听起来自动加载器正在构建路径并include()在该路径上运行,但是该类不存在于自动加载器期望的位置。因此出现“找不到文件”错误。

在第二种情况下,您更改use语句:

  • use语句现在引用了一个不同的命名空间,但您稍后可能没有更改实际引用该类的程序中的代码。
  • 程序到达调用该类的代码,但它无法识别命名空间,因为它不再匹配该use语句,因此立即出现致命错误。
于 2013-01-09T12:06:34.153 回答
0

您可能想要检查文件所有权和权限,并检查此处提到的 PHP 安全性

于 2013-01-09T11:30:31.920 回答