Correcting teacher:天蓬老师
Correction status:qualified
Teacher's comments:看来你是悟到了, 趁早定个假发, 早晚用得上
继承:父类的二类成员自动成为子类的成员。
重写:覆写与父类/基类同名的成员(属性,方法)。
扩展:子类添加自身的方法来增加/扩展父类的功能。
代码举例:
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();
输出效果: