PHP8.1.21版本已发布
vue8.1.21版本已发布
jquery8.1.21版本已发布

博客列表 > 类的封装、继承和多态

类的封装、继承和多态

王浩
王浩 原创
2021年10月20日 23:12:28 648浏览
  1. 作业内容:1、练习课上所学知识

PHP 封装

可用publicprotectedprivate来修饰对象的属性和方法,使用不同修饰符的属性和方法,其可被访问的权限也不同:

  • 使用public修饰的属性和方法可以在任何地方调用,如果在类中的属性和方法前面没有修饰符,则默认修饰符为public
  • 使用protected修饰的属性和方法可在本类和子类中被调用,在其他地方调用将会报错。
  • 使用private修饰的属性和方法只能在本类中被访问。
  1. <?php
  2. // 定义一个父类
  3. class Father{
  4. public $name; // 姓名(公有)
  5. private $age; // 年龄(私有)
  6. protected $weight; // 体重(保护)
  7. // 构造函数
  8. public function __construct($name, $age, $weight){
  9. $this->name = $name;
  10. $this->age = $age;
  11. $this->weight = $weight;
  12. }
  13. // 根据属性名获取属性值
  14. public function get($key){
  15. return $this->$key;
  16. }
  17. }
  18. class Son extends Father{
  19. // 为了跟父类区别开,重新定义了一个相同功能的方法
  20. public function key($key){
  21. return $this->$key;
  22. }
  23. public function get_weight(){
  24. return $this->weight;
  25. }
  26. }
  27. $obj1 = new Father('sunny', 22, '60kg');
  28. echo $obj1->name; //输出sunny
  29. // echo $obj1->age; //将会报错:Cannot access private property Father::$age,因为age是私有的
  30. // echo $obj1->weight; //将会报错: Cannot access protected property Father::$weight,因为weight是受保护的
  31. echo $obj1->get('age'); //但可以通过公用方法访问
  32. echo $obj1->get('weight'); //但可以在子类内部调用
  33. // --------------华丽的分隔线------------------------------
  34. $obj2 = new Son('rain', 23, '70kg');
  35. echo $obj2->name; // 输出rain
  36. echo $obj2->key("weight"); // 输出70kg,因为weight是protected,可以继承到子类
  37. // echo $obj2->key('age'); // 报错,Undefined property: Son::$age,age变量只能在父类中使用,没有继承到子类
  38. echo $obj2->get('age'); // 输出23,因为这个是调用父类了,所以可以正常显示
  39. ?>

PHP 继承

把一个类作为公共基类,其他的类继承自这个类,则其他类中都具有这个基类的属性和方法,其他类也可各自额外定义自己不同的属性和方法。

类的继承使用关键词extends,在子类中可使用parent访问父类的方法。在子类中可重写父类的方法。

  1. <?php
  2. // 定义一个父类
  3. class Father{
  4. public $name; // 姓名(公有)
  5. private $age; // 年龄(私有)
  6. protected $weight; // 体重(保护)
  7. // 构造函数
  8. public function __construct($name, $age, $weight){
  9. $this->name = $name;
  10. $this->age = $age;
  11. $this->weight = $weight;
  12. }
  13. public function like(){
  14. echo "我爱编程";
  15. }
  16. public function age(){
  17. echo $this->name .'今年'. $this->age . '岁了';
  18. }
  19. protected function get($key){
  20. return $this->$key;
  21. }
  22. // 根据$key设置值$value
  23. public function set($key, $value){
  24. $this->$key = $value;
  25. }
  26. }
  27. // 子类继承父类
  28. class Son extends Father{
  29. // 重写父类方法
  30. public function get($key){
  31. echo $this->$key;
  32. }
  33. public function what(){
  34. echo parent::like(); // 访问父类方法
  35. }
  36. public function getAge(){
  37. $this->age(); // 调用父类继承来的方法
  38. }
  39. }
  40. // 子类会调用父类构造函数初始化实例
  41. $obj = new Son('sunny', 22, '60kg');
  42. $obj->get('name'); // 子类get方法输出sunny
  43. $obj->what(); // 子类what()方法内调用父类like()方法
  44. $obj->set('age', 33); // 直接调用父类继承来的方法
  45. $obj->getAge(); // 子类getAge()方法调用子类从父类继承来的age()方法
  46. ?>

这里需要再介绍一个关键词final,加在方法前,则该方法不允许重写,如果加在类前,则该类不允许被继承

PHP 多态

多态通过继承复用代码而实现,可编写出健壮可扩展的代码,减少流程控制语句(if else)的使用

  1. <?php
  2. class Animal{
  3. // 该方法将会在子类中被重写
  4. public function talk(){
  5. echo '动物会叫';
  6. }
  7. }
  8. class Cat extends Animal{
  9. public function talk(){
  10. echo '小猫喵喵叫';
  11. }
  12. }
  13. class Dog extends Animal{
  14. public function talk(){
  15. echo '小狗汪汪叫';
  16. }
  17. }
  18. function talk($obj){
  19. $obj->talk();
  20. }
  21. talk(new Cat()); // 输出小猫喵喵叫
  22. talk(new Dog()); // 小狗汪汪叫
  23. ?>
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议