我正确使用名称空间,自动加载和别名吗?

时间:2017-01-12 23:20:12

标签: php oop namespaces autoload

我一直在阅读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) {
...
});

... ?>    

所以,有几件事让我感到不安:

  1. 如果我正在进行别名(“使用”语句),我仍然需要列出所有文件。我们不是试图通过使用自动加载来避免这样做吗?

  2. 如果我想使用内部类,我需要添加一行,例如“use \ mysqli;”进入使用它的类,并执行“new \ mysqli()”之类的操作。好像有点乱?

  3. 如果一个类从另一个命名空间扩展一个类(比如说Two.php扩展了One.php),那么我需要包含“use \ Classes \ A \ One as One;”在One.php中,这似乎是我们想要首先避免的内容

1 个答案:

答案 0 :(得分:0)

  1. 您不必通过use语句引用所有命名空间类。您可以使用部分名称空间。

    use Classes\A;
    new A\One(); 
    

    因此,您可以看到A名称空间中是否有另一个类,可以使用

    进行实例化
    new A\Three();
    
  2. 全局命名空间中有很多内容,您不需要使用use来定义它们。你可以称他们为\mysqli()。是的,它有点不雅观,但它允许你在自己​​的代码中创建一个名为mysqli的函数,而不必担心与全局命名空间函数的冲突。

  3. 我不确定我是否跟着你这个。您不需要在引用自身的基类中执行use

  4. 最终有点像use看起来差不多include当它们非常不同时use,在这种情况下,这是一件很方便的事情,所以你没有每次都输入完整的命名空间。

    您的Autoloader也不需要了解您的命名空间。自动加载器只是告诉PHP如何加载一个类。因此,如果它看到一个类名为Classes\A\One的类,您可以在目录/Classes/A中查找名为One.php的文件并将其包含在内。 PHP将确保该类在适当的命名空间中分配。自动加载器只是一个方便的事情,让您不必在每个PHP文件中包含和要求。