PHP 了解PHP的继承特性

whitfield · 2019-11-27 09:29:54 · 热度: 13

人们习惯于按有组织的层次关系思考问题。因此,毫不奇怪,继承这个概念广泛应用于日常生活的很多方面。

很多系统都相当依赖于层次概念,公司管理结构、美国税务系统和我们对动植物世界的研究体系只是其中的几个例子。

因为面向对象程序设计的前提是:对于要用代码实现的真实世界环境,能够用更接近人的方式对这个环境的性质和行为进行建模,所以还能够表示层次关系就非常有意义。

例如,假设应用程序将类命名为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();

?>

猜你喜欢:
暂无回复。
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册