定义一个子类(man)
1 //定义一个类 2 class renlei{ 3 var $name = '王五'; 4 var $age = ''; 5 var $sex = ''; 6 var $todo = ''; 7 function showInfo(){ 8 echo '姓名:'.$this->name.'<br>年龄:'.$this->age.'<br>性别:'.$this->sex.'<br>做了什么:'.$this->todo; 9 } 10 function cself(){ 11 return new self; 12 } 13 } 14 //定义一个继承于renlei类的类 15 class man extends renlei{ 16 17 } 18 //实例化一个man类下的对象 19 $wbl = new man(); 20 $wbl->showInfo();
父类和子类的关系:
1.子类继承父类的全部信息,同时可以扩展自己的特征信息;如果没有扩展,继承也就没有了意义
2.父类(基类) 派生 子类(派生类)。
3.单继承:一个父类可以有多个子类,但一个子类只能有一个直接父类(可以有多级父类--多级继承)。
类中成员的修饰符及作用范围:
范围 |
本类内 |
继承关系类内 |
类外 |
public |
可以 |
可以 |
可以 |
protected |
可以 |
可以 |
不可以 |
private |
可以 |
不可以 |
不可以 |
关键字:parent(parent::类成员):
parent通常用于在子类中调用父类的成员的时候使用,多数通常就是使用父类的“静态类”成员(因为parent代表的类,而非对象)
重写:override
定义:发生在继承里。将从父类继承下来的属性或方法重新“定义”
方法的参数形式:应该跟父类的一致(构造方法除外,可以不一致)。
私有属性和私有方法的重写问题:私有属性和方法都不能覆盖,但其实子类可以定义跟父类私有的同名属性或方法。只是当作一个自身的新的属性或方法来看待而已。不过方法的参数必须一致。
关键词:final
如果某个类不希望对其进行扩展,则可以将其声明为“最终类”。
形式:final class 类名{ 。。。。类定义。。。。}
如果某个方法不希望被下级类覆盖,就可以对其生命为“最终方法”。
形式:final function 方法名(){。。。。方法定义。。。。}
构造方法析构方法在继承中的表现:
1.子类中没有定义构造方法时,会自动调用父类的构造方法。因此实例化子类时,需按照父类的构造方法的形式进行(注意参数)。
2.子类定义了自己的构造方法,则不会自动调用父类的构造方法,但可以手动调用:parent::__construct();
1 //定义一个human类下的子类 2 class man extends human{ 3 public $m1 = "" ; 4 //手动调用父类的构造方法 5 function __construct($name,$m1){ 6 parent::__construct($name); 7 $this->m1 = $m1; 8 } 9 } 10 //实例化一个man类下的对象 11 $wbl = new man('xiaoming',18); 12 echo $wbl->name; 13 echo $wbl->m1;