1. 类继承的三大功能: 继承,重写,扩展
- 继承: 父类的二类成员自动成为子类的成员
- 重写: 覆写与父类/基类同名的成员(属性, 方法)
- 扩展: 子类添加自身的方法来增加/扩展父类的功能
/** 示例演示类继承的三大功能 */
// 基类:Animal
abstract class Animal
{
public $type = '哺乳动物';
protected $name = '';
/**
* 介绍自己
*/
public function adviceMyself()
{
return '我是' . $this->name;
}
}
/**
* 继承
* 实现类:Dog
*/
class Dog extends Animal
{
/**
* 属性重写
*/
public $name = '狗';
/**
* 扩展基类
*/
public function WagTail()
{
return '摇尾巴~~~';
}
}
/**
* 继承
* 实现类:Cat
*/
class Cat extends Animal
{
public $name = '猫';
/**
* 重写父类方法
*/
public function adviceMyself()
{
return '我是' . $this->name . ', 我属于' . $this->type . ', 我会' . $this->howl();
}
}
/* 汤姆 */
$tom = new Cat;
/* 史努比 */
$snoopy = new Dog;
// 介绍自己
/* 汤姆介绍自己,调用重写父类的方法 */
echobr($tom->adviceMyself());
/* 史努比介绍自己,调用继承自父类的方法 */
echobr($snoopy->adviceMyself());
// 史努比摇尾巴,扩展父类没有的方法
echobr($snoopy->WagTail());
/*
result:
我是猫, 我属于哺乳动物, 我会喵喵喵~~~
我是狗
喵喵喵~~~
汪汪汪~~~
摇尾巴~~~
*/
2. 抽象类的作用与实现
- - 抽象类的作用: 部分分离了声明与实现, 声明在抽象类中完成, 实现在工作类中完成.
/** 实例演示抽象类的作用与实现 */
// 基类:动物类
abstract class Animal
{
public $type = '哺乳动物';
protected $name = '';
// 不同动物叫的方式不一样,所以定义为抽象方法
abstract public function howl();
}
// 实现类
/* 狗 */
class Dog extends Animal
{
public $name = '狗';
public function howl()
{
return '汪汪汪~~~';
}
}
/* 猫 */
class Cat extends Animal
{
public $name = '猫';
public function howl()
{
return '喵喵喵~~~';
}
}
/* 史努比 */
$snoopy = new Dog;
echobr($snoopy->name . '的叫声是:' . $snoopy->howl());
/* 汤姆 */
$tom = new Cat;
echobr($tom->name . '的叫声是:' . $tom->howl());
/*
result:
狗的叫声是:汪汪汪~~~
猫的叫声是:喵喵喵~~~
*/
3. 接口的基本语法
- 接口完全分离了声明与实现
- 接口使用关键字: interface
- 接口中定义的成员必须是public
- 接口允许多继承, 从而间接实现PHP的多继承
// 定义接口
interface Itf1
{
// 定义接口常量
const MAX = 65535;
// 定义抽象方法(不需要abstract关键字)
public function func1();
}
class Demo1 implements Itf1
{
// 实现接口的抽象方法
public function func1()
{
return __CLASS__ . '类的' . __METHOD__ . '方法';
}
}
// 使用接口中的常量
echobr(Itf1::MAX);
// 调用实现了接口的方法
echobr((new Demo1)->func1());
/*
result:
65535
Demo1类的Demo1::func1方法
*/
4. 学习心得
- 类方法: 也是类成员之一, 就是类中的函数. 大概可以分为普通方法和静态方法和魔术方法. 普通方法可以访问类中定义的所有属性; 静态方法直接用类名调用, 被所有实例共享使用, 静态方法中不能使用$this关键字, 所以静态方法无法访问类中定义的非静态属性; 魔术方法暂未学到.
- 类成员的访问控制: 有公开成员(public), 受保护的成员(protected)和私有成员(private)三种.
- public: 公开成员,默认值, 类外部, 类内部, 以及类的子类中(类的继承上下文环境中), 访问控制符缺省情况下, 默认为public.
- protected: 受保护的成员, 类外部禁止访问, 但是类的内部以及它的继承上下文中可以访问.
- private: 私有成员, 除了当前类可以访问, 类的外部以及类的继承上下文中都禁止访问
- 类继承的三大功能: 继承, 重写, 扩展
- 继承: 父类的二类(public/protected)成员自动成为子类的成员
- 重写: 覆写与父类/基类同名的成员(属性, 方法)
- 扩展: 子类添加自身的方法来增加/扩展父类的功能
- 抽象类
- 部分分离了声明与实现, 声明在抽象类中完成, 实现在工作类中完成. 个人理解, 它实现了一类事物通用的功能方法; 而个性化的功能, 则只做声明, 并不提供实现. 由其子类来实现个性化的功能方法.
- 接口
- 完全分离了声明与实现. 它比抽象类更进一步, 只规定了某一类事物需要有的功能, 但并不给出具体实现. 使用接口可以隐藏业务功能的实现.