重载之set/get/call/callStatic,oop事件委托,数据库查询构造器" class="reference-link">PHP:oop->重载之set/get/call/callStatic,oop事件委托,数据库查询构造器

魔术方法含义
__set()__set(name,value),第一个值是成员属性名称,第二个值是成员属性值
__get()__get(name),第一个值是成员名称或者成员属性值
  • php重载 PHP所提供的重载(overloading)是指动态地创建类属性和方法。我们是通过魔术方法(magic methods)来实现的。

  • 当调用当前环境下未定义或不可见的类属性或方法时,重载方法会被调用。

①重载之__set()

在类中,如果实列未创建的成员属性会自动访问__set方法__set(name,value),第一个值是成员属性名称,第二个值是成员属性值

②重载之__get()

在类中,如果输出未创建的成员属性会自动访问__get()方法__get(name),第一个值是成员名称或者成员属性值

③属性拦截

判断身份证信息超过18位输出不合法

身份证信息判断未18位后,输出前5位,后4位

代码块

  1. <?php
  2. //php重载 之 属性重载 属性拦截器
  3. use Credit as GlobalCredit;
  4. class Credit
  5. {
  6. //私有成员属性
  7. private $idNum;
  8. private $age;
  9. //构造器
  10. public function __construct($idNum,$age)
  11. {
  12. $this->idNum = $idNum;
  13. $this->age = $age;
  14. }
  15. //建立 set / get 中转站 把获取到的数据转入一个私有的方法中过滤
  16. public function __set($name, $value)
  17. {
  18. //根据属性名称$name 生成对应的属性访问私有接口的名称
  19. // ucfirst — 将字符串的首字母转换为大写
  20. $method = "set" . ucfirst($name) ;
  21. //method_exists — 检查类的方法是否存在 第一个值传递对象 第二个值传递对象中的方法
  22. return method_exists($this,$method) ? $this->$method($name,$value) : null;
  23. }
  24. //设置set 私立方法进行内容过滤
  25. private function setIdNum($name,$value)
  26. {
  27. //property_exists — 检查对象或类是否具有该属性 第一个值是类,第二个值是属性名称
  28. if (property_exists($this,$name)) {
  29. //判断属性值是否等于18位,不等于的话返回null
  30. return $this->$name = strlen($value) == 18 ? $value : null;
  31. }
  32. }
  33. public function __get($name)
  34. {
  35. $method = "get" . ucfirst($name);
  36. return method_exists($this,$method) ? $this->$method($name) : null;
  37. }
  38. private function getIdNum($name)
  39. {
  40. //empty — 检查一个变量是否为空
  41. if (property_exists($this,$name) && !empty($this->$name)) {
  42. //返回前面5位数字 和 后4位数字
  43. return mb_substr($this->$name,0,5) . "......" . mb_substr($this->$name,-4,4);
  44. }else {
  45. return "身份证信息不合法";
  46. }
  47. }
  48. }
  49. //在外部实例化Credit类
  50. $User = new Credit("360723198905010042",32);
  51. $User->idNum = "360723199905050012";
  52. echo $User->idNum;
  53. // echo $User->idNums;

二.方法重载

魔术方法之call()和callStatic()
__call()方法:当对象访问不存在的方法名称时,此方法自动调用。

  • 调用示例:public function __call($name,$argument){}
    注意:访问控制关键字必须为public;必须有两个参数:对象访问的方法名称($name)、方法包含的参数($argument ==> 自动转换成数组)。

__callStatic()方法:当对象访问不存在的静态方法名称时,此方法自动调用。

  • 调用示例:public static function callStatic($name,$argument){}
    注意:同
    call();此方法为静态方法(static)。
魔术方法含义
__call($name,$argument)第一个参数是对象访问的方法名称,第二个参数是方法包含的参数自动转换成数组
__callstatic()同__call();此方法为静态方法(static)

①__call()

当我们调用没有创建的方法的时候 会自动调用__call方法 和属性调用__set一样

②__callstatic()

__callStatic 调用未定义静态方法的时候触发,参数和__call一样

代码块

  1. <?php
  2. /*
  3. *方法重载(方法拦截器)
  4. *|__call($name,$argument)|
  5. *第一个参数是对象访问的方法名称,
  6. *第二个参数是方法包含的参数自动转换成数组
  7. */
  8. class User {
  9. public function __call($name, $arguments)
  10. {
  11. return "方法名称是:$name,方法属性是:".implode(",",$arguments);
  12. }
  13. public static function __callStatic($name, $arguments)
  14. {
  15. return "静态方法名称是:$name,静态方法属性是:".implode(",",$arguments);
  16. }
  17. }
  18. //当我们调用没有创建的方法的时候 会自动调用__call方法 和属性调用__set一样
  19. echo (new User)->list("admin@qq.com","13456");
  20. echo "<hr>";
  21. echo User::demo("徐峥","泰囧","港囧");

