PHP抽象类和接口用法实例详解


Posted in PHP onJuly 20, 2019

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

前言

对于oop,估计大多数人并不陌生。有些人除PHP外也学习不少其他语言,会发现php的不同之处,可能语法极其丑陋,但并不妨碍它成为世界上最好的语言(邪教语言)。PHP可以允许常量作为接口的一部分,而对于抽象的理解十分重要。

计算机上,对抽象的理解与自然语言中我们每天使用的抽象概念有所不同。比如,我们指代‘狗'、‘猫'等动物,我们会说‘那只狗/猫',他们就是具有狗/猫这类特征的具体实例。但是我们不能把猫和狗看作一类,也就是说你不能说狗是猫,我们可以把狗和猫都定义到动物这一类。所以我们把抽象定义为一个对象的基本特征,使他与其他对象明确区分开。

抽象类

抽象类里面可以有非抽象方法。但接口里只能有抽象方法。 声明方法的存在而不去实现它的类被叫做抽像类(abstract class),它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。不能创建abstract 类的实例。然而可以创建一个变量,其类型是一个抽像类,并让它指向具体子类的一个实例。不能有抽像构造函数或抽像静态方法。Abstract 类的子类为它们父类中的所有抽像方法提供实现,否则它们也是抽像类为。取而代之,在子类中实现该方法。知道其行为的其它类可以在类中实现这些方法。

先看一个普通类:

<?php
class appletree{
  privated $catch;
  piblic function tree($sweet){
    $this->catch=$sweet;
    return $this->catch;
  }
$apple=new appletree();
$eat=$apple->tree('this apple is sweet');
echo $eat;
?>

再看一个抽象类:

//appletree.php:
<?php
abstract class appletree{
  privated $catch;
  abstract public function tree1($sweet);
  public function tree2(){
    echo'smell';
  }
  public function _construct(){
    //......
    }
}
?>
<?php
include_once('appletree.php');
class anothertree extends appletree{
  public function tree1($sweet){
    $this->catch='this apple is';
    return $this->catch.$sweet;
    }
  }
$apple=new appletree();
echo $apple->tree1('sweet');
?>

从普通类和抽象类可以看出:

抽象类和抽象方法前面定义必须有abstract,调用为extends。抽象类中可以有具体方法,并且具体方法可以在抽象类中实例化,然而抽象方法不可以在抽象类中实例化。

接口

oop模式中接口也是比不可少的一部分,接口(interface)是抽像类的变体。在接口中,所有方法都是抽像的。多继承性可通过实现这样的接口而获得。接口中的所有方法都是抽像的,没有一个有程序体。接口只可以定义static final成员变量。接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。当类实现特殊接口时,它定义(即将程序体给予)所有这种接口的方法。然后,它可以在实现了该接口的类的任何对像上调用接口的方法。由于有抽像类,它允许使用接口名作为引用变量的类型。通常的动态联编将生效。引用可以转换到接口类型或从接口类型转换,instanceof 运算符可以用来决定某对象的类是否实现了接口。

具体例子如下:

//fruit.php

<?php
interface fruit{
  public function apple($sweet);
  public function orange();
  }
?>
<?php
include_once('fruit.php');
class fruittree implements fruit{
  privated $catch;
  public function apple($sweet){
    $this->catch='this fruit is';
    rerurn $this->catch.$sweet;
    }
  public function orange(){
    return 'this orange is sweet';
    }
  }
$tree=new fruittree();
echo $tree->apple('sweet');
echo $tree->orange();
?>

接口和常量

一个网上看到的例子:(接口名和常量之间要用间隔符‘::'隔开,接口中可以用静态常量,变量不可以)

<?php
interface TestInterface
{
  const CONSTVAR = 'aaa';
  static staticvar = 111;
  public function alert($str);
}
class TestClass implements TestInterface
{
  const CONSTVAR = 'bbb';
  public function __CONSTRUCT()
  {
    echo TestInterface::CONSTVAR;
  }
  public function alert($str)
  {
    echo $str;
  }
  public function __DESTRUCT()
  {
  }
}
$test1 = new TestClass();
?>

我们可以看出接口和抽象类的区别:

1、接口中没有具体方法,都是抽象方法。
2、接口调用是implements,抽象类是extends。
3、接口中不可以声明成员变量(包括类静态变量),但是可以声明类常量。抽象类中可以声明各种类型成员变量,实现数据的封装。
4、接口没有构造函数,抽象类可以有构造函数。
5、接口中的方法默认都是public类型的,而抽象类中的方法可以使用private,protected,public来修饰。
6、一个类可以同时实现多个接口,但一个类只能继承于一个抽象类。

使用选择

如果要创建一个模型,这个模型将由一些紧密相关的对象采用,就可以使用抽象类。如果要创建将由一些不相关对象采用的功能,就使用接口。

如果必须从多个来源继承行为,就使用接口。

如果知道所有类都会共享一个公共的行为实现,就使用抽象类,并在其中实现该行为。

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

PHP 相关文章推荐
WHOIS类的修改版
Oct 09 PHP
php 生成WML页面方法详解
Aug 09 PHP
PHP 实用代码收集
Jan 22 PHP
一个PHP的String类代码
Apr 20 PHP
Google Voice 短信发送接口PHP开源版(2010.5更新)
Jul 22 PHP
《PHP编程最快明白》第四讲:日期、表单接收、session、cookie
Nov 01 PHP
Drupal7 form表单二次开发要点与实例
Mar 02 PHP
ThinkPHP2.0读取MSSQL提示Incorrect syntax near the keyword 'AS'的解决方法
Jun 25 PHP
php抽象类用法实例分析
Jul 07 PHP
php 使用fopen函数创建、打开文件详解及实例代码
Sep 24 PHP
php 多文件上传的实现实例
Oct 23 PHP
PHP使用SOAP调用API操作示例
Dec 25 PHP
PHP使用PDO、mysqli扩展实现与数据库交互操作详解
Jul 20 #PHP
Smarty模板语法详解
Jul 20 #PHP
Smarty模板变量与调节器实例详解
Jul 20 #PHP
Smarty模板配置实例简析
Jul 20 #PHP
详解PHP 7.4 中数组延展操作符语法知识点
Jul 19 #PHP
php的优点总结 php有哪些优点
Jul 19 #PHP
Yii框架页面渲染操作实例详解
Jul 19 #PHP
You might like
PHP实现图片自动清理的方法
2015/07/08 PHP
Mac下php 5升级到php 7的步骤详解
2017/04/26 PHP
JS继承 笔记
2011/07/13 Javascript
你必须知道的JavaScript 中字符串连接的性能的一些问题
2013/05/07 Javascript
JQuery中Text方法用法实例分析
2015/05/18 Javascript
跟我学习JScript的Bug与内存管理
2015/11/18 Javascript
JQuery给select添加/删除节点的实现代码
2016/04/26 Javascript
AngularJS表单验证中级篇(3)
2016/09/28 Javascript
JS产生随机数的用法小结
2016/12/10 Javascript
详解PHP中pathinfo()函数导致的安全问题
2017/01/05 Javascript
详解webpack 入门总结和实践(按需异步加载,css单独打包,生成多个入口文件)
2017/06/20 Javascript
JavaScript学习笔记之惰性函数示例详解
2017/08/27 Javascript
Nodejs中使用phantom将html转为pdf或图片格式的方法
2017/09/18 NodeJs
原生JavaScrpit中异步请求Ajax实现方法
2017/11/03 Javascript
vue中使用vue-cli接入融云实现即时通信
2019/04/19 Javascript
d3.js 地铁轨道交通项目实战
2019/11/27 Javascript
JQuery中DOM节点的操作与访问方法实例分析
2019/12/23 jQuery
[46:12]完美世界DOTA2联赛循环赛 DM vs Matador BO2第一场 11.04
2020/11/04 DOTA
[56:42]完美世界DOTA2联赛循环赛 Matador vs Forest 第二场 11.06
2020/11/06 DOTA
rhythmbox中文名乱码问题解决方法
2008/09/06 Python
python高并发异步服务器核心库forkcore使用方法
2013/11/26 Python
Python+微信接口实现运维报警
2016/08/27 Python
浅谈function(函数)中的动态参数
2017/04/30 Python
python 实现判断ip连通性的方法总结
2018/04/22 Python
Python 硬币兑换问题
2019/07/29 Python
pytorch 更改预训练模型网络结构的方法
2019/08/19 Python
Django关于admin的使用技巧和知识点
2020/02/10 Python
Django日志及中间件模块应用案例
2020/09/10 Python
Python浮点型(float)运算结果不正确的解决方案
2020/09/22 Python
学会迭代器设计模式,帮你大幅提升python性能
2021/01/03 Python
在线服装零售商:SheIn
2016/07/22 全球购物
美国市场上最实惠的送餐服务:Dinnerly
2018/03/18 全球购物
保险公司年会主持词
2014/03/22 职场文书
机关党总支领导班子整改方案
2014/09/20 职场文书
推广普通话宣传标语口号
2015/12/26 职场文书
spring cloud 配置中心客户端启动遇到的问题
2021/09/25 Java/Android