Press "Enter" to skip to content

PHP的命名空间的实现

PHP的命名空间, 实现的还真是简单.
当你有如下代码:

<?php
  namespace Yaf;
  class Application {
  }

其实就相当于, 你声明了一个名字为A\B的类, 当然, 你不能直接这么申明(只是不能在PHP脚本中这么申明).
而在使用过程中, 根据PHP手册中命名空间一节所述, 执行时刻, 无论你是使用use, 还是直接写相对名字, 绝对名字, 最后去class表查询的时候, 都是被转换成了最终的类似上面的类名.
比如:

<?php
  use Yaf  as A;
  $a = new A\Application(); //转换为了Yaf\Application

不能不说, PHP的这种命名空间解决方案 ,是代价最小, 影响最小的解决方案.
对于扩展开发者来说, 这种影响更是微小, 你只需要在INIT_CLASS_ENTRY的时刻, 把原来的形如"Yaf_Application"变为"Yaf\\Application", 就可以实现自己的命名空间.

20 Comments

  1. gartic phone
    gartic phone May 30, 2022

    I have been looking for this information for a long time, thank you very much, the information in this article has helped me a lot in my work. In your spare time, do you often play games to relieve stress?

  2. xiaochen
    xiaochen October 15, 2017

    鸟哥,我用yaf命名空间后,怎么给controller定义啊,我现在在多模块下进行开发,完后想定义一个基类controller,但是一直提示找不到

  3. Anonymous
    Anonymous June 6, 2017

    你好,controller里怎么加命令空间啊,一加就报错,要做api呢,controller之间需要继承的,

  4. おすすめ人気ブランド腕時計, 最高等級時計大量入荷!
    ◆N品質シリアル付きも有り 付属品完備!
    ☆★☆━━━━━━━━━━━━━━━━━━━☆★☆
    以上 宜しくお願い致します。(^0^)
    広大な客を歓迎して買います!── (*^-^*)
    グアム シャネル時計 中古 http://www.buyma.cc/repurika-2960.html

  5. tonbochow
    tonbochow September 16, 2015

    开启命名空间new Yaf\Route_Rewrite 提示找不到

  6. 哇那个
    哇那个 June 25, 2015

    鸟哥,在php7下使用命名空间,会显示exception找不到,咋整?

    • Laruence
      Laruence June 25, 2015

      你给个测试用例?

  7. Parker's Blog
    Parker's Blog May 7, 2014

    […] 声明了命名空间的结果,就是Car的实际名字变成了MyspaceCar(当然,你不能直接这么声明)。 […]

  8. Parker's Weblog
    Parker's Weblog April 12, 2014

    […] 声明了命名空间的结果,就是Car的实际名字变成了MyspaceCar(当然,你不能直接这么声明)。 […]

  9. Parker Chan
    Parker Chan January 27, 2014

    […] 声明了命名空间的结果,就是Car的实际名字变成了MyspaceCar(当然,你不能直接这么声明)。 […]

  10. […] 声明了命名空间的结果,就是Car的实际名字变成了MyspaceCar(当然,你不能直接这么声明)。当一个外部文件include example1.php的时候,无法直接new Car,因为Car只存在于Myspace这个空间,正确地创建实例的做法是new MyspaceCar。 […]

  11. 悠悠猴
    悠悠猴 February 28, 2012

    由于目前的项目中出现了多个同名的类. 为了避免冲突想采用PHP的命名空间. 但是看了下PHP的命名空间感觉有点失望.没有C#的好用. 比如给某个类设置了命名空间.那么得去修改所有调用了该类的文件. 如果这样的话感觉可以不用了命名空间了,直接修改重复的类名就可以了. 在C#中则只要保证不导入多个同名类就可以不去修改代码. 如果导入了多个同名类, 只需要在调用的时候指定使用哪一个命名空间中的类即可.这样才是最方便的. PHP要是也这样该多好啊.

  12. bduss
    bduss October 17, 2010

    这个feature一直是很期待的,没想到最后搞出来这么挫……好难看

  13. 李惟
    李惟 October 13, 2010

    受用了。

  14. Amaranth
    Amaranth October 12, 2010

    鸟哥,用php块两年了,你的文章基本上看不懂,
    大概知道意思,咋整 -_-b

  15. 雪候鸟
    雪候鸟 October 12, 2010

    @lotte 右上角有我的通用联系方式. 🙂

  16. lotte
    lotte October 12, 2010

    一直看你的博客,真是好强啊。能加你好友跟你学习学习吗

Comments are closed.