简明现代魔法 -> 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


