博主信息
博文 40
粉丝 0
评论 1
访问量 50045
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
PHP 命名空间
Dong.
原创
881人浏览过

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

批改老师:天蓬老师天蓬老师

批改状态:合格

老师批语:注册自动加载器函数是在引用类的时候,由系统自动完成, 与use无关, 它只是为完全限定名称的类起一个别名罢了, 不用它也是一样的
本博文版权归博主所有,转载请注明地址!如有侵权、违法,请联系admin@php.cn举报处理!
全部评论 文明上网理性发言,请遵守新闻评论服务协议
0条评论
作者最新博文
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号

  • 登录PHP中文网,和优秀的人一起学习!
    全站2000+教程免费学