博客列表 >属性和方法重载及命名空间与类自动加载器实例演示

属性和方法重载及命名空间与类自动加载器实例演示

李玉峰
李玉峰原创
2022年05月01日 23:30:00378浏览

一、属性与方法重载

重载:就是重定向

1.属性重载:get 查询拦截器,set 更新拦截器
2.方法重载:call 方法拦截器,callStatic 静态方法拦截器
  1. <?php
  2. /**
  3. * 重载:就是重定向
  4. * 1.属性重载:__get(),__set()
  5. * 2.方法重载:__call(),__callStatic()
  6. */
  7. echo '一、属性重载'. '<br>';
  8. class User
  9. {
  10. //创建属性
  11. // private $name = '李老师';
  12. //一般是数组
  13. private $data = [
  14. 'name' =>'李老师',
  15. 'age' => 20
  16. ];
  17. //!__get 查询拦截器
  18. public function __get($name)
  19. {
  20. //$name:属性名
  21. // return $this->name;
  22. // return $this->data[$name];
  23. //查询是否有这个属性名:array_key_exists()
  24. if(array_key_exists($name,$this->data)){
  25. return $this->data[$name];
  26. }
  27. return "属性{$name}不存在";
  28. }
  29. //! __set 更新拦截器
  30. public function __set($name,$value)
  31. {
  32. // 1.有没有这个属性?
  33. if(array_key_exists($name,$this->data)){
  34. // 2.这个值是否合法?
  35. if($name === 'age'){
  36. if($value >= 18 && $value <= 60){
  37. $this->data[$name] = $value;
  38. }else{
  39. echo '您的年龄不在18到60之间';
  40. }
  41. }else{
  42. //以上仅对age有效,其他属性直接赋值
  43. $this->data[$name] = $value;
  44. }
  45. }else{
  46. echo '禁止动态创建属性';
  47. }
  48. }
  49. //! __call 方法拦截器
  50. public function __call($name,$args)
  51. {
  52. //$name:方法名,$args:参数
  53. printf('方法:%s<br>参数:<pre>%s</pre>',$name,print_r($args,true));
  54. }
  55. //! __callStatic 静态方法拦截器
  56. public static function __callStatic($name,$args)
  57. {
  58. //$name:方法名,$args:参数
  59. printf('方法:%s<br>参数:<pre>%s</pre>',$name,print_r($args,true));
  60. }
  61. }
  62. $user = new User;
  63. echo $user->name .'<br>';
  64. /**
  65. * 赋值考虑两件事
  66. * 1.有没有这个属性?
  67. * 2.这个值是否合法?
  68. */
  69. // 动态创建
  70. $user->age = 30;
  71. // 查看输出
  72. echo $user->age.'<br>';
  73. //禁止动态创建
  74. echo '<hr>';
  75. echo '二、方法重载' . '<br>';
  76. //常规方法/非静态方法:用实例调用
  77. $user->hello('李老师','zaikun.cn');
  78. //静态方法
  79. User::world(100,200);

二、属性与方法重载实现数据查询

  1. <?php
  2. //方法重载小案例
  3. // Db::table('think_user')->where('id', 1)->find();
  4. //1.查询类
  5. class Query
  6. {
  7. //第一个table方法
  8. public function table($table)
  9. {
  10. //返回当前类实例,方便调用
  11. return $this;
  12. }
  13. //第二个where方法
  14. public function where($where){
  15. //返回当前类实例,方便调用
  16. return $this;
  17. }
  18. //第二个find方法,无参数
  19. public function find(){
  20. //不需要返回当前类实例,直接输出最终结果
  21. return ['id'=>1,'name'=>'李老师','qq'=>'15030552'];
  22. }
  23. }
  24. //调用
  25. $query = new Query;
  26. // $query->table('think_user');
  27. // $query->where('id', 1);
  28. // $query->find();
  29. // 简化
  30. $query->table('think_user')->where('id', 1)->find();
  31. //2.入口类:实现请求转发
  32. class Db{
  33. //静态方法重定向
  34. public static function __callStatic($name,$args)
  35. {
  36. // //$name:方法名,$args:参数
  37. // $query = new Query;
  38. // // $query->table('think_user');
  39. // //table 就是传入的方法名$name,think_user就是传入的参数$args
  40. // return $query->$name($args);
  41. //回调的方式来执行对象方法,简化以上代码
  42. return call_user_func_array([new Query,$name],$args);
  43. }
  44. }
  45. //静态方法
  46. $res = Db::table('think_user')->where('id', 1)->find();
  47. printf('<pre>%s</pre>',print_r($res,true));

三、命名空间与类自动加载器

类文件自动加载器autoloader.php

  1. <?php
  2. // 类文件自动加载器
  3. //注册一个类的自动加载器
  4. spl_autoload_register(function($class){
  5. // echo $class;
  6. //1.将命名空间 =》 映射到一个类文件的绝对路径
  7. $path = str_replace('\\',DIRECTORY_SEPARATOR,$class);
  8. //2.生成文件路径
  9. $file = __DIR__ . DIRECTORY_SEPARATOR . $path . '.php';
  10. //3.加载类文件
  11. require $file;
  12. });

命名空间

1.一个文件只允许声明一个命名空间并只写一个类

2.命名空间的名称,应该与成员的路径一致

3.类名,必须与类文件名对应

  1. <?php
  2. //命名空间
  3. //1.一个文件只允许声明一个命名空间并只写一个类
  4. //2.命名空间的名称,应该与成员的路径一致
  5. //3.类名,必须与类文件名对应
  6. namespace ns1;
  7. // require __DIR__ . '/admin/index/demo1.php';
  8. // echo '<br>';
  9. // require __DIR__ . '/admin/index/demo2.php';
  10. // echo '<br>';
  11. // require __DIR__ . '/admin/index/demo3.php';
  12. // echo '<br>';
  13. // require __DIR__ . '/admin/index/demo4.php';
  14. // echo '<br>';
  15. // 自动加载
  16. //注册一个类的自动加载器
  17. // spl_autoload_register(function($class){
  18. // // echo $class;
  19. // //1.将命名空间 =》 映射到一个类文件的绝对路径
  20. // $path = str_replace('\\',DIRECTORY_SEPARATOR,$class);
  21. // //2.生成文件路径
  22. // $file = __DIR__ . DIRECTORY_SEPARATOR . $path . '.php';
  23. // //3.加载类文件
  24. // require $file;
  25. // });
  26. require __DIR__ . '/autoloader.php';
  27. // new \admin\index\Demo2;
  28. // 命名冲突
  29. class demo2
  30. {
  31. }
  32. echo Demo2::class . '<br>';
  33. echo \admin\index\Demo2::class . '<br>';
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议