php⾯向对象(OOP)—⽅法重写(override)
因为PHP是弱类型的语⾔,所以在⽅法的参数中本⾝就可以接收不同类型的数据,⼜因为PHP的⽅法可以接收不定个数的参数,所以通过传递不同个数的参数调⽤不相同⽅法名的不同⽅法也是不成⽴的,所以php是不能重载的。
虽然说在PHP⾥⾯不能定义同名的⽅法,但是在⽗⼦关系的两个类中,我们可以在⼦类中定义和⽗类同名的⽅法,这样就把⽗类中继承过来的⽅法覆盖掉了(重写⽗类⽅法)。
<?php
class Person
{
//下⾯是⼈的成员属性
var $name; //⼈的名⼦
var $x; //⼈的性别
var $age; //⼈的年龄
//定义⼀个构造⽅法参数为属性姓名$name、性别$x和年龄$age进⾏赋值红烧草鱼
function __construct($name, $x, $age) {
$this->name = $name;
$this->x = $x;
$this->age = $age;
}
//这个⼈可以说话的⽅法, 说出⾃⼰的属性
function say() {
echo "my name is:" . $this->name . " x:" . $this->x . " my age is:" . $this->age;
}
柳焕斌
}
//定义⼀个⼦类“学⽣类“使⽤”extends”关键字来继承”⼈”类:
class Student extends Person
{
var $school; //学⽣所在学校的属性
function __construct($name,$x,$age,$school)
{
parent::__construct($name,$x,$age);
$this->school = $school;
}
// 重写⽗类的say()⽅法
function say()
人人讲安全{
echo "my name is:" . $this->name ." my school is:" . $this->school;
}
//这个学⽣学习的⽅法
function study()
{
echo "my name is:" . $this->name . " my school is:" . $this->school;
}
}
>近似数口诀
我若安好便是晴天
另外在⼦类覆盖⽗类的⽅法时也要注意⼀点,⼦类中⽅法的访问权限⼀定不能低于⽗类被覆盖⽅法的访问权限,也就是⼀定要⾼于或等于⽗类⽅法的访问权限。
例如,如果⽗类⽅法的访问权限是protected,那么⼦类中要覆盖的权限就要是protected和public,如果⽗类的⽅法是public那么⼦类中要覆盖的⽅法只能也是public,总之⼦类中的⽅法总是要⾼于或等于⽗类被覆盖⽅法的访问权限。
上⾯的例⼦,我们就在“Student”⼦类⾥覆盖了继承⽗类⾥⾯的”say()”的⽅法,通过覆盖我们就实现了对“⽅法”扩展。但是,像这样做虽然解决了我们上⾯说的问题,但是在实际开发中,⼀个⽅法不可能就⼀条代码或是⼏条代码,⽐如说“Person”类⾥⾯
的“say()”⽅法有⾥⾯有 100条代码,如果我们想对这个⽅法覆盖保留原有的功能外加上⼀点点功能,就要把原有的100条代码重写⼀次,再加上扩展的⼏条代码,这还算是好的,⽽有的情况,⽗类中的⽅法是看不见原代码的,这个时候你怎么去重写原有的代码呢?我们也有解决的办法,就是在⼦类这个⽅法中可以调⽤到⽗类中被覆盖的⽅法,也就是把被覆盖的⽅法原有的功能拿过来再加上⾃⼰的⼀点功能,可以通过两种⽅法实现在⼦类的⽅法中调⽤⽗类被覆盖的⽅法:
⼀种是使⽤⽗类的“类名::“来调⽤⽗类中被覆盖的⽅法;
⼀种是使⽤“parent::”的⽅试来调⽤⽗类中被覆盖的⽅法;
//定义⼀个⼦类“学⽣类“使⽤”extends”关键字来继承”⼈”类:
禁毒宣传资料class Student extends Person
{
var $school; //学⽣所在学校的属性
function __construct($name,$x,$age,$school)
{
parent::__construct($name,$x,$age);
$this->school = $school;
}
// 重写⽗类的say()⽅法
function say()
{
//使⽤⽗类的"类名::"来调⽤⽗类中被覆盖的⽅法;
打扫战场// Person::say();
//或者使⽤"parent::"的⽅试来调⽤⽗类中被覆盖的⽅法;
parent::say();
echo "my name is:" . $this->name ." my school is:" . $this->school;
}
//这个学⽣学习的⽅法
function study()
{毓婷避孕药说明书
echo "my name is:" . $this->name . " my school is:" . $this->school;
}
}
现在⽤两种⽅式都可以访问到⽗类中被覆盖的⽅法,我们选那种⽅式最好呢?⽤户可能会发现⾃⼰写的代码访问了⽗类的变量和函数。如果⼦类⾮常精炼或者⽗类⾮常专业化的时候尤其是这样。不要⽤代码中⽗类⽂字上的名字,应该⽤特殊的名字 parent,它指的就是⼦类在 extends 声明中所指的⽗类的名字。这样做可以避免在多个地⽅使⽤⽗类的名字。如果继承树在实现的过程中要修改,只要简单地修改类中 extends 声明的部分。