您的位置:首页 > 其它

关于继承与重写

2016-06-07 21:53 197 查看
<?php
header("content-type:text/html;charset='utf-8'");

/*
继承,它是指建立一个新的派生类,从一个或多个先前定义的类中继承数据和函数,
而且可以重新定义或加进新数据和函数,从而建立了类的层次或等级。说的简单点就是,
继承性是子类自动共享父类数据结构和方法的机制,

在软件开发中,类的继承性使所建立的软件具有开放性、可扩充性,这是信息组织与分类的行之有效的方法,
它简化了对象、类的创建工作量,增加了代码的可重性。采用继承性,提供了类的规范的等级结构。
通过类的继承关系,使公共的特性能够共享,提高了软件的重用性。

PHP是单继承,也就是说,一个类只能直接从一个类中继承数据,
*/

//定义一个“人类”作为父类
class Person
{

public $name;
public $age;
public $sex;

//构造方法 会在创建对象的时候自动调用,初始化赋值
function __construct($name,$age,$sex)
{
$this->name=$name;
$this->age=$age;
$this->sex=$sex;
}

//这个人可以说话的方法, 说出自己的成员属性,
function say()
{
echo $this->name."这个人在说话,他说他的年龄是".$this->age."性别是".$this->sex."</br>";

}

}
/*
//定义一个子类“学生类“使用”extends”关键字来继承”人”类
class Student extends Person
{
public $school;  //学生所在学校的属性

//这个学生学习的方法
function study()
{
echo "我的名子叫:".$this->name." 我正在”.$this->school.” 学习<br>";

}

}

$s1 = new Student('小红','20','女');
echo $s1->say();
*/
/*
人类里面“说话”的方法里面说出的是“Person”类里面的属性, 而“Student”类对“Person”类进行了扩展,
又扩展出了几个新的属性,如果使用继承过来的“say()”说话方法的话,只能说出从“Person”类继承过来的那些属性,
那么新扩展的那些属性使用这个继承过来的“say()”的方法就说不出来了,那有的人就问了,我在“Student”这个子类中再定义
一个新的方法用于说话,说出子类里面所有的属性不就行了吗?一定不要这么做, 从抽象的角度来讲,
一个“学生”不能有两种“说话”的方法,就算你定义了两个不同的说话的方法,可以实现你想要的功能,
被继承过来的那个“说话“方法可能没有机会用到了,而且是继承过来的你也删不掉。这个时候我们就要用到覆盖了。

虽然说在PHP里面不能定义同名的方法, 但是在父子关系的两个类中,我们可以在子类中定义和父类同名的方法,
这样就把父类中继承过来的方法覆盖掉了。

*/

class Student extends Person
{

public $school;  //学生所在学校的属性

//如果自己在类外再去定义属性访问的话,不用写
public function __construct($name,$age,$sex,$school){
//使用父类中的方法为原有的属性赋值
parent::__construct($name,$age,$sex); //
$this->school=$school;
}

//这个学生学习的方法
public function study()
{

echo "我的名子叫:".$this->name." 我正在”.$this->school.” 学习<br>";

}

//这个学性可以说话的方法, 说出自己所有的属性,覆盖了父类的同名方法
public function say()
{

//使用父类的“类名::“来调用父类中被覆盖的方法;
// Person::say();

//或者使用“parent::”的方试来调用父类中被覆盖的方法;
parent::say();

//加上一点自己的功能

echo "我在".$this->school."上学.<br>";

}

}

/*
构造方法在子类中如果没有声明的话,也可以使用父类中的构造方法,如果子类中重新定义了一个构造方法也会
覆盖掉父类中的构造方法,如果想使用新的构造方法为所有属性赋值也可以用同样的方式。
*/

/*
子类访问自己的属性,需要再去在类外定义,然后去调用
$s1 = new Student('八蛋','15','男');
$s1->school='bawei';
$s1->say();
$s1->study(); //调用子类自己的方法
*/

//更直接的是在子类中重写构造方法,继承原有的父类方法,再加上自己的,
$s1 = new Student('八蛋','15','男','beida');
$s1->say();
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: