Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 我是否正确使用名称空间、自动加载和别名?_Php_Oop_Namespaces_Autoload - Fatal编程技术网

Php 我是否正确使用名称空间、自动加载和别名?

Php 我是否正确使用名称空间、自动加载和别名?,php,oop,namespaces,autoload,Php,Oop,Namespaces,Autoload,我已经读了很多关于StackOverflow的文章,但我不确定我是否正确使用了名称空间、自动加载和别名。这功能正常,但我不确定我是否正确使用了这些概念。我在文章的底部列出了一些我认为这个设置不正确的原因 想象一下以下目录结构: \public_html - index.php \Classes \A - One.php \B - Two.php One.php的结构如下: <?php namespace Classes\A; class A { ...

我已经读了很多关于StackOverflow的文章,但我不确定我是否正确使用了名称空间、自动加载和别名。这功能正常,但我不确定我是否正确使用了这些概念。我在文章的底部列出了一些我认为这个设置不正确的原因

想象一下以下目录结构:

\public_html
  - index.php
  \Classes
   \A
    - One.php
   \B
    - Two.php
One.php的结构如下:

<?php
namespace Classes\A;
class A { ....
<?php
namespace Classes\B;
class B { ....

所以,有几件事让我感到困扰:

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

  • 如果我想使用内部类,我需要在使用它的类中添加一行,如“use\mysqli;”,并执行“new\mysqli()”之类的操作。看起来有点乱

  • 如果一个类从另一个名称空间扩展了一个类(例如,Two.php扩展了One.php),那么我需要在One.php中包含“use\Classes\a\One as One;”,这似乎是我们首先要避免的

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

    use Classes\A;
    new A\One(); 
    
    因此,您可以看到在命名空间中是否有另一个类,可以用它进行实例化

    new A\Three();
    
  • 全局名称空间中有很多东西,您不需要使用
    use
    来定义它们。您可以直接调用它们
    \mysqli()
    。是的,这有点难看,但它允许您在自己的代码中创建一个名为mysqli的函数,而不必担心与全局命名空间函数的冲突

  • 我不确定我在这件事上是否了解你。您不需要在引用自身的基类中使用

  • 最终看来,您查看
    使用
    几乎就像查看
    包含
    一样,当它们非常不同时,
    使用
    ,在这种情况下,是一件方便的事情,因此您不必每次都键入完整的名称空间

    您的自动加载器也不需要知道您的名称空间。自动加载程序只是告诉PHP如何加载类。因此,如果它看到一个名为
    Classes\a\One
    的类,您可以让它在目录
    /Classes/a
    中查找名为One.php的文件并包含它。PHP将确保在适当的命名空间中分配类。autoloader只是一个方便的工具,它可以让您不必在每个PHP文件中执行include和requires操作

    new A\Three();