Blogger Information
Blog 33
fans 0
comment 0
visits 18729
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
属性和方法重载及命名空间与类自动加载器实例演示
李玉峰
Original
379 people have browsed it

一、属性与方法重载

重载:就是重定向

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>';
Correcting teacher:PHPzPHPz

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