我一直在阅读StackOverflow上的很多帖子,但我不确定我是否正确使用命名空间,自动加载和别名。这运作正常,但我不确定我是否正确使用这些概念。我列举了一些原因,为什么我觉得这个设置在帖子的底部是不正确的。
想象一下以下目录结构:
\public_html
- index.php
\Classes
\A
- One.php
\B
- Two.php
One.php的结构如下:
<?php
namespace Classes\A;
class A { ....
Two.php的结构如下:
<?php
namespace Classes\B;
class B { ....
然后,在index.php中我做了类似的事情:
<?php
use Classes\A\One as One;
use Classes\B\Two as Two;
spl_autoload_register(function ($className) {
...
});
... ?>
所以,有几件事让我感到不安:
如果我正在进行别名(“使用”语句),我仍然需要列出所有文件。我们不是试图通过使用自动加载来避免这样做吗?
如果我想使用内部类,我需要添加一行,例如“use \ mysqli;”进入使用它的类,并执行“new \ mysqli()”之类的操作。好像有点乱?
如果一个类从另一个命名空间扩展一个类(比如说Two.php扩展了One.php),那么我需要包含“use \ Classes \ A \ One as One;”在One.php中,这似乎是我们想要首先避免的内容
答案 0 :(得分:0)
您不必通过use语句引用所有命名空间类。您可以使用部分名称空间。
use Classes\A;
new A\One();
因此,您可以看到A名称空间中是否有另一个类,可以使用
进行实例化new A\Three();
全局命名空间中有很多内容,您不需要使用use
来定义它们。你可以称他们为\mysqli()
。是的,它有点不雅观,但它允许你在自己的代码中创建一个名为mysqli的函数,而不必担心与全局命名空间函数的冲突。
我不确定我是否跟着你这个。您不需要在引用自身的基类中执行use
。
最终有点像use
看起来差不多include
当它们非常不同时use
,在这种情况下,这是一件很方便的事情,所以你没有每次都输入完整的命名空间。
您的Autoloader也不需要了解您的命名空间。自动加载器只是告诉PHP如何加载一个类。因此,如果它看到一个类名为Classes\A\One
的类,您可以在目录/Classes/A
中查找名为One.php的文件并将其包含在内。 PHP将确保该类在适当的命名空间中分配。自动加载器只是一个方便的事情,让您不必在每个PHP文件中包含和要求。