批改状态:合格
老师批语:看来你是悟到了, 趁早定个假发, 早晚用得上
继承:父类的二类成员自动成为子类的成员。重写:覆写与父类/基类同名的成员(属性,方法)。扩展:子类添加自身的方法来增加/扩展父类的功能。
代码举例:
class User{public $name = 'apple';protected $number = '078';private $age= '31';// protected static $nationality: '中国/CHINA';public function write(){return "姓名 : {$this-> name} . 工号 :{$this-> number}";}}class Rob extends User{protected $number = '066';public function write(){//在子类中可以引用父类成员// parent::write()return parent::write() . ' 他的工作能力很强,可重点培养。' ;}protected $profession = ' IT大神';//属性扩展//方法扩展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() . '<br>';
输出效果:
要理解什么是抽象类,就要先知道什么是抽象方法。我们在类里面定义的没有方法体的方法就是抽象方法。所谓的没有方法体指的是,在声明的时候没有大括号以及其中的内容,而是直接在声明时在方法名后加上分号结束,另外在声明抽象方法时方法还要加一个关键字”abstract”来修饰。
如:
abstract function fav1();abstract function fav2();
所以,只要一个类里面有一个方法是抽象方法,那么这个类就定义为抽象类,抽象类也要使用“abstract”关键字来修饰;在抽象类里面可以有不是抽象的方法和成员属性,但只要有一个方法是抽象的方法,这个类就必须声明为抽象类,使用“abstract”修饰。
如:
abstract class User{var $test;abstract function fav1();abstract function fav2();function fav3(){...}}
注意:
抽象类不能实例化,只能被继承。任何一个类,如果它里面至少有一个方法是被声明为抽象的,那么这个类就必须被声明为抽象的。抽象类不一定有抽象方法,有抽象方法的类,一定是抽象类。抽象方法的可见性不能是private。抽象方法在子类中,需要重写。被定义为抽象的方法只是声明了其调用方式(参数),不能定义其具体的功能实现。继承一个抽象类的时候,子类必须定义父类中的所有抽象方法。另外,这些方法的访问控制必须和父类中一样(或者更为宽松)。例如某个抽象方法被声明为受保护的,那么子类中实现的方法就应该声明为受保护的或者公有的,而不能定义为私有的。方法的调用方式必须匹配,即类型和所需参数数量必须一致。
代码:
abstract class User{protected $name = '王二小';protected $age = 40;protected function write1(){return "姓名 : {$this-> name} . 工号 :{$this-> age}";}//只要一个类中有一个抽象方法,那么这个类就是:抽象类abstract protected function write2();}//实现类/工作类:是一个可以被实例化的普通类//工作类不一定是可以被实例化的普通类,也可以是一个抽象类//抽象类也可以被继承,抽象类也可以用在继承的上下文环境中class Rob extends User{protected $profession = ' IT大神';//必须将抽象类中的抽象方法实现protected function write2() {return parent::write1() . "职业 : {$this->profession}" ;}}//最终工作类:允许实例化class Work extends Rob{public function write2(){return parent::write2();}}$work = new Work();echo $work->write2();
输出效果:
使用接口,可以指定某个类必须实现哪些方法,但不需要定义这些方法的具体内容。接口是通过 interface 关键字来定义的,就像定义一个标准的类一样,但其中定义所有的方法都是空的。接口中定义的所有方法都必须是公有,这是接口的特性。要实现一个接口,使用 implements 操作符。类中必须实现接口中定义的所有方法,否则会报一个致命错误。类可以实现多个接口,用逗号来分隔多个接口的名称。接口也可以继承,通过使用 extends 操作符。接口中也可以定义常量。接口常量和类常量的使用完全相同,但是不能被子类或子接口所覆盖。
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();
输出效果:
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号