2015-06-06 63 views
-1

所以我有一个非常简单的文件集:'找不到类' 包括

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 {...} 

学生。 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。因为它有一些创建Students实例的静态方法,并且需要包含Students类文件。学生文件,因为它扩展用户,也包括User.php,但不应该执行,因为我使用了include_once。我甚至检查文件是否包含正确,但几行后我得到致命的错误。这两个文件具有相同的名称空间。

有趣的是,在我将类命名空间应用于我的类之前,所有工作都是有效的,所以我认为它是一些交叉包含具有相同名称空间的文件的错误。

试图从Student.php中删除include_once,它没有区别。

如果main.php包含User.php,并且User.php包含Student.php,为什么cant Student.php找不到User类?!

我在PHP版本5.5.9

+0

见我的答案 - 你可能要稍微编辑您的帖子,因为你在这里列出的例子命名空间是“命名空间” - 这是不是一个有效的名称空间名称。在我的回答中,我将您的名称空间更改为“MyNamespace” - 但使用您在问题中遇到问题的实际名称空间将有助于确保答案对您的需求是准确的。 –

回答

0

你main.php不正确的命名空间内运行,当它被调用来创建一个新用户();.

您需要在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 
+0

我的错,这只是为了示范。我在我的代码中检查了它,并使用了完整的名称空间名称。重点是,'im here'永远不会到达(因此新的User()),致命错误在Student.php中引发... – felixfbecker

+0

如果您查看运行代码的输出 - 我会在这里获得“im “使用我在main.php中添加的命名空间。 –