博客列表 >php学习笔记(类声明,类的实例化,类的静态成员与类的扩展)

php学习笔记(类声明,类的实例化,类的静态成员与类的扩展)

庖丁
庖丁原创
2021年02月04日 14:58:45743浏览

1. 类声明 class

  1. <?php
  2. //声明一个类文件,使用关键字class 后面跟类名,建议首字母大写
  3. class Customer
  4. {
  5. private $name;
  6. private $phone;
  7. private $adress;
  8. //构造方法(系统自动调用的,作用是将属性实例化)
  9. function __construct($name, $phone, $adress)
  10. {
  11. $this->name = $name;
  12. $this->phone = $phone;
  13. $this->adress = $adress;
  14. }
  15. function show()
  16. {
  17. return "{$this->name}的送货地址为{$this->adress},电话号码为{$this->phone}";
  18. }
  19. }

1.1 类的实例化 new

  1. $zhangsan = new Customer('张三',136123456,'石家庄');
  2. echo $zhangsan->show();

1.2 类的静态成员 static

  1. <?php
  2. //声明一个类文件,使用关键字class
  3. class Customer
  4. {
  5. static $name;
  6. static $phone;
  7. static $adress;
  8. //利用构造方法给静态函数传参
  9. public function __construct($name,$phone,$adress)
  10. {
  11. //在类内部调用类的静态成员要用self
  12. self::$name = $name;
  13. self::$phone = $phone;
  14. self::$adress = $adress;
  15. }
  16. static function show(){
  17. return'顾客'.self::$name .'的地址为'.self::$adress.',电话号码为'.self::$phone;
  18. }
  19. }
  20. $user = new Customer('张三','123456','石家庄');
  21. //在类的外部访问静态成员,需要使用类名的方式访问
  22. echo Customer::show();

1.3 类的扩展 extends

  1. <?php
  2. //声明一个类文件,使用关键字class 后面跟类名,建议首字母大写
  3. class Customer
  4. {
  5. protected $name;
  6. protected $phone;
  7. //构造方法(系统自动调用的,作用是将属性实例化)
  8. function __construct($name, $phone)
  9. {
  10. $this->name = $name;
  11. $this->phone = $phone;
  12. }
  13. function show()
  14. {
  15. return "{$this->name}的电话号码为{$this->phone}";
  16. }
  17. }
  18. //声明一个子类
  19. class SonCustomer extends Customer
  20. {
  21. private $adress;
  22. //类的功能扩展1:重写父类的方法 __construct()(构造器)
  23. function __construct($name, $phone, $adress)
  24. {
  25. parent::__construct($name, $phone);
  26. $this->adress = $adress;
  27. }
  28. //类的功能扩展1:重写父类的方法show()
  29. function show()
  30. {
  31. return parent::show().',送货地址为'.$this->adress;
  32. }
  33. //类的功能扩展2:添加新功能
  34. function adress(){
  35. return '送货地址为'.$this->adress;
  36. }
  37. }
  38. //子类实例化
  39. $lisi = new SonCustomer('李四','456789','北京');
  40. echo $lisi->show();
  41. echo $lisi->adress();

2. 描述trait功能

类似于函数库(公共方法集),功能是代码复用。借用了类的方法,但是不能实例化。
在需要引用trait的类中,用关键字use引用它即可。

2.1 trait与父类的区别与联系

当trait中的成员名与父类、子类重名时
优先级 子类>trait>父级

  1. <?php
  2. class Mm{
  3. function name(){
  4. return '这里是父类的name方法';
  5. }
  6. }
  7. trait A1{
  8. function name(){
  9. return '这里是trait A1的name方法';
  10. }
  11. }
  12. class Xingming extends Mm
  13. {
  14. use A1;
  15. }
  16. // 输出 这里是trait A1的name方法
  17. echo (new Xingming)->name();
  18. class Xingming2
  19. {
  20. use A1;
  21. function name(){
  22. return '这里是子类的name方法';
  23. }
  24. }
  25. // 输出 这里是trait A1的name方法
  26. echo (new Xingming2)->name();

2.2 trait 的冲突与优先级的解决方案

当多个trait成员引用时,发生命名冲突,解决方法:使用优先级+别名

  1. <?php
  2. trait A1{
  3. function name(){
  4. return '这里是trait A1的name方法';
  5. }
  6. }
  7. trait A2{
  8. function name(){
  9. return '这里是trait A2的name方法';
  10. }
  11. }
  12. class Xingming{
  13. use A1,A2{
  14. //给A1的name()方法设置优先级
  15. A1::name insteadOf A2;
  16. //给A2的name()方法名设置别名
  17. A2::name as a2name;
  18. }
  19. }
  20. // 输出 这里是trait A1的name方法
  21. echo (new Xingming)->name();
  22. // 输出 这里是trait A2的name方法
  23. echo (new Xingming)->a2name();
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议