PHP“使用”关键字不正确包括

时间:2013-01-09 11:10:27

标签: php yii

我目前正在重构一个已经半心半意地移植到Yii的项目。 components文件夹中有一些类包含在带有“use”-keyword的控制器中。这给了我一个“include(protected / components / classes / SClass.php):无法打开流:没有这样的文件或目录”错误。

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

2 个答案:

答案 0 :(得分:4)

PHP中的use关键字本身不包括其他任何文件。它只是告诉PHP,use语句中定义的命名空间可能会被当前PHP文件中的代码引用。

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

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

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

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

  • use语句现在引用了不同的命名空间,但您可能以后在实际引用该类的程序中没有更改代码。
  • 程序到达调用该类的代码,但它无法识别命名空间,因为它不再与use语句匹配,因此即时致命错误。

答案 1 :(得分:0)

您可能需要检查文件所有权和权限,并检查PHP安全性,如上所述HERE