博主信息
博文 11
粉丝 0
评论 0
访问量 11789
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
PHP 学习阶段性总结及静态绑定、属性拦截等
PHP新手学习记录
原创
989人浏览过

抽象类、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举报处理!
全部评论 文明上网理性发言,请遵守新闻评论服务协议
0条评论
作者最新博文
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号

  • 登录PHP中文网,和优秀的人一起学习!
    全站2000+教程免费学