Blogger Information
Blog 40
fans 0
comment 1
visits 39772
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
PHP 命名空间
Dong.
Original
635 people have browsed it

1. 命名空间的2中写法 namespace

1.1 方法 1

  1. <?php
  2. // 命名空间:方式一
  3. // 此种声明方式,不能在同脚本中声明匿名空间(全局空间)
  4. namespace ns1;
  5. interface iDemo
  6. {
  7. public function show();
  8. }
  9. class Demo implements iDemo
  10. {
  11. public $name = '果冻';
  12. public function show ()
  13. {
  14. return $this->name;
  15. }
  16. }
  17. $obj = new Demo();
  18. echo $obj->show(),'<hr>';
  19. // 普通写法
  20. // function ff ($obj)
  21. // 如果要声明函数中参数的类型,如下:
  22. // 1. 使用类名 Demo
  23. // function ff (Demo $obj)
  24. // 2. 使用接口名 iDemo,在有接口的的情况下,最好这样使用
  25. function ff (iDemo $obj)
  26. {
  27. echo $obj->show(),'<hr>';
  28. }
  29. ff($obj);
  30. // 在命名空间中访问其他命名空间中的成员
  31. namespace ns2;
  32. // \ : 表示全局空间
  33. $obj1 = new \ns1\Demo();
  34. echo $obj1->show(),'<hr>';
  35. \ns1\ff($obj1);

1.2 方法 2

  1. <?php
  2. // 命名空间:方式二
  3. // 这样的方式就可以在同脚本中声明全局空间(匿名空间)
  4. namespace ns1
  5. {
  6. class Demo
  7. {
  8. public static function show ()
  9. {
  10. return __METHOD__;
  11. }
  12. }
  13. }
  14. namespace ns2
  15. {
  16. // 1. 访问ns1中的show()方法
  17. echo \ns1\Demo::show(),'<hr>';
  18. // 2. 查看当前类全名
  19. echo \ns1\Demo::class,'<hr>';
  20. }
  21. // 全局空间中访问时,可以省略第一个 \
  22. namespace
  23. {
  24. // 1. 访问ns1中的show()方法
  25. echo ns1\Demo::show(),'<hr>';
  26. // 2. 查看当前类全名
  27. echo ns1\Demo::class,'<hr>';
  28. // 因为有了全局空间, 那么全局成员的声明就不应该放在全局,而应该放在空间中
  29. // 因此,全局空间应该主要写对全局对象的调用
  30. }

2. 命名空间的类名引用

  1. <?php
  2. // 命名空间类名的引用
  3. namespace ns1;
  4. class Demo{}
  5. namespace ns2;
  6. class Demo{}
  7. namespace ns3;
  8. // 1. 限定名称:不从根开始但有路径(省略和当前空间名称相当的部分)
  9. echo \ns3\sub\Demo::class,'<hr>';
  10. echo sub\Demo::class,'<hr>';
  11. namespace ns3\sub;
  12. class Demo{}
  13. // 2. 完全限定名称:从根开始且有路径
  14. echo \ns1\Demo::class,'<hr>';
  15. // 3. 非限定名称:没有根也没有路径(当前空间)
  16. echo Demo::class;

3. 命名空间的别名

  1. <?php
  2. // 命名空间的别名
  3. namespace ns1;
  4. class Demo{}
  5. class Test{}
  6. namespace ns2;
  7. class Demo{}
  8. // 1. 空间级别名
  9. echo \ns1\Demo::class,'<hr>';
  10. use \ns1 as n;
  11. echo n\Demo::class,'<hr>';
  12. // 2. 类级别名
  13. use \ns1\Demo as d;
  14. echo d::class,'<hr>';
  15. // 3. 简写:前提是当前空间中不能有同名的类
  16. // use \ns1\Test as Test;
  17. use \ns1\Test;
  18. echo Test::class,'<hr>';
  19. // class Test{} 若有同名的类会报错
  20. // 4. 若在当前空间,可一省略 \
  21. use ns2\Demo as dd;
  22. echo dd::class;

4. 访问类和内置函数的区别

  1. <?php
  2. // 示例一:
  3. namespace ns1
  4. {
  5. function print_r ($arr)
  6. {
  7. return '我在打印 : '.implode(',',$arr);
  8. }
  9. // 1. 访问类时,都要加 \
  10. echo \Arr::NAME,'<hr>';
  11. // 2. 访问函数时
  12. // 2.1 若不加 \ ,访问到当前空间的自定义函数
  13. echo print_r(\Arr::$arr);
  14. echo '<hr>';
  15. // 2.2 若加 \ ,此时到了全局空间中查找,调用了PHP内置函数
  16. \print_r(\Arr::$arr);
  17. echo '<hr>';
  18. }
  19. namespace
  20. {
  21. class Arr{
  22. const NAME = '果冻';
  23. public static $arr = ['aa','bb','cc'];
  24. }
  25. }
  26. // 示例二:
  27. namespace ns2
  28. {
  29. function var_dump($name)
  30. {
  31. echo '我的名字叫 : ' . $name;
  32. }
  33. var_dump(\Arr::NAME);
  34. echo '<hr>';
  35. \var_dump(\Arr::NAME);
  36. }

5. 类的自动加载

  1. <?php
  2. // 类的自动加载
  3. try{
  4. spl_autoload_register(function($class){
  5. $path = str_replace('\\',DIRECTORY_SEPARATOR,$class);
  6. $file = __DIR__.DIRECTORY_SEPARATOR.$path.'.php';
  7. if (!(is_file($file) && file_exists($file)))
  8. throw new \Exception('不是文件名文件不存在');
  9. require $file;
  10. });
  11. }catch(Exception $e){
  12. die($e->getMessage());
  13. }
  14. echo inc\lib\test1::NAME,'<hr>';
  15. echo inc\lib\test1::show(),'<hr>';
  16. echo inc\lib\test2::class,'<hr>';
  17. echo inc\lib\test3::class,'<hr>';
  18. <?php
  19. // 1. 当前类的命名空间与当前类的文件路径对应起来
  20. namespace inc\lib;
  21. // 2. 类名必须与当前类文件名称相同
  22. class test1 {
  23. const NAME = 'peter';
  24. public static function show ()
  25. {
  26. return __METHOD__;
  27. }
  28. }

总结

  • 用namespace关键字来定义命名空间

  • 命名空间分为完全限定名称,限定名称和非限定名称

  • 完全限定名称:从全局空间开始,前面总是由一个”\”

  • 限定名称:类名总是会有一个或者多个空间名称,但不是从全局开始

  • 非限定名称:就是不带有空间名称的类

  • 别名的使用:use 命名空间名称 as 自定义名称

  • 类的自动加载:用spl_autoload_register()函数

  • 对类的自动加载有了初步认识,就是sql_autoload_register()这个函数有点难理解,不知道这个$class这个变量的值具体是怎么赋值的,我的理解是使用use时把命名空间名称赋值给$class

Correcting teacher:天蓬老师天蓬老师

Correction status:qualified

Teacher's comments:注册自动加载器函数是在引用类的时候,由系统自动完成, 与use无关, 它只是为完全限定名称的类起一个别名罢了, 不用它也是一样的
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post