三.事件委托

  • 事件委托 : 访问类中不存在的成员方法时, 会被魔术方法拦截, 把请求重定向到别的类的成员方法来处理

代码块

  1. <?php
  2. // 事件委托 : 访问类中不存在的成员方法时, 会被魔术方法拦截, 把请求重定向到别的类的成员方法来处理
  3. //被委托的类
  4. class User
  5. {
  6. //CALL 普通未定义方法
  7. public function write(...$arr)
  8. {
  9. printf("调用方法%s(),参数有:[%s]<br>",__METHOD__,implode(",",$arr));
  10. }
  11. //CALLSTATIC 普通未定义静态方法
  12. public static function fetch(...$arr)
  13. {
  14. printf("调用静态方法%s(),参数有:[%s]<br>",__METHOD__,implode(",",$arr));
  15. }
  16. }
  17. //工作类
  18. class work
  19. {
  20. //如果希望一个属性可以在多个类中共享, 可以将该属性放到某个类中的构造函数中
  21. private $user;
  22. public function __construct( $User)
  23. {
  24. $this->user = $User;
  25. }
  26. //创建未定义方法的时候委托到User类里面的方法来处理
  27. public function __call($method,$arr)
  28. {
  29. //用异步请求的方式进行委托,这样可以优化性能
  30. call_user_func([$this->user,"write"],...$arr);
  31. }
  32. public static function __callStatic($method, $arr)
  33. {
  34. call_user_func(["user","fetch"],...$arr);
  35. }
  36. }
  37. //把委托类传递到工作类的成员属性$User中
  38. $user = new User();
  39. $Work = new work($user);
  40. $Work->list(50,60,70);
  41. work::list(1,2,3);

三.数据库查询构造器

代码块

  1. <?php
  2. /**
  3. * 事件委托 : 数据库查询构造器
  4. * Db::table()->field()->where()->limit()->select()->toArray();
  5. *
  6. */
  7. //被委托的类
  8. class Query
  9. {
  10. protected $db;//pdo连接对象
  11. protected $table;
  12. protected $field;
  13. protected $limit;
  14. //连接数据库
  15. private function connect($dns,$username,$password)
  16. {
  17. $this->db = new PDO($dns,$username,$password);
  18. }
  19. //构造器 传递参值
  20. public function __construct($dns,$username,$password)
  21. {
  22. $this->connect($dns,$username,$password);
  23. }
  24. //数据表方法
  25. public function table($table)
  26. {
  27. $this->table = $table;
  28. return $this;
  29. }
  30. public function field($field)
  31. {
  32. $this->field = $field;
  33. return $this;
  34. }
  35. public function limit($limit)
  36. {
  37. $this->limit = $limit;
  38. return $this;
  39. }
  40. //sql访问语句
  41. public function getSQL()
  42. {
  43. return sprintf("SELECT %s FROM %s LIMIT %d",$this->field,$this->table,$this->limit);
  44. }
  45. //执行查询
  46. public function select()
  47. {
  48. return $this->db->query($this->getSQL())->fetchAll(PDO::FETCH_ASSOC);
  49. }
  50. }
  51. //工作类
  52. class Db
  53. {
  54. static function __callStatic($method,$args)
  55. {
  56. $dns = "mysql:host=localhost;dbname=zwz";
  57. $username = "root";
  58. $password = "a123456";
  59. $query = new Query($dns,$username,$password);
  60. //直接委托给Query
  61. return call_user_func([$query,$method],...$args);
  62. }
  63. }
  64. $user = Db::table()
  65. ->field()
  66. ->limit()
  67. ->select();
  68. echo '<pre>';
  69. print_r($res);

更多相关文章

  1. CPU到底在忙啥?CPU利用率的正确计算方法
  2. 开源APM工具PinPoint部署方法
  3. IDEA最新激活码2021(IDEA2021.6永久激活方法)教程
  4. 【PHP 面向对象】面向对象(OOP)编程知识点归纳总结(二)
  5. QT5 关于object基类实现的多线程操作,movetothread方法的使用
  6. (1)pyqt5教程--->fristwindow(代码结构)
  7. PHP:oop->抽象类/接口/后期静态绑定/单例模式连接数据库 Db类中
  8. <JVM上篇:内存与垃圾回收篇>02-类加载子系统
  9. PHP面试题2021大全(二)

随机推荐

  1. Python 学习笔记二
  2. python 报错——Python TypeError: 'modu
  3. python获取外网IP并发邮件
  4. 在Python中,如何在使用WPF的程序中自动控
  5. CentOS下实现Flask + Virtualenv + uWSGI
  6. PySide-QtWebKit: CSS font-family没有效
  7. python学习笔记10(函数一): 函数使用、调用
  8. python爬取csdn的博客内容
  9. 利用python Pandas进行数据预处理
  10. python 带正则的search 模块