【问题标题】:Am I using namespaces, autoload, and aliasing correctly?我是否正确使用命名空间、自动加载和别名?
【发布时间】:2017-05-28 05:54:58
【问题描述】:

我已经阅读了很多关于 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),那么我需要包含“使用 \Classes\A\One 作为 One;”在 One.php 中,这似乎是我们首先要避免的

【问题讨论】:

    标签: php oop namespaces autoload


    【解决方案1】:
    1. 您不必通过 use 语句引用所有命名空间类。您可以使用部分命名空间。

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

      所以你可以看看你是否在 A 命名空间中有另一个类,它可以用它来实例化

      new A\Three();
      
    2. 全局命名空间中有很多东西,你不需要用use定义它们。你可以打电话给他们\mysqli()。是的,这有点难看,但它允许您在自己的代码中创建一个名为 mysqli 的函数,而不必担心与全局命名空间函数发生冲突。

    3. 我不确定我是否关注过你。您无需在引用自身的基类中创建 use

    最终,当useinclude 非常不同时,它们看起来有点像您查看use,在这种情况下,这是一种方便的东西,因此您不必每次都输入完整的命名空间。

    您的 Autoloader 也不需要知道您的命名空间。自动加载器只是告诉 PHP 如何加载一个类。因此,如果它看到一个名为 Classes\A\One 的类进入,您可以让它在目录 /Classes/A 中查找名为 One.php 的文件并包含它。 PHP 将确保该类被分配在正确的命名空间中。自动加载器只是一个方便的东西,让您不必在每个 PHP 文件中执行包含和要求。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-19
      • 1970-01-01
      • 2011-08-06
      • 2013-07-19
      • 2015-07-15
      • 2012-05-21
      相关资源
      最近更新 更多