parent::__construct($name,$sex,$age); 不须要重新赋值
加载父类中的方法:
parent::say();
详细利用方法:
function say() { parent::say(); //调用父类中被本方法覆盖掉的方法 echo 34;在".$this->school."学校上学<br>"; //再原有的功能根本上多加一点功能}
实例:
<?phpclass Person { //声明一个人类,定义人所具有的一些其本的属性和功能成员,做为父类 protected $name; //声明一个存储人的名子的成员 protected $sex; //声明一个存储人的性别的成员 protected $age; //声明一个存储人的年事的成员 function __construct($name="", $sex="男", $age=1) { //布局方法用来创建工具并初使化成员属性 $this->name = $name; //为成员属性name在创建工具时赋初值 $this->sex = $sex; //为成员属性sex在创建工具时赋初值 $this->age = $age; //为成员属性age在创建工具时赋初值 } protected function say(){ //在人类在声明一个通用的说话方法,先容一下自己 echo "我的名字叫:".$this->name.", 性别:".$this->sex.", 我的年事是:".$this->age."。<br>"; }}class Student extends Person { //声明一个学生类,利用extends关键字扩展(继续)Person类private $school; //在学生类中声明一个所在学校school的成员属性 //覆盖父类中的布局方法,在参数列表中多添加一个学校属性,用来创建工具并初使化成员属性 function __construct($name="", $sex="男", $age=1, $school="") { //调用父类中被本方法覆盖的布局方法,为从父类中继续过来的属性赋初值 parent::__construct($name,$sex,$age); $this->school=$school; //新添一条为子类中新声明的成员属性赋初值 } function study() { //在学生类中声明一个学生可以学习的方法 echo $this->name."正在".$this->school."学习<br>"; } //定义一个和父类中同名的方法,将父类中的说话方法覆盖并重写,多说出所在的学校名称 function say() { parent::say(); //调用父类中被本方法覆盖掉的方法 echo "在".$this->school."学校上学<br>"; //再原有的功能根本上多加一点功能}}$student=new Student("张三","男",20, "edu"); //创建一个学生工具,并多传一个学校名称参数$student->say(); //调用学生类中覆盖父类的说话方法?>
子类中没有定义布局方法时, 会自动调用父类的布局方法。因此实例化子类时, 需按照父类的布局方法的形式进行。
子类定义了自己的布局方法, 则不会自动调用父类的布局方法, 但可以手动调用:parent::__construct();
子类中没有定义析构方法时, 会自动调用父类的析构方法。
子类定义了自己的析构方法, 则不会自动调用父类的析构方法, 但可以手动调用:parent::__destruct()
PHP中的继续
继续:子类继续父类所有的属性和非私有的方法,常量也可以被继续
属性的继续: 子类继续父类所有的属性(公有的和私有的), 但在子类中不能访问私有属性;
常量的继续: 子类可以继续父类的常量;
方法的继续: 子类继续父类的非私有的方法, 但在子类中不能访问私有属性;
覆盖的把稳事变:
只有保护的或公有的属性或方法能够被覆盖, --也可以说, 只有保护的或公有的属性或方法才可以被"继续"下来。
私有的属性或方法有如下2个情形:
私有的属性和方法能被继续下来, 但不能访问(要想能够被访问, 必须在父类中定义公有的方法, 访问私有的属性与方法);
从访问掌握角度来说, 私有的不能在其继续的类中访问(只能在自己类中访问);
实例1:
<?phpheader("Content-type: text/html; charset=utf-8");class father{ public $name = "父亲"; protected $age = "50"; private $monkey = "5000"; public function getson(){ echo $this->name."<br>"; echo $this->age."<br>"; echo $this->monkey."<br>"; }}class son extends father{ public $name = "儿子"; protected $age = "20"; private $monkey = "4000";}$son = new son();echo "<pre>";var_dump($son);echo "</pre>";/object(son)#1 (4) {["name"]=>string(6) "儿子"["age":protected]=>string(2) "20"["monkey":"son":private]=>string(4) "4000"["monkey":"father":private]=>string(4) "5000"}/$son->getson(); //从父类中继续的方法/儿子205000/$father = new father();$father->getson(); //父类中的方法/父亲505000/?>
实例2:
<?php//定义一个学校的多种职员角色class Member{ public $name = ""; public $age ; protected $age2 = 2; //跟age比拟 private $age3 = 3; //跟age比拟function __construct($n, $a){ $this->name = $n; $this->age = $a;}public function showInfo(){ //在父类中定义公有的方法 echo "<br />我叫{$this->name},"; echo "今年{$this->age}岁"; echo "<br />age2:" . $this->age2; echo "<br />age3:" . $this->age3; }}class Student extends Member{ public $major = "PHP"; //专业 function __construct($n, $a, $m){ parent::__construct($n, $a); $this->major = $m;}public function showInfo(){ //这里是子类的showInfo parent::showInfo(); //这里利用了父类的showInfo()方法 echo "<br />我的专业为:" . $this->major; echo "<br />子类中访问age:" . $this->age; echo "<br />子类中访问age2:" . $this->age2; echo "<br />子类中访问age3:" . $this->age3; //报错, 父类中的私有属性是不能利用 } }$s1 = new Student("小明", 22, 'java');$s1->showInfo();?>
继续链
可以通过链式继续
一个类在一个文件里面被声明过之后, 不能再次声明, 跟在一个类里面不许可有同名函数类似。
<?php//PHP中的继续链条class A{ public $name1 = "A";}class B extends A{ public $name = "B";}class C extends B{}$c = new C();var_dump($c);?>
object(C)#1 (2) { ["name"]=> string(1) "B" ["name1"]=> string(1) "A" }