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

继承可以实现对类的复用
服务器君一共花费了448.234 ms进行了6次数据库查询,努力地为您提供了这个页面。
试试阅读模式?希望听取您的建议

什么是继承

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

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

  • 两个轱辘
  • 一个车座
  • 两个脚蹬子
  • 有颜色

自行车有什么动作(方法)?

  • 骑行
  • 刹车

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

  • 两个轱辘
  • 一个车座
  • 两个脚蹬子
  • 有颜色

折叠自行车有什么动作(方法)?

  • 骑行
  • 刹车
  • 折叠

 

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

  • 两个轱辘
  • 一个车座
  • 两个脚蹬子
  • 有颜色
  • 电池一块

电动自行车有什么动作(方法)?

  • 骑行
  • 刹车
  • 电动行驶

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

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

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

  • 两个轱辘
  • 一个车座
  • 两个脚蹬子
  • 有颜色

自行车有什么动作(方法)?

  • 骑行
  • 刹车

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

  • 折叠自行车和自行车有相同的属性

折叠自行车有什么动作(方法)

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

 

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

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

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

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

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

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

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

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

PHP5中的继承

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

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

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

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

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

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

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

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

继承的简单例子

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

animal.php

<?
// animal.php
class Animal {
	private $weight;
	public function 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
<? 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

延伸阅读

此文章所在专题列表如下:

  1. PHP面向对象之旅:类和对象
  2. PHP面向对象之旅:类的属性
  3. PHP面向对象之旅:类的方法
  4. PHP面向对象之旅:对象的比较
  5. PHP面向对象之旅:构造函数
  6. PHP面向对象之旅:类的继承
  7. PHP面向对象之旅:访问控制
  8. PHP面向对象之旅:方法覆盖
  9. PHP面向对象之旅:this关键字
  10. PHP面向对象之旅:parent::关键字
  11. PHP面向对象之旅:再谈重载
  12. PHP面向对象之旅:获取用户数据
  13. PHP面向对象之旅:用户权限管理类
  14. PHP面向对象之旅:static变量与方法
  15. PHP面向对象之旅:单例模式
  16. PHP面向对象之旅:final类和方法
  17. PHP面向对象之旅:PHP中的常量
  18. PHP面向对象之旅:抽象类
  19. PHP面向对象之旅:抽象方法
  20. PHP面向对象之旅:抽象类继承抽象类
  21. PHP面向对象之旅:静态抽象方法
  22. PHP面向对象之旅:模板模式
  23. PHP面向对象之旅:接口与抽象方法
  24. PHP面向对象之旅:接口的实现
  25. PHP面向对象之旅:接口的继承
  26. PHP面向对象之旅:类型提示
  27. PHP面向对象之旅:PHP的多态
  28. PHP面向对象之旅:instanceof运算符
  29. PHP面向对象之旅:接口与组合模拟多继承
  30. PHP面向对象之旅:一个接口实例
  31. PHP面向对象之旅:简单工厂模式

本文地址:http://www.nowamagic.net/librarys/veda/detail/1087,欢迎访问原出处。

不打个分吗?

转载随意,但请带上本文地址:

http://www.nowamagic.net/librarys/veda/detail/1087

如果你认为这篇文章值得更多人阅读,欢迎使用下面的分享功能。
小提示:您可以按快捷键 Ctrl + D,或点此 加入收藏

阅读一百本计算机著作吧,少年

很多人觉得自己技术进步很慢,学习效率低,我觉得一个重要原因是看的书少了。多少是多呢?起码得看3、4、5、6米吧。给个具体的数量,那就100本书吧。很多人知识结构不好而且不系统,因为在特定领域有一个足够量的知识量+足够良好的知识结构,系统化以后就足以应对大量未曾遇到过的问题。

奉劝自学者:构建特定领域的知识结构体系的路径中再也没有比学习该专业的专业课程更好的了。如果我的知识结构体系足以囊括面试官的大部分甚至吞并他的知识结构体系的话,读到他言语中的一个词我们就已经知道他要表达什么,我们可以让他坐“上位”毕竟他是面试官,但是在知识结构体系以及心理上我们就居高临下。

所以,阅读一百本计算机著作吧,少年!

《设计模式:可复用面向对象软件的基础》 Erich Gamma (作者), Richard Helm (作者), Ralph Johnson (作者), John Vlissides (作者), 李英军 (译者), 等 (译者)

《设计模式:可复用面向对象软件的基础》是引导读者走出软件设计迷宫的指路明灯,凝聚了软件开发界几十年设计经验的结晶。四位顶尖的面向对象领域专家精心选取了最具价值的设计实践,加以分类整理和命名,并用简洁而易于重用的形式表达出来。本书已经成为面向对象技术人员的圣经和词典,书中定义的23个模式逐渐成为开发界技术交流所必备的基础知识和语汇。

更多计算机宝库...