博客列表 >PHP 学习阶段性总结及静态绑定、属性拦截等

PHP 学习阶段性总结及静态绑定、属性拦截等

PHP新手学习记录
PHP新手学习记录原创
2020年05月14日 11:24:59816浏览

抽象类、trait、继承不完全笔记

后期静态绑定原理与实现

  1. class BaseClass
  2. {
  3. public static function outputClassName()
  4. {
  5. echo '当前类名:' . __CLASS__;
  6. }
  7. public static function outputCurrentClassName()
  8. {
  9. // 输出结果:当前类名:BaseClass
  10. // self::outputClassName();
  11. // 输出结果:当前类名:subClass
  12. // static::称为静态绑定,不再被解析为定义当前方法所在的类
  13. static::outputClassName();
  14. }
  15. }
  16. class subClass extends BaseClass
  17. {
  18. public static function outputClassName()
  19. {
  20. echo '当前类名:' . __CLASS__;
  21. }
  22. }
  23. subClass::outputCurrentClassName();

使用 self::static:: 显示的不同结果:


属性、方法重载(拦截器)

当用户访问一个无权限或不存在的属性、方法时,通过魔术方法动态的创建类的属性和方法。

属性重载

属性的重载通过 __set__get__isset__unset 来分别实现对不存在属性的赋值、读取、判断属性是否设置、销毁属性。


  1. class Car
  2. {
  3. private $array = [];
  4. // 在给私有的属性赋值时,__set() 被调用
  5. public function __set($key, $value)
  6. {
  7. $this->array[$key] = $value;
  8. }
  9. // 读取私有的属性值时,__get() 被调用
  10. public function __get($key)
  11. {
  12. if (isset($this->array[$key])) {
  13. return $this->array[$key];
  14. }
  15. return null;
  16. }
  17. // 当对不可访问属性调用 isset() 或 empty() 时,__isset() 会被调用
  18. public function __isset($key)
  19. {
  20. if (isset($this->array[$key])) {
  21. return true;
  22. }
  23. return false;
  24. }
  25. // 当对不可访问属性调用 unset() 时,__unset() 会被调用。
  26. public function __unset($key)
  27. {
  28. unset($this->array[$key]);
  29. }
  30. }
  31. $car = new Car;
  32. // 使用 __get() 动态创建并赋值 brand
  33. $car->brand = '宝马';
  34. echo "这是一辆 {$car->brand} 牌汽车";
  35. // 可以 isset 变量
  36. printf("isset 检测 \$brand 变量的值:%s", print_r(isset($car->brand), true));
  37. // 可以释放私有变量
  38. unset(isset($car->brand));

方法拦截器

  • 在对象中调用一个不可访问方法时,__call() 会被调用。
  • 在静态上下文中调用一个不可访问方法时,__callStatic() 会被调用。
  • $name 参数是要调用的方法名称。$args 参数是一个枚举数组,包含着要传递给方法 $name 的参数。
  1. class Demo
  2. {
  3. // 方法拦截器
  4. public function __call($name, $args)
  5. {
  6. echo 'demo 方法并不存在,所以直接输出这里的内容。<br>';
  7. }
  8. // 静态方法拦截器
  9. public static function __callStatic($name, $args)
  10. {
  11. echo '静态 demo 方法并不存在,被我拦截了。';
  12. }
  13. }
  14. $demo = new Demo;
  15. $demo->demo();
  16. Demo::demo();

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议