【问题标题】:Is it required to include the namespace file?是否需要包含命名空间文件?
【发布时间】:2014-07-20 07:34:25
【问题描述】:

这是我手头的东西:

//Person.php
namespace Entity;

class Person{


}

用户文件:

//User.php
use Entity\Person;

$person = new Person;

在这里,如果我不包含 Person.php 文件,它会失败。如果我包括它,一切正常。即使使用命名空间,我是否绝对需要包含该文件?如果我们需要包含/需要文件,那么如何有效地使用命名空间?另外,我们可以通过嵌套命名空间来维护文件夹结构吗?

【问题讨论】:

  • 我想你在命名空间之前学习了 php 的 inlcude。命名空间仅对符号进行分组。它不包括任何东西。

标签: php namespaces


【解决方案1】:

您的问题的答案是“是与否”。

确实必须包含实现类Person的代码,否则该类未定义,无法使用。当代码包含时,定义应该从哪里来? php 解释器无法猜测类的实现。顺便说一句,这在所有编程语言中都是一样的。

但是在 php.ini 中有一个叫做 Autoloading 的东西。它允许自动包含某些文件。该机制基于类名到文件名的映射。所以最后归结为 php 通过文件夹结构搜索以找到一个文件,该文件的名称表明它实现了它执行的代码中当前需要的类。

但不要误会:仍然意味着必须包含文件。唯一的区别是:包含是自动完成的,因此无需您指定显式的 includerequire 语句。

【讨论】:

  • 是的,自动加载听起来很明智。但是,如果我说 50 个文件都有自己的类,它们也需要包含吗?
  • 简单的回答:是的,它们都必须包括在内。好吧,就是那些定义实际使用的类的那些。包含是手动完成还是自动完成都没有关系,但必须包含它们。实际上,为每个单独的类创建单独的文件被认为是一种很好的风格。查看文档(我在答案中将其链接)以了解命名约定,以便自动加载工作。
  • 太棒了。我现在正在研究自动加载。还有一个问题,如何调用自动加载所有内容的文件?
  • 您不需要特殊文件。解释器解释所请求的脚本,例如通过对 http 服务器的 http 请求。在该脚本中,使用了一个类。那是解释器意识到这个类(还没有)定义并启动自动加载机制以包含实现该类的文件的时候。只有当找不到这样的文件时,才会抛出错误。总之:你想的太复杂了。只需阅读文档。
  • 好的,所以,我只是在文件 autoload.php 中定义自动加载,并让它驻留在我的 index.php 文件旁边。然后我可以继续使用命名空间/类,甚至不需要 autoload.php?
【解决方案2】:

是的,您需要包含每个文件。 可以在here 找到一个关于有效使用命名空间的非常好的示例。

【讨论】:

  • 我在 Zend 中看到,他们使用命名空间,但没有包含/必需的文件。那么,他们是如何做到的呢?某种“自动包含”方法?请原谅我在这件事上的文盲!
  • 没错,所有框架和 cmfs 都在使用某种自动加载方法。 Zend 本身使用这个:framework.zend.com/manual/1.12/en/zend.loader.autoloader.html
  • 啊哈!所以我需要学习自动加载!谢谢!现在有点道理了。
  • 没错。我建议你从这个 stackowerflow 帖子开始,这似乎是一个很好的解决方案:stackoverflow.com/a/3642440/3616785
  • 是的。我也看到了,但即使在那里,文件也是必需的。那个怎么样?如何使用自动加载所有内容的文件?
【解决方案3】:

使用 PSR-0 自动加载,命名空间必须与类所在的文件夹相同,文件的文件名必须与类名相同。例如,这为您提供了非常简单有效的自动加载作曲家。

【讨论】:

  • 但是,我必须在每一页上都包含自动加载器文件吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-09
  • 1970-01-01
  • 1970-01-01
  • 2011-07-24
  • 2011-07-24
  • 2011-08-15
  • 1970-01-01
相关资源
最近更新 更多