博客列表 >类声明与实例化、类的静态成员与类的扩展、trait与父类区别联系、trait冲突与优先级解决方案

类声明与实例化、类的静态成员与类的扩展、trait与父类区别联系、trait冲突与优先级解决方案

吳
原创
2021年02月04日 03:34:01721浏览

1.类声明与实例化

  1. <?php
  2. // class声明一个类
  3. class User
  4. {
  5. // 受保护的属性:可以在当前类与扩展类使用
  6. protected $name;
  7. protected $email;
  8. // 构造方法
  9. public function __construct($name,$email)
  10. {
  11. $this->name = $name;
  12. $this->email = $email;
  13. }
  14. // 公开方法
  15. public function show()
  16. {
  17. return "$this->name : $this->email";
  18. }
  19. }
  20. // new实例化
  21. $obj = new User('张三','guest@qq.com');
  22. echo $obj->show(),'<br>';
  23. ?>

2.类的静态成员与类的扩展

  1. <?php
  2. // 类的静态成员
  3. class Shop
  4. {
  5. // 静态属性
  6. protected static $name;
  7. private static $price;
  8. // 构造方法
  9. public function __construct($name,$price)
  10. {
  11. self::$name = $name;
  12. self::$price = $price;
  13. }
  14. // 静态方法
  15. public static function show()
  16. {
  17. return sprintf('商品名:%s<br>价格:%d',self::$name,self::$price);
  18. }
  19. }
  20. $shop = new Shop('电脑',9999);
  21. echo Shop::show(),'<br>';
  22. echo '<hr>';
  23. // 子类的扩展
  24. class Order extends Shop
  25. {
  26. // 属性扩展
  27. private static $orderid;
  28. // 重写父类构造器
  29. public function __construct($name,$price,$orderid)
  30. {
  31. parent::__construct($name,$price);
  32. self::$orderid = $orderid;
  33. }
  34. // 重写父类普通方法
  35. public static function show():string
  36. {
  37. return parent::show() . "<br>订单号:". self::$orderid;
  38. }
  39. }
  40. $orderid = new Order('小米',3989,123456789);
  41. echo Order::show(),'<br>';
  42. ?>

3.trait功能与trait父类的区别与联系、并实例演示trait冲突与优先级解决方案

trait特征:理解为一个公共方法集、借用class语法实现、但不是类,所以不能实例化
父类可以实例化
trait特征:类使用use关键字、实现代码复用特征类中的方法。
父类:父类使用extends扩展父类,实现代码复用父类中的方法。
类同时扩展父类,又使用trait特征类,同名方法优先级:类自身中的方法 > trait > 扩展的父类

  1. <?php
  2. trait Shop
  3. {
  4. public function s1()
  5. {
  6. return 'Hello,World!';
  7. }
  8. }
  9. // trait的类,使用use关键字引用
  10. class A
  11. {
  12. use Shop;
  13. }
  14. echo (new A)->s1(),'<br>';
  15. echo '<hr>';
  16. // trait的冲突与优先级的解决方案
  17. trait A1
  18. {
  19. public function order()
  20. {
  21. return 'PHP中文网';
  22. }
  23. }
  24. trait A2
  25. {
  26. public function order()
  27. {
  28. return ' : php.cn';
  29. }
  30. }
  31. class B
  32. {
  33. use A1,A2{
  34. // 1.优先级
  35. A1::order insteadOf A2;
  36. // 2.别名
  37. A2::order as orders;
  38. }
  39. }
  40. echo (new B)->order(),(new B)->orders(),'<hr>';
  41. ?>
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议