了解PHP的继承特性

服务器君一共花费了14.009 ms进行了6次数据库查询,努力地为您提供了提供了这个页面。

人们习惯于按有组织的层次关系思考问题。因此,毫不奇怪,继承这个概念广泛应用于日常生活的很多方面。很多系统都相当依赖于层次概念,公司管理结构、美国税务系统和我们对动植物世界的研究体系只是其中的几个例子。因为面向对象程序设计的前提是:对于要用代码实现的真实世界环境,能够用更接近人的方式对这个环境的性质和行为进行建模,所以还能够表示层次关系就非常有意义。

例如,假设应用程序将类命名为Employee,用来表示从员工中提取的特征和行为。表示这些特征的类成员包括以下几项。

  • name:员工姓名。
  • age :员工年龄。
  • salary :员工工资。
  • yearsEmployed :员工在公司里的工作年数。

Employee 类的方法包括以下几项:

  • dowork:完成一些与工作相关的任务。
  • eatLunck :午餐休息。
  • takeVacation :度过两个星期的假期。

这些特征和行为可能与所有类型的员工都有关,而且,无论员工在公司里的作用或职位是什么。但是很明显,员工之间也有差别;例如,主管可以拥有股票,能够侵占公司,而其他员工就没有这样的奢望。助理必须能记录备忘录,办公室管理人员需要建立供应名单。由于存在这些差别,倘若必须为所有类共有的属性创建和维护冗余的类结构,效率就太低了。OOP开发范型考虑了这一点,允许继承现有的类,根据现有的类创建新类。

在PHP中,类继承通过extends关键字实现。代码清单中展示了这一点,在此首先创建一个Employee类,然后创建一个继承自Employee的Executive类。

PS:继承自其它类的类称为子类,子类所继承的类称为父类或基类。

<?php
	// Define a base Employee class
	class Employee {
		private $name;
		// Define a setter for the private $name member.
      	function setName($name) {
         	if ($name == "") echo "Name cannot be blank!";
         	else $this->name = $name;
      	}
		// Define a getter for the private $name member
      	function getName() {
         	return "My name is ".$this->name."<br />";
      	}
   	} //end Employee class
	// Define an Executive class that inherits Employee
   	class Executive extends Employee {
      	// Define a method unique to Employee
     	function pillageCompany() {
         	echo "I'm selling company assets to finance my yacht!";
      	}
   	} //end Executive class
	// Create a new Executive object
   	$exec = new Executive();
	// Call the setName() method, defined in the Employee class
   	$exec->setName("Richard");
	// Call the getName() method
   	echo $exec->getName();
	// Call the pillageCompany() method
   	$exec->pillageCompany();
?>

执行的结果:

My name is Richard
I'm selling company assets to finance my yacht!

因为所有员工都有姓名,所以Executive类继承了Employee类,避免了必须重新创建name成员及相应获取方法和设置方法的麻烦。然后可以专心实现主管所特有的性质,在这里就是一个名为pillageCompany()的方法。此方法只在Executive类型的对象中可用,在Employee类或其他类中都不能使用(除非是继承自Executive的类)。下面的示例演示了这个概念,这里给出了一个继承自Executive的CEO类:

<?php
class Employee{
	...
}
class Executive enxtends Employee{
	...
}
class CEO extends Executive{
   function getFacelift(){
       echo "nip nip tuck tuck";
   }
}
$ceo= new CEO();
$ceo->setName("Bernie");
$ceo->pillageCompany();
$ceo->getFacelift();
?>

因为CEO继承自Executive,所以CEO类型的对象也具有Executive可用的所有成员和方法。除了getFacelift()方法,Executive也为CEO类型的对象所唯一保留。

下面补个简单的例子:

<?php

class Fruit {  
    private $name ;  
      
    function __construct($name) {  
        $this->name = $name;  
    }  
      
    function showName() {  
        echo $this->name."<br />";  
    }  
}  

class Apple extends Fruit {  
	private $color;
  
	function __construct() {  
		parent::__construct("苹果");  
		$this->color = "红色";
	}
	  
	function showColor() {
		echo $this->color;
	}
}

$apple = new Apple();
$apple->showName();
$apple->showColor();

?>

Creative Commons License

本文仅供自己学习与收藏之用,请勿转载,请勿用作其它用途(如商业目的等)。 原文链接:http://www.nowamagic.net/librarys/posts/php/33