需要包含命名空间文件吗?

16

这是我手头目前所拥有的:

//Person.php
namespace Entity;

class Person{


}

用户文件:

//User.php
use Entity\Person;

$person = new Person;

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


1
我认为你在学习 PHP 的 include 之前已经了解了 namespace。命名空间只是将符号分组,它不包含任何内容。 - Shiplu Mokaddim
3个回答

9
你的问题的答案是“是和否”。
确实,实现类Person的代码必须包含在内,否则该类未定义并且无法使用。当代码没有被包括时,定义应该从哪里来呢?PHP解释器无法猜测类的实现方式。顺便说一下,所有编程语言都是如此。
然而,在PHP中有一种叫做Autoloading的东西。它允许自动包含某些文件。该机制基于将类名映射到文件名。因此,最终归结为PHP通过搜索文件夹结构来查找一个文件,其名称暗示着它实现了当前执行的代码中所需的类。
但是不要误解:这仍然意味着必须包含该文件。唯一的区别是:包含是自动完成的,因此您不需要指定显式的includerequire语句。

是的,自动加载听起来很合理。但是如果我有50个文件,每个文件都有它们自己的类,它们也需要被包含进来吗? - Rutwick Gangurde
1
简单的回答是:是的,它们都必须被包含进来。当然,只有那些定义了实际使用的类才需要被包含进来。无论是手动还是自动地进行包含,都没有关系,但它们必须被包含进来。实际上,为每个单独的类创建一个单独的文件被认为是很好的风格。查看文档(我在答案中提供了链接)以了解命名约定,以便自动加载正常工作。 - arkascha
太好了。我现在正在研究自动加载。只有一个问题,我该如何调用自动加载所有文件的那个文件? - Rutwick Gangurde
你不需要特别的文件。解释器会解释所请求的脚本,例如通过HTTP请求到HTTP服务器。在这个脚本中,使用了一个类。那时,解释器意识到这个类尚未定义,并启动自动加载机制来包含实现该类的文件。只有在找不到这样的文件时才会抛出错误。简而言之:你想得太复杂了。只需阅读文档即可。 - arkascha
1
好的,所以我只需在文件autoload.php中定义自动加载函数,并让它与index.php文件放在一起。然后,我就可以继续使用命名空间/类,而无需引用autoload.php文件了吗? - Rutwick Gangurde

4

是的,您需要包含每个文件。

一个非常好的例子可以在这里找到关于命名空间有效使用的介绍。


1
我在Zend中看到他们使用命名空间,但是没有任何文件被包含/需要。那么,他们是如何做到的呢?一种“自动包含”的方法吗?请原谅我对此事的无知! - Rutwick Gangurde
准确地说,所有的框架和CMF都使用某种自动加载器方法。Zend本身就是使用这种方法的:http://framework.zend.com/manual/1.12/en/zend.loader.autoloader.html。 - gnagy
1
啊哈!所以我需要学习自动加载!谢谢!现在有点明白了。 - Rutwick Gangurde
正确。我建议您从这个 StackOverflow 帖子开始,它似乎是一个不错的解决方案:https://dev59.com/YXA65IYBdhLWcg3wxRo8#3642440 - gnagy
是的,我也看到了,但即使在那里,文件也是必需的。那怎么办?我如何使用自动加载所有内容的文件? - Rutwick Gangurde

1

在PSR-0自动加载中,命名空间必须与类所在的文件夹相同,文件名必须与类名相同。例如,使用composer可以获得非常简单和有效的自动加载。


1
但是,我是否需要在每个页面上都包含自动加载程序文件? - Rutwick Gangurde

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接