【问题标题】:'Class not found' even though file is properly included即使正确包含文件,“找不到类”
【发布时间】: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


【解决方案1】:

您的 main.php 在调用创建新的 User(); 时未在正确的命名空间中运行。

您需要在 main.php 中指定命名空间,或者使用正确的命名空间(我将命名空间命名为 MyNamespace - 因为您的伪代码具有无效的命名空间名称 Namespace)。

<?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

【讨论】:

  • 我的错,这只是为了演示。我在我的代码中检查了它,并使用了完整的命名空间名称。关键是,永远不会到达“我在这里”(因此是 new User()),在 Student.php 中抛出了致命错误...
  • 如果您查看运行代码的输出 - 我使用我在 main.php 中添加的命名空间得到“我在这里”。
猜你喜欢
  • 2015-02-10
  • 2015-11-25
  • 2015-01-12
  • 2018-02-28
  • 1970-01-01
  • 2012-08-18
  • 1970-01-01
  • 1970-01-01
  • 2018-06-04
相关资源
最近更新 更多