Blogger Information
Blog 11
fans 0
comment 0
visits 9125
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
PHP 学习阶段性总结及静态绑定、属性拦截等
PHP新手学习记录
Original
824 people have browsed it

抽象类、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();

Correcting teacher:天蓬老师天蓬老师

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