【发布时间】:2015-06-06 00:18:23
【问题描述】:
所以我有一组非常简单的文件:
main.php
include_once 'User.php';
echo 'im here'; //never reached!
$user = new My\Test\User();
...
用户.php
namespace My\Test;
include_once 'Student.php';
class User {...}
学生.php
namespace My\Test;
include_once 'User.php';
var_dump(in_array('User.php', get_included_files())); //true
var_dump(class_exist('User')); //false
var_dump(class_exist('\My\Namespace\User')); //false
var_dump(class_exist('My\Namespace\User')); //false - How can that be?
class Student extends User {...} //Fatal Error: Class My\Namespace\User not found
所以这里发生的是用户类首先从 main.php 中包含。因为它有一些创建学生实例的静态方法,所以它需要包含学生类文件。学生文件,因为它扩展了用户,也包括 User.php,但不应该执行,因为我使用了 include_once。我什至检查文件是否正确包含,但几行后我得到了致命错误。两个文件具有相同的命名空间。
有趣的是,在我将命名空间应用到我的类之前一切正常,所以我认为这是交叉包含具有相同命名空间的文件的某种错误。
尝试从 Student.php 中删除 include_once,没有任何区别。
如果main.php包含User.php,而User.php包含Student.php,为什么Student.php找不到User类?!
我使用的是 PHP 版本 5.5.9
【问题讨论】:
-
查看我的答案 - 您可能需要稍微编辑您的帖子,因为您在此处列出的示例命名空间是“命名空间”——这不是有效的命名空间名称。在我的回答中,我将您的命名空间更改为“MyNamespace”——但使用您在问题中遇到问题的实际命名空间将有助于确保答案准确满足您的需求。
标签: php class namespaces include