博客列表 >服务端 - PHP - OOP之类成员定义与访问、类继承和抽象类实现

服务端 - PHP - OOP之类成员定义与访问、类继承和抽象类实现

郴
原创
2020年04月30日 15:59:32722浏览

服务端 - PHP - OOP之类成员定义与访问、类继承和抽象类实现

一、类成员

1. 类属性

  • 语法:访问限制符 变量;
  • 描述:带有访问控制的变量
  • 分类:常规属性、静态属性和抽象属性
  • 常规属性:被类实例访问
  • 静态属性:被类访问
  • 抽象属性:没有被赋值,无法实例化,默认值是null,只能通过子类继承实现
  1. echo '<h3>一、常规属性的定义和访问</h3>';
  2. class Person {
  3. //在类内部定义类的常规属性
  4. public $name = '小明';
  5. public static $age = 18;
  6. public function getName() {
  7. //在类内部访问类的常规属性
  8. return $this->name;
  9. }
  10. }
  11. $p1 = new Person();
  12. //在类外部访问类的常规属性
  13. echo $p1->name;
  14. echo '<br>';
  15. //在类内部访问类的常规属性
  16. echo $p1->getName();
  17. echo '<h3>二、静态属性的定义和访问</h3>';
  18. class Person1 {
  19. public $name = '小红';
  20. //在类内部定义类的静态属性
  21. public static $age = 17;
  22. public function getAge() {
  23. //在类内部访问类的静态属性
  24. return self::$age;
  25. }
  26. }
  27. $p2 = new Person1();
  28. //在类外部访问类的静态属性
  29. echo $p2::$age;
  30. echo '<br>';
  31. //在类内部访问类的静态属性
  32. echo $p2->getAge();

2. 类方法

  • 语法:访问限制符 函数;
  • 描述:带有访问控制的函数
  • 分类:常规方法、静态方法和抽象方法
  • 常规属性:public/protected/private
  • 静态属性:static。直接用类调用,被所有类实例所共享
  • 抽象属性:没有方法体
  1. echo '<h3>一、常规方法的定义和访问</h3>';
  2. class Person {
  3. public $name = '小明';
  4. public static $age = 18;
  5. //在类内部定义类的常规方法
  6. public function getName() {
  7. return $this->name;
  8. }
  9. public function sayName() {
  10. //在类内部调用类的常规方法
  11. echo $this->getName();
  12. }
  13. }
  14. $p1 = new Person();
  15. //在类外部调用类的常规方法
  16. echo $p1->sayname();
  17. echo '<br>';
  18. echo '<h3>二、静态方法的定义和访问</h3>';
  19. class Person1 {
  20. public $name = '小红';
  21. public static $age = 17;
  22. //在类内部定义类的静态方法
  23. public static function getAge() {
  24. return self::$age;
  25. }
  26. public static function sayAge() {
  27. //在类内部调用类的静态方法
  28. echo self::getAge();
  29. }
  30. }
  31. $p2 = new Person1();
  32. //在类外部调用类的静态方法
  33. echo $p2::sayAge();
  34. echo '<br>';
  35. echo '<h3>三、在类方法中访问外部成员</h3>';
  36. $name = '小王';
  37. $age = 19;
  38. $sayName = function() {
  39. global $name;
  40. return '我的名字叫'.$name;
  41. };
  42. class Person2 {
  43. public function hello($v, $a) {
  44. return $v(). ','.'我的年龄是'.$a;
  45. }
  46. }
  47. $p3 = new Person2;
  48. echo $p3->hello($sayName, $age);

3. 类常量

  • 语法:const 常量名;
  • 描述:在类中始终保持不变的值

二、类继承

  • 语法:class 类名 extends 基类名;
  • 二类成员:子类有权访问的父类成员类型,public和protected
  • 三种操作:子类对父类的三种操作,继承、重写和扩展
  • 继承:父类的二类成员自动成为子类的成员
  • 重写:覆写与父类/基类同名的成员(属性,方法)
  • 扩展:子类添加自身的方法来增加/扩展父类的功能
  1. /*
  2. * 时间:2020年4月30日10:42:47
  3. * 知识点:重写类属性和类方法
  4. * 场景:重写父类的方法并对其进行拓展
  5. */
  6. echo '<h3>类的继承</h3>';
  7. class Person {
  8. //定义公共的类属性
  9. public $name;
  10. public $sex;
  11. public $age;
  12. public $test = 1;
  13. //使用一个公共方法初始化类属性
  14. public function setInfo($name, $sex, $age)
  15. {
  16. $this->name = $name;
  17. $this->sex = $sex;
  18. $this->age = $age;
  19. }
  20. //定义一个公共方法来获取类属性
  21. public function getSelf() {
  22. return $this->name.$this->sex.$this->age;
  23. }
  24. }
  25. $p1 = new Person;
  26. $p1->setInfo('小明', '男', 18);
  27. echo $p1->test;
  28. echo $p1->getSelf();
  29. echo '<br>';
  30. //定义一个子类
  31. class Student extends Person {
  32. //重写父类的属性
  33. public $test = 2;
  34. public $school = '北京三中';
  35. //重写父类的saySelf方法
  36. //并在该方法中使用parent关键字调用父类被覆盖的saySelf方法
  37. //如果需要父类saySelf方法中的完整代码而又要避免在该方法中对其复制粘贴,因为这样会导致代码冗余
  38. public function getSelf() {
  39. return parent::getSelf().$this->school;
  40. }
  41. //扩展父类的方法
  42. public function saySchool() {
  43. echo '我在'.$this->school.'读书';
  44. }
  45. }
  46. $p2 = new Student;
  47. $p2->setInfo('小红', '女', 17);
  48. echo $p2->test;
  49. echo $p2->getSelf();
  50. echo '<br>';
  51. $p2->saySchool();

三、抽象类

  • 语法:abstract class 类名;
  • 特点:
序号 描述
1 抽象类也叫设计类
2 不能被实例化
3 只要类中有一个抽象方法,那么这个类就是抽象类
4 抽象类中允许有抽象成员,但不是强制的,也可以没有,类中也可以定义普通方法
5 必须实现类中的抽象方法才可以实现此抽象类
6 抽象类可以被继承
  • 作用:实现部分分离“设计(抽象类中完成)与实现(工作类中完成)”
  • 场景:接口实现
  • 抽象方法:没有方法体,不能定义其具体的功能实现
  • 抽象方法定义:abstract 访问控制 函数名;
  • 抽象类的继承:继承一个抽象类的时候,子类必须定义父类中的所有抽象方法,这些方法的访问控制必须和父类中一样(或者更为宽松)
  1. echo '<h3>抽象类的实现</h3>';
  2. //设计类实现
  3. abstract class aPerson {
  4. protected static $name;
  5. protected static $sex;
  6. protected static $age;
  7. abstract protected function getInfo();
  8. }
  9. //工作类实现
  10. class Student extends aPerson {
  11. protected $school;
  12. public function setInfo($name, $sex, $age, $school) {
  13. self::$name = $name;
  14. self::$sex = $sex;
  15. self::$age = $age;
  16. $this->school = $school;
  17. }
  18. public function getInfo() {
  19. return self::$name.self::$sex.self::$age.$this->school;
  20. }
  21. }
  22. //客户端调用
  23. $user = new Student;
  24. $user->setInfo('小明', '男', 18, '北京三中');
  25. echo $user->getInfo();

四、课程总结

  • 今天学习了 PHP 的面向对象编程,通过上课认真听讲和认真完成老师布置的作业,使得我对 PHP 面向对象编程的理解和运用更加深入和熟悉。最主要的知识点是明白和掌握了类成员的定义和访问,单继承、以及抽象类的特点和基本用法。
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议