博客列表 >服务端 - PHP - OOP之延迟静态绑定、构造方法和重载

服务端 - PHP - OOP之延迟静态绑定、构造方法和重载

郴
原创
2020年05月09日 12:03:46711浏览

服务端 - PHP - OOP之延迟静态绑定、构造方法和重载

一、延迟静态绑定

  • 解释:将类实例的创建过程上移到它的基类中
  • 语法:static::类成员
  • 特点:由调用者决定绑定的静态继承上下文环境
  • 作用:将类的定义和类的调用分离
  • 场景:动态绑定静态成员的调用上下文
  1. //定义一个基类
  2. class A {
  3. public static $name = '小明';
  4. public static function sayName() {
  5. return '我的名字叫'.static::$name;
  6. }
  7. }
  8. //定义一个扩展类
  9. class B extends A {
  10. public static $name = '小红';
  11. }
  12. //客户端代码
  13. echo B::sayName();//调用B类继承自A类的sayName方法,绑定的是B类的环境

二、构造方法

  • 定义:__construct()
  • 调用:在类的实例化过程中被自动调用
  • 特征:1. 生成一个新对象/类实例;2. 初始化这个新对象:给这个新对象添加属性并赋值,或自动执行某些操作方法;3. 返回这个刚刚创建并初始化的对象
  • 场景:在实例化的时候,使用构造方法自动完成类属性的初始化/赋值
  1. //定义一个工作类
  2. class SetPersonInfo {
  3. function __construct($name, $sex, $age)
  4. {
  5. $this->name = $name;
  6. $this->sex = $sex;
  7. $this->age = $age;
  8. }
  9. }
  10. //客户端代码
  11. $p1 = new SetPersonInfo('小明', '男', 18);
  12. echo $p1->name;
  13. echo $p1->sex;
  14. echo $p1->age;
  15. echo '<br>';
  16. $p1 = new SetPersonInfo('小红', '女', 17);
  17. echo $p1->name;
  18. echo $p1->sex;
  19. echo $p1->age;

三、重载

1. 属性拦截器

  1. //定义一个工作类
  2. class Person {
  3. //定义一个私有属性:用于演示属性查询和检测拦截器
  4. private $name;
  5. //定义一个私有属性:用于演示属性设置和销毁拦截器
  6. private $age;
  7. //初始化$name属性
  8. public function __construct($name)
  9. {
  10. $this->name = $name;
  11. }
  12. //设置属性查询拦截转发器
  13. public function __get($property)
  14. {
  15. //事先约定一些方法用于处理属性访问
  16. $method = 'get' . ucfirst($property);
  17. //转发访问请求
  18. return method_exists($this, $method) ? $this->$method() : null;
  19. }
  20. //处理属性访问的方法1
  21. public function getName() {
  22. return mb_substr($this->name, 0);
  23. }
  24. //处理属性访问的方法2
  25. public function getAge() {
  26. return $this->age;
  27. }
  28. //设置属性设置拦截转发器
  29. public function __set($property, $value)
  30. {
  31. //事先约定一些方法用于处理属性设置
  32. $method = 'set' . ucfirst($property);
  33. //转发访问请求
  34. return method_exists($this, $method) ? $this->$method($value) : null;
  35. }
  36. //处理属性设置的方法
  37. public function setAge($value) {
  38. $this->age = $value;
  39. }
  40. //设置属性检测拦截转发器
  41. public function __isset($property)
  42. {
  43. //返回检测结果
  44. return $property === 'name' ? isset($this->name) : false;
  45. }
  46. //设置属性销毁拦截转发器
  47. public function __unset($property)
  48. {
  49. //进行销毁处理
  50. if ($property === 'age') {
  51. unset($this->age);
  52. }
  53. }
  54. }
  55. //客户端代码
  56. $p1 = new Person('小明');//定义一个对象
  57. echo $p1->name; //访问私有属性触发查询拦截转发器
  58. $p1->age = 18; //设置私有属性触发设置拦截转发器
  59. echo $p1->age; //访问私有属性触发查询拦截转发器
  60. echo isset($p1->name) ? '存在' : '不存在';//检测私有属性触发检测拦截器
  61. unset($p1->age); //删除私有属性触发删除拦截器
  62. echo $p1->age; //访问私有属性触发查询拦截转发器,发现没有值返回

2. 方法拦截器

  1. //定义一个工作类
  2. class Person {
  3. //定义普通方法拦截器
  4. public function __call($name, $arguments)
  5. {
  6. printf('方法名: %s , 参数: [%s]', $name, implode(', ', $arguments));
  7. }
  8. //定义静态方法拦截器
  9. public static function __callStatic($name, $arguments)
  10. {
  11. printf('静态方法名: %s , 参数: [%s]', $name, implode(', ', $arguments));
  12. }
  13. }
  14. //客户端代码
  15. $p1 = new Person();
  16. $p1->getName('小明', '小红', '小王', '小倩');
  17. echo '<br>';
  18. Person::getName('小明', '小红', '小王', '小倩');

四、课程总结

  • 今天学习了 PHP 的面向对象编程,通过上课认真听讲和认真完成老师布置的作业,使得我对 PHP 面向对象编程的理解和运用更加深入和熟悉。最主要的知识点是明白和掌握了延迟静态绑定、构造函数和拦截器的特点以及它们的基本用法。
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议