PHP抽象类与接口的区别实例详解


Posted in PHP onMay 09, 2019

本文实例讲述了PHP抽象类与接口的区别。分享给大家供大家参考,具体如下:

抽象类abstract

概念

定义为抽象的类不能被实例化。任何一个类,如果有一个方法是被声明为抽象的,那么这个类就必须被声明为抽象的类。

继承一个抽象类的时候,子类必须定义父类中的所有抽象方法,这些方法的访问控制必须喝父类中一样或者更为宽松。

例如,某个抽象方法被声明为proteced,那么子类中的实现,就应该声明为protected或者public,而不能定义为private。

方法的调用方式必须匹配,即类型和所需参数数量必须一致,例如,子类定义了一个可选参数,而父类抽象方法中没有声明,则两者的声明并没有冲突。

特点

  • 抽象类继承,使用关键字extends。
  • 抽象类可以声明各种变量、常量、方法。
  • 抽象类可以有构造函数。
  • 抽象类中的方法可以是公开的public、保护的protected、私有的private。
  • 一个类只能继承一个抽象类。

示例

示例一

<?php
// 抽象类
abstract class AbstractClasss
{
  // 强制要求子类定义这些方法
  abstract protected function getValue();
  abstract protected function prefixValue();
  // 普通方法(非抽象方法)
  public function printOut() 
  {
    print $this->getValue() . "\n";
  }
}
// 子类
class ConcreteClassOne extends AbstractClass
{
  protected function getValue()
  {
    return "ConcreteClassOne";
  }
  public function prefixValues($prefix)
  {
    return "{$prefix}ConcreteClassOne";
  }
}
// 子类
class ConcreteClassTwo extends AbstractClass
{
  protected function getValue()
  {
    return "ConcreteClassTwo";
  }
  public function prefixValue($prefix)
  {
    return "{$prefix}ConcreteClassTwo";
  }
}
// 实例化第一个子类
$classOne = new ConcreteClassOne;
$classOne->printOut();
echo $classOne->prefixValue('FOO_') . "\n";
// 实例化第二个子类
$classTwo = new ConcreteClassTwo;
$classTwo->printOut();
echo $classTwo->prefixValue('FOO_') . "\n";

结果输出

ConcreteClassOne
FOO_ConcreteClassOne

ConcreteClassTwo
FOO_ConcreteClassTwo

示例二

<?php
// 抽象类
abstract class AbstractClass
{
  // 我们的抽象方法仅需要定义需要的参数
  abstract protected function prefixName($name);
}
// 子类
class ConcreteClass extends AbstractClass
{
  // 我们的子类可以定义父类签名中不存在的可选参数
  public function prefixName($name, $separator = ".")
  {
    if ($name == "Pacman") {
      $prefix = "Mr";
    } elseif ($name == "Pacwoman") {
      $prefix = "Mrs";
    } else {
      $prefix = "";
    }
    return "{$prefix}{$separator} {$name}";
  }
}
// 实例化子类
$class = new ConcreteClass;
echo $class->prefixName("Pacman") . "\n";
echo $class->prefixName("Pacwoman") . "\n";

结果输出

Mr. Pacman
Mrs, Pacwoman

接口interface

概念

使用接口interface,可以指定某个类必须实现那些方法,但是不需要定义这些方法的具体内容。

要实现一个接口,使用implements操作符,类中必须实现接口中定义的所有方法。

特点

  • 接口的实现,使用关键字implements。
  • 接口中不能声明变量,但是可以声明常量。
  • 接口中没有构造函数。
  • 接口中的方法默认都是公开的public。
  • 一个类可以实现多个接口。

示例

示例一 、 实现接口

<?php
// 声明一个iTemplate接口
interface iTemplate
{
  public function setVariable($name, $var);
  public function getHtml($template);
}
// 实现接口
// 下面的写法是正确的
class Template implements iTemplate
{
  private $vars = array();
  public function setVariable($name, $var)
  {
    $this->vars[$name] = $var;
  }
  public function getHtml($template)
  {
    foreach($this->vars as $name => $value) {
      $template = str_replace('{' . $name . '}', $value, $template);
    }
    return $template;
  }
}
// 下面的写法是错误的,会报错,因为没有实现 getHtml()
// Fatal error: Class BadTemplate contains 1 abstract methonds
// and must therefore be declared abstaract (iTemplate::getHtml)
class BadTemplate implements iTemplate
{
  private $vars = array();
  public function setVariable($name, $var)
  {
    $this->vars[$name] = $var;
  }
}

示例二 、 可扩充接口

<?php
interface a
{
  public function foo();
}
interface b extends a
{
  public function baz(Baz $baz);
}
// 正确的写法
class c implements b
{
  public function foo()
  {
  }
  public function baz(Baz $baz)
  {
  }
}
// 错误的写法会导致一个致命的错误
class d implements b
{
  public function foo()
  {
  }
  public function baz(Foo $foo)
  {
  }
}

示例三 、 继承多个接口

<?php
interface a
{
  pubLic function foo();
}
interface b
{
  public function bar();
}
interface c extends a, b
{
  public function baz();
}
class d implements c
{
  public function foo()
  {
  }
  public function bar()
  {
  }
  public function baz()
  {
  }
}

示例四 、使用接口常量

<?php
interface a
{
  const b = 'Interface constant';
}
// 输出接口变量
echo a:b;
// 错误的写法,因为常量不能被覆盖。
// 接口常量的概念和类常量的是一样的。
class b implements a
{
  const b = 'Class constant'
}

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
一个程序下载的管理程序(三)
Oct 09 PHP
文件系统基本操作类
Nov 23 PHP
用PHP的ob_start();控制您的浏览器cache!
Feb 14 PHP
PHP 如何利用phpexcel导入数据库
Aug 24 PHP
3个PHP多维数组转为一维数组的方法实例
Mar 13 PHP
php 模拟 asp.net webFrom 按钮提交事件实例
Oct 13 PHP
浅析php适配器模式(Adapter)
Nov 25 PHP
PHP常用文件操作函数和简单实例分析
Jun 03 PHP
PHP简单获取多个checkbox值的方法
Jun 13 PHP
PHP GD库相关图像生成和处理函数小结
Sep 30 PHP
CI框架网页缓存简单用法分析
Dec 26 PHP
php实现的PDO异常处理操作分析
Dec 27 PHP
php和vue配合使用技巧和方法
May 09 #PHP
php查询内存信息操作示例
May 09 #PHP
PHP利用百度ai实现文本和图片审核
May 08 #PHP
PHP回调函数简单用法示例
May 08 #PHP
Thinkphp5+plupload实现的图片上传功能示例【支持实时预览】
May 08 #PHP
PHP封装类似thinkphp连贯操作数据库Db类与简单应用示例
May 08 #PHP
php封装的pdo数据库操作工具类与用法示例
May 08 #PHP
You might like
PHP中cookies使用指南
2007/03/16 PHP
php实现查看邮件是否已被阅读的方法
2013/12/03 PHP
destoon后台网站设置变成空白的解决方法
2014/06/21 PHP
php进行支付宝开发中return_url和notify_url的区别分析
2014/12/22 PHP
setTimeout和setInterval的浏览器兼容性分析
2007/02/27 Javascript
jQuery 常见开发使用技巧总结
2009/12/26 Javascript
js继承的实现代码
2010/08/05 Javascript
jQuery插件实现屏蔽单个元素使用户无法点击
2013/04/12 Javascript
jquery实现简单实用的打分程序实例
2015/07/23 Javascript
javascript中alert()与console.log()的区别
2015/08/26 Javascript
AngularJS进行性能调优的7个建议
2015/12/28 Javascript
原生js实现百叶窗效果及原理介绍
2016/04/12 Javascript
Javascript实现鼠标框选操作  不是点击选取
2016/04/14 Javascript
EasyUI Pagination 分页的两种做法小结
2016/07/09 Javascript
Highcharts入门之简介
2016/08/02 Javascript
清除浏览器缓存的几种方法总结(必看)
2016/12/09 Javascript
解析微信JS-SDK配置授权,实现分享接口
2016/12/09 Javascript
angular.js指令中的controller、compile与link函数的不同之处
2017/05/10 Javascript
angular使用post、get向后台传参的问题实例
2017/05/27 Javascript
vue.js实现备忘录功能的方法
2017/07/10 Javascript
详解angularJS+Ionic移动端图片上传的解决办法
2017/09/13 Javascript
BootstrapTable加载按钮功能实例代码详解
2017/09/22 Javascript
vue复合组件实现注册表单功能
2017/11/06 Javascript
vue.js+element-ui动态配置菜单的实例
2018/09/07 Javascript
JS实现省市县三级下拉联动
2020/04/10 Javascript
[52:20]VP vs VG Supermajor小组赛 B组胜者组决赛 BO3 第一场 6.2
2018/06/03 DOTA
Python进阶之全面解读高级特性之切片
2019/02/19 Python
anaconda如何查看并管理python环境
2019/07/05 Python
Python使用Excel将数据写入多个sheet
2020/05/16 Python
如何通过安装HomeBrew来安装Python3
2020/12/23 Python
美国最大的存储市场:SpareFoot
2018/07/23 全球购物
Feelunique澳大利亚:欧洲的化妆品零售电商
2019/12/18 全球购物
清明节扫墓活动方案
2014/03/02 职场文书
高校教师自荐信范文
2014/03/13 职场文书
Java 获取Word中所有的插入和删除修订的方法
2022/04/06 Java/Android
python中 Flask Web 表单的使用方法
2022/05/20 Python