简明现代魔法 -> PHP服务器脚本 -> PHP 面向对象:类的继承

PHP 面向对象:类的继承

2010-04-13

什么是继承

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

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

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

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

  • 骑行
  • 刹车

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

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

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

  • 骑行
  • 刹车
  • 折叠

 

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

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

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

  • 骑行
  • 刹车
  • 电动行驶

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

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

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

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

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

  • 骑行
  • 刹车

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

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

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

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

 

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

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

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

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

在例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
随机文章推荐
网站分类


注:如需转载本文,请注明出处(原文链接),谢谢。更多精彩内容,请进入简明现代魔法首页。

进入新博客
喜欢本文,就分享它吧
给我留言
您的名字:
您的邮件:
您的网站:


 

copyright © 2009 简明现代魔法    学习、分享、进步

power by Gonn 感谢所有关心和支持本站的朋友们