类的继承
//父类
class User
{ //public:公开成员 类的继承上下文环境中
//protected:受保护的成员,类外部禁止访问,类的内部以及它的继承上下文中可以访问
//private:私有成员,只能在当前类访问
public $name = '张三';
protected $age = 50;
protected $salary = 9999;
public static $nationality = '中国/CHINA';
//类中方法可以访问类中所有成员
public function write(){
return "姓名:{$this->name},年龄:{$this->age},工资:{$this->salary}";
}
}
//子类
class Rob extends User{
//1.继承:父类的public和protected自动成为子类的成员
//2.重写:覆写与父类同名的成员(属性和方法)
//3.扩展:子类添加自身的方法来增加/扩展父类的功能
//1.重写父类成员
//属性重写
public $name = '李四';
//方法重写 在子类中引用父类成员用parent:: 如果想禁止方法重写在作用域public前加上final 如果想禁止整个类被重写在class前加final
public function write(){
//return "姓名:{$this->name},年龄:{$this->age},工资:{$this->salary}.是一个摸金的~~~。";
return parent::write().',是一个摸金的~~~。';
}
//2.扩展
//属性扩展
protected $profession = '摸金校尉';
//方法扩展
public function write1(){
return parent::write().",职业:{$this->profession}。";
}
}
$user = new User;
echo $user->write().'<br>';
$rob = new Rob;
echo $rob->write().'<br>';
echo $rob->write1();
2.抽象类的作用与实现
//抽象类:部分分离了“设计与实现” abstract关键字
//抽象类不能实例化
abstract class User
{
protected $name = '张三';
protected $age = 40;
//方法有方法体
public function write()
{
return "姓名:{$this->name},年龄:{$this->age}";
}
//没有方法体
abstract protected function write1();
}
class Rob extends User{
protected $profession = '普通职员';
public function write1()
{
return parent::write()."职业:{$this->profession}";
}
}
// $user = new User;
// echo $user->write();
$rob = new Rob;
echo $rob->write1();
3.接口
//接口:完全分离了设计与实现
//关键字:interface
//使用与类相似的语法:抽象方法,常量,构造方法
//默认访问控制必须是public
//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 User::write();
总结
类的继承:public和protected子类可以继承所有父类中的属性和方法,但是private属性在子类中是不能被访问的。
类的扩展:子类中可以添加自己的属性和方法。
类的重写:父类中的属性和方法可以在子类中被重新定义。
抽象类是不可以被实例化的类,但是可以被继承,实现了设计和实现部分分离
接口中可以定义抽象方法(没有方法体的方法),普通类继承后必须重写并且实现该方法,实现了设计与实现完全分离