Blogger Information
Blog 60
fans 5
comment 3
visits 65260
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
PHP命名空间
longlong
Original
620 people have browsed it

1. 命名空间的两种写法

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

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

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>';
  1. <?php
  2. // 1. 当前类的命名空间与当前类的文件路径对应起来
  3. namespace inc\lib;
  4. // 2. 类名必须与当前类文件名称相同
  5. class test1 {
  6. const NAME = '果冻';
  7. public static function show ()
  8. {
  9. return __METHOD__;
  10. }
  11. }

6. 总结

Correcting teacher:天蓬老师天蓬老师

Correction status:qualified

Teacher's comments:导图总结的很好
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