所以我有一套非常简单的文件:
main.php
include_once 'User.php';
echo 'im here'; //never reached!
$user = new My\Test\User();
...
user.php的
namespace My\Test;
include_once 'Student.php';
class User {...}
Student.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
所以这里发生的是User类首先包含在main.php中。因为它有一些静态方法可以创建学生实例,所以它需要包含Students类文件。学生档案,因为它扩展了用户,包括User.php,但不应该执行,因为我使用了include_once。我甚至检查文件是否包含正确,但几行后我得到了致命的错误。两个文件都具有相同的命名空间。
有趣的是,在我将命名空间应用到我的类之前,一切正常,所以我认为它是某种带有相同命名空间的交叉包含文件的错误。
试图从Student.php中删除include_once,但没有区别。
如果main.php包含User.php,而User.php包含Student.php,为什么Student.php无法找到User类?!
我使用的是PHP版本5.5.9
答案 0 :(得分:0)
当main.php调用创建新的User()时,它不在正确的命名空间内运行。
您需要在main.php中指定命名空间,否则使用正确的命名空间(我将命名空间命名为MyNamespace - 因为您的伪代码名称空间名称空间无效)。
<?php
namespace MyNamespace;
include_once 'User.php';
echo 'im here'; //never reached!
$user = new User();
更改为此后,您将获得:
Scotts-rMBP-3:bar smoore$ php main.php
bool(false)
bool(false)
bool(true)
bool(true)
im here