服务端 - PHP - OOP之类成员定义与访问、类继承和抽象类实现
一、类成员
1. 类属性
- 语法:访问限制符 变量;
- 描述:带有访问控制的变量
- 分类:常规属性、静态属性和抽象属性
- 常规属性:被类实例访问
- 静态属性:被类访问
- 抽象属性:没有被赋值,无法实例化,默认值是null,只能通过子类继承实现
echo '<h3>一、常规属性的定义和访问</h3>';
class Person {
//在类内部定义类的常规属性
public $name = '小明';
public static $age = 18;
public function getName() {
//在类内部访问类的常规属性
return $this->name;
}
}
$p1 = new Person();
//在类外部访问类的常规属性
echo $p1->name;
echo '<br>';
//在类内部访问类的常规属性
echo $p1->getName();
echo '<h3>二、静态属性的定义和访问</h3>';
class Person1 {
public $name = '小红';
//在类内部定义类的静态属性
public static $age = 17;
public function getAge() {
//在类内部访问类的静态属性
return self::$age;
}
}
$p2 = new Person1();
//在类外部访问类的静态属性
echo $p2::$age;
echo '<br>';
//在类内部访问类的静态属性
echo $p2->getAge();
2. 类方法
- 语法:访问限制符 函数;
- 描述:带有访问控制的函数
- 分类:常规方法、静态方法和抽象方法
- 常规属性:public/protected/private
- 静态属性:static。直接用类调用,被所有类实例所共享
- 抽象属性:没有方法体
echo '<h3>一、常规方法的定义和访问</h3>';
class Person {
public $name = '小明';
public static $age = 18;
//在类内部定义类的常规方法
public function getName() {
return $this->name;
}
public function sayName() {
//在类内部调用类的常规方法
echo $this->getName();
}
}
$p1 = new Person();
//在类外部调用类的常规方法
echo $p1->sayname();
echo '<br>';
echo '<h3>二、静态方法的定义和访问</h3>';
class Person1 {
public $name = '小红';
public static $age = 17;
//在类内部定义类的静态方法
public static function getAge() {
return self::$age;
}
public static function sayAge() {
//在类内部调用类的静态方法
echo self::getAge();
}
}
$p2 = new Person1();
//在类外部调用类的静态方法
echo $p2::sayAge();
echo '<br>';
echo '<h3>三、在类方法中访问外部成员</h3>';
$name = '小王';
$age = 19;
$sayName = function() {
global $name;
return '我的名字叫'.$name;
};
class Person2 {
public function hello($v, $a) {
return $v(). ','.'我的年龄是'.$a;
}
}
$p3 = new Person2;
echo $p3->hello($sayName, $age);
3. 类常量
- 语法:const 常量名;
- 描述:在类中始终保持不变的值
二、类继承
- 语法:class 类名 extends 基类名;
- 二类成员:子类有权访问的父类成员类型,public和protected
- 三种操作:子类对父类的三种操作,继承、重写和扩展
- 继承:父类的二类成员自动成为子类的成员
- 重写:覆写与父类/基类同名的成员(属性,方法)
- 扩展:子类添加自身的方法来增加/扩展父类的功能
/*
* 时间:2020年4月30日10:42:47
* 知识点:重写类属性和类方法
* 场景:重写父类的方法并对其进行拓展
*/
echo '<h3>类的继承</h3>';
class Person {
//定义公共的类属性
public $name;
public $sex;
public $age;
public $test = 1;
//使用一个公共方法初始化类属性
public function setInfo($name, $sex, $age)
{
$this->name = $name;
$this->sex = $sex;
$this->age = $age;
}
//定义一个公共方法来获取类属性
public function getSelf() {
return $this->name.$this->sex.$this->age;
}
}
$p1 = new Person;
$p1->setInfo('小明', '男', 18);
echo $p1->test;
echo $p1->getSelf();
echo '<br>';
//定义一个子类
class Student extends Person {
//重写父类的属性
public $test = 2;
public $school = '北京三中';
//重写父类的saySelf方法
//并在该方法中使用parent关键字调用父类被覆盖的saySelf方法
//如果需要父类saySelf方法中的完整代码而又要避免在该方法中对其复制粘贴,因为这样会导致代码冗余
public function getSelf() {
return parent::getSelf().$this->school;
}
//扩展父类的方法
public function saySchool() {
echo '我在'.$this->school.'读书';
}
}
$p2 = new Student;
$p2->setInfo('小红', '女', 17);
echo $p2->test;
echo $p2->getSelf();
echo '<br>';
$p2->saySchool();
三、抽象类
序号 |
描述 |
1 |
抽象类也叫设计类 |
2 |
不能被实例化 |
3 |
只要类中有一个抽象方法,那么这个类就是抽象类 |
4 |
抽象类中允许有抽象成员,但不是强制的,也可以没有,类中也可以定义普通方法 |
5 |
必须实现类中的抽象方法才可以实现此抽象类 |
6 |
抽象类可以被继承 |
- 作用:实现部分分离“设计(抽象类中完成)与实现(工作类中完成)”
- 场景:接口实现
- 抽象方法:没有方法体,不能定义其具体的功能实现
- 抽象方法定义:abstract 访问控制 函数名;
- 抽象类的继承:继承一个抽象类的时候,子类必须定义父类中的所有抽象方法,这些方法的访问控制必须和父类中一样(或者更为宽松)
echo '<h3>抽象类的实现</h3>';
//设计类实现
abstract class aPerson {
protected static $name;
protected static $sex;
protected static $age;
abstract protected function getInfo();
}
//工作类实现
class Student extends aPerson {
protected $school;
public function setInfo($name, $sex, $age, $school) {
self::$name = $name;
self::$sex = $sex;
self::$age = $age;
$this->school = $school;
}
public function getInfo() {
return self::$name.self::$sex.self::$age.$this->school;
}
}
//客户端调用
$user = new Student;
$user->setInfo('小明', '男', 18, '北京三中');
echo $user->getInfo();
四、课程总结
- 今天学习了 PHP 的面向对象编程,通过上课认真听讲和认真完成老师布置的作业,使得我对 PHP 面向对象编程的理解和运用更加深入和熟悉。最主要的知识点是明白和掌握了类成员的定义和访问,单继承、以及抽象类的特点和基本用法。