继承
class User
{
//公开属性
public $name = '王六';
public $age = 16;
//受保护属性
protected $shi = '2001';
//私有属性
private $salary = 9999;
//调用方法
public function write()
{
return "姓名: {$this->name} , 年龄: {$this->age}, 出生时间: {$this->shi}, 工资: $this->salary";
}
}
//子类 extends继承父类所有内容
class Rob extends User
{
}
/客户端调用子类
$user = new User();
echo $user->write() , '<br>';
重写父类属性
class User2
{
//公开属性
public $name = '王六';
public $age = 16;
//受保护属性
protected $shi = '2001';
//私有属性
private $salary = 9999;
//调用方法
public function write()
{
return "姓名: {$this->name} , 年龄: {$this->age}, 出生时间: {$this->shi}, 工资: $this->salary";
}
}
//子类 继承父类所有内容
class Rob2 extends User2
{
//更新属性
private $salary = 29999;
public function write()
{
return "姓名: {$this->name} , 年龄: {$this->age}, 出生时间: {$this->shi}, 工资: $this->salary";
}
}
// 客户端调用子类
$user = new Rob2();
echo $user->write() , '<br>';
扩展 在子类中增加方法
class Rob3 extends User3
{
//更新属性
private $salary = 29999;
//
public function write0()
{
// 在子类中可以引用父类成员
// parent::write()
return parent::write() . ', 喜欢玩游戏!';
}
}
// 客户端调用子类
$user = new Rob3();
echo $user->write0() , '<br>';
抽象类
abstract class User4
{
protected $name = '胡八一';
protected $age = 40;
// 具体方法: 有方法体: {...},
protected function write1()
{
return "姓名: {$this->name} , 年龄: {$this->age}";
}
// 抽象方法:没有方法体
// 只要一个类中有一个抽象方法, 那么这个类就是:抽象类
abstract protected function write2();
}
// 实现类/工作类: 是一个可以被实例化的普通类
// 工作类不一定是可以被实例化的普通类,也可是一个抽象类
// 抽象类也可以被继承, 抽象类也可以用在继承的上下文环境中
// 抽象类中允许有抽象成员, 但不是强制的,也可以没有
abstract class Rob4 extends User4{
protected $aihao = '喜欢玩游戏!';
// 必须将抽象类中的抽象方法实现
protected function write2() {
return parent::write1() . ", 爱好: {$this->aihao}";
}
}
// 最终工作类: 允许实例化
class Work extends Rob4
{
public function write2()
{
return parent::write2();
}
}
// 客户端
$work = new Work();
echo $work->write2();
接口:分离设计与实现
// 接口使用场景1: 单接口
interface iUser
{
// 接口常量
const NATION = '男';
// 接口方法
public static function write();
// 构造方法(略)
}
// 工作类实现接口
class User implements iUser
{
protected static $name = '王六';
// 接口中的抽象方法,必须在工作类实现
public static function write()
{
return self::$name . ' 的性别是: ' . iUser::NATION;
}
}
// 客户端
// 接口常量的访问与类常量一样
// echo iUser::NATION;
echo User::write();
总结:子类自动继承父类所有的内容,可以在子类中更新。抽象类中没有方法,可以被继承不能实例。