问题 是否需要包含命名空间文件?


这就是我手边的情况:

//Person.php
namespace Entity;

class Person{


}

用户文件:

//User.php
use Entity\Person;

$person = new Person;

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


9176
2018-05-30 13:56


起源

我认为你在命名空间之前学习了php的inlcude。命名空间仅限组符号。它不包括任何东西。 - Shiplu Mokaddim


答案:


你的问题的答案是“是的,不是”。

确实是实现类的代码 Person 必须包含,否则该类未定义,不能使用。当代码是什么时,定义应该来自何处  包括在内呢? PHP解释器不能 猜测 类的实现。顺便说一下,在所有编程语言中都是一样的。

然而有一些东西叫做 自动加载 在PHP中。它允许自动包含某些文件。该机制基于类名到文件名的映射。所以最后它归结为php搜索文件夹结构,找到一个名称暗示它实现了它执行的代码中当前所需的类的文件。

但是不要错了:那 仍然 表示必须包含该文件。唯一的区别是:包含是自动完成的,所以没有指定显式 include 要么 require 声明。


7
2018-05-30 14:03



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


是的,您需要包含每个文件。 可以找到一个很好的例子 这里 有效使用命名空间。


4
2018-05-30 14:03



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


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


1
2018-05-30 16:47



但是,我是否必须在每个页面上包含自动加载器文件? - Rutwick Gangurde