php外包、微信开发、app开发尽在蓝普!PHP技术服务商

PHP面向对象之旅:类的继承

什么是继承

前面说过,面向对象的思想和我们的生活是息息相通的。我们先分析一个生活中的例子:自行车、折叠车、电动车的关系。
自行车有什么特征(属性)?

两个轱辘
一个车座
两个脚蹬子
有颜色
自行车有什么动作(方法)?

骑行
刹车

折叠自行车有什么特征(属性)?

两个轱辘
一个车座
两个脚蹬子
有颜色
折叠自行车有什么动作(方法)?

骑行
刹车
折叠

电动自行车有什么特征(属性)?

两个轱辘
一个车座
两个脚蹬子
有颜色
电池一块
电动自行车有什么动作(方法)?

骑行
刹车
电动行驶

上面说明了自行车、折叠自行车、电动自行车特性。我们描述折叠自行车和电动自行车时,除红色标注的部分,都和自行车一样。

我们尝试用另外一种方式,建立模型的方式来描述一次。

自行车有什么特征(属性)?

两个轱辘
一个车座
两个脚蹬子
有颜色
自行车有什么动作(方法)?

骑行
刹车

折叠自行车有什么特征(属性)

折叠自行车和自行车有相同的属性
折叠自行车有什么动作(方法)

折叠自行车具有自行车的所有方法。
增加了折叠方法。

电动自行车和自行车有相同的属性和方法。

增加了电池一块
增加了电动行驶的方法。

这次的描述变简单了,只需要将增加的内容填写上去。关于自行车的描述被复用了。

仔细再观察对自行车的描述,我们发现上面三个自行车都缺少了一个重要的属性”车主架”。

在例1中,我们要在三个描述中分别添加”车铃铛”,这个属性。

在例2中,我们只要在自行车的描述中加入属性“车铃铛”,另外两个描述不用变化就完成。

内容的添加。同样,动作(方法)的变化也很容易。

感觉到了什么了么?它让我们的描述更容易“扩充和维护”。

5中的继承

继承是面向对象最重要的特点之一,就是可以实现对类的复用。

通过“继承”一个现有的类,可以使用已经定义的类中的方法和属性。

继承而产生的类叫做子类。

被继承的类,叫做父类,也被成为超类。

PHP是单继承的,一个类只可以继承一个父类,但一个父类却可以被多个子类所继承。

从子类的角度看,它“ 继承(inherit , extends)”自父类;而从父类的角度看,它“派生(derive)”子类。它们指的都是同一个动作,只是角度不同而已。

子类不能继承父类的私有属性和私有方法。

在PHP5中类的方法可以被继承,类的构造函数也能被继承。

继承的简单例子

我们分析自然界中的关系,动物类与犬类的关系。

animal.php

<?
// animal.php
class Animal {
private $weight;
public getWeight()
{
return $this->weight;
}
public function setWeight($w)
{
$this->weight = $w;
}
}
?>

Dog类继承自animal 类。

dog.php

<?
//dog.php
require_once(‘animal.php’);
class Dog extends Animal
{
/**
*子类新增方法
*/
public function Bark()
{
echo “Wang~~Wang~~~ “;
}
}
?>

当我们实例化 animal 类的子类 Dog 类时, 父类的方法 setWeight() 和 getWeight() 被继承。

我们可以直接调用父类的方法设置其属性$weight,取得其属性$weight。

dog 类的实例 MyDog.php。

<?
//myDog.php
require_once(‘dog.php’);
$myDog = new Dog();
$myDog->setWeight(20);
echo “Mydog’s weight is “.$myDog->getWeight().'<br>’;
$myDog->Bark();
?>

构造函数的继承

有些资料上说PHP5的构造函数不被继承。演示的结果证明,PHP5的构造函数被继承了。

当子类Dog1被实例化时,继承的构造函数被调用了。屏幕上显示了一句 “I am an Animal.”.

<?
//2-2 / extends.php
//构造函数继承的问题.
class Animal{
public $legNum = 0;
public function __construct(){
$this->legNum = 4;
echo “I am an animal<br>”;
}
}
class Dog1 extends Animal {

}
$dog1 = new Dog1();
echo “<br>”;
echo “legNum is “.$dog1->legNum;
/*
实例化子类时.构造函数被调用了.
*/
?>

私有变量和方法不被继承

私有变量不被继承,私有方法也不被继承。

另外一种说法,私有变量和属性被继承了,但不能被调用。

无论怎么说,都不能调用父类的私有属性和私有方法。

2-2-4.php<br>
<?
class employee{
private $sal=3000;
private function getSal(){
return $this->sal;
}
}
class Manager extends employee {
public function getManagerSal(){
return $this->getSal();
}
}
$manager = new Manager();<h1></h1>
echo $manager->getManagerSal();
?>

程序运行结果:
Fatal error: Call to private method employee::getSal() from context ‘Manager’ in E:\PHPProjects\test.php on line 11

标签:, ,

转载请注明来源蓝普网络并以链接形式标明本文地址
本文链接: http://www.wbphp.cn/html/y01/14437.html

作者:杨少洪 | 日期:2018-01-17 | 分类:新闻中心 | 评论:0 条 | 浏览:3


上一篇:
下一篇:

发表评论

*

* 以便邮件回复


给我汇款 | 合作流程 | 看看我们 | 加入我们 Copyright 2008-2016 php外包与洛阳php培训服务商. Some Rights Reserved. 豫ICP备12025288号-1