即使正确包含文件,也“找不到类”

时间:2015-06-06 00:18:23

标签: php class namespaces include

所以我有一套非常简单的文件:

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

1 个答案:

答案 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