PHP设计模式(二):抽象类和接口

原文地址:PHP设计模式(二):抽象类和接口php

Introduction

对于编程来讲,对事物的抽象是一个老生常谈的话题,抽象问题更利于面向对象编程以及程序设计模式。
和C/C++,Java,Python等语言同样,PHP也支持面向对象,可是又有略微区别,如PHP支持在接口中定义常量,可是不支持抽象变量。编程

抽象/Abstraction

对事物的抽象是指,区别两个不一样事物之间的本质特征,这两个事物应该在某个视角上有明确的区分界限。设计模式

如,鲸鱼和鲤鱼,这两个事物在动物的视角上,有明确的区分界限,属于不一样的动物;可是在水生动物的视角上,他们属于同一种动物的抽象。
合理的对问题进行抽象,构造模型,将更容易经过编程来解决问题。
记住:抽象是编程解决问题的基础,越复杂的问题,越须要一开始就对问题进行抽象,而不是直接写代码。bash

抽象类/Abstract Class

抽象类是一个编程概念,PHP中叫Abstract Classes。在设计模式中,抽象类不可以被实例化/初始化,可是能够依靠具体类的继承来实现。
有点抽象,对吧?用代码来解释:this

<?php
abstract class Animal {
  public $name;
  abstract public function eat($food);
}
?>

定义了动物这个抽象类,动物的属性是名字name,而后有一个方法是吃食物eat food。
为何动物是抽象类?由于动物这个物种并非一个存在于天然界的东西,它是人类脑海里抽象出的东西。存在天然界的是鲸鱼和鲤鱼这样的肯定性动物。
好比鲸鱼的概念,应该是属于动物,继承Animal类,咱们定义鲸鱼这个类以及吃东西的方法:设计

<?php
class Whale extends Animal {
  public function __construct() {
    $this->name = "Whale";
  }
  public function eat($food) {
    echo $this->name . " eat " . $food . ".\n";
  }
}
?>

如今咱们能够初始鲸鱼类,而且调用吃的方法了:code

<?php
  $whale = new Whale();
  $whale->eat("fish");
?>

运行一下:server

$ php Whale.php
Whale eat fish.

接口/Interface

PHP也支持面向过程编程概念中的接口,下面一样用鲸鱼的例子来说述:对象

<?php
interface IAction {
  public function eat($food);
  public function swim();
}
?>

一样定义一个鲸鱼类,来实现上述接口:继承

<?php
class Whale implements IAction {
  public function eat($food) {
    echo "Whale eat " . $food . "\n.";
  }
  public swim() {
    echo "Whale is swimming.\n";
  }
}
?>

如今咱们能够初始鲸鱼类,而且调用吃的方法了:

<?php
  $whale = new Whale();
  $whale->eat("fish");
?>

运行一下:

$ php Whale.php
Whale eat fish.

抽象类vs接口

上面的抽象类和接口的例子,看上去是否是相似?事实上,对于PHP编程来讲,抽象类能够实现的功能,接口也能够实现。
抽象类的接口的区别,不在于编程实现,而在于程序设计模式的不一样。
通常来说,抽象用于不一样的事物,而接口用于事物的行为。
如:水生生物是鲸鱼的抽象概念,可是水生生物并非鲸鱼的行为,吃东西才是鲸鱼的行为。
对于大型项目来讲,对象都是由基本的抽象类继承实现,而这些类的方法一般都由接口来定义。
此外,对于事物属性的更改,建议使用接口,而不是直接赋值或者别的方式,如:

<?php
interface IAction {
  public function eat();
}
class Whale implements IAction {
  public function eat() {
    echo "Whale eat fish.\n";
  }
}
class Carp implements IAction {
  public function eat() {
    echo "Carp eat moss.\n";
  }
}

class Observer {
  public function __construct() {
    $whale = new Whale();
    $carp = new Carp();
    $this->observeEat($whale);
    $this->observeEat($carp);
  }
  function observeEat(IAction $animal) {
    $animal->eat();
  }
}
$observer = new observer();
?>

运行一下:

$ php Observer.php
Whale eat fish.
Carp eat moss.

Summary

好的设计模式是严格对问题进行抽象,虽然抽象类和接口对于编程实现来讲是相似的,可是对于程序设计模式是不一样的。

相关文章
相关标签/搜索