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 相关文章推荐
php 计划任务 检测用户连接状态
Mar 29 PHP
浅析Dos下运行php.exe,出现没有找到php_mbstring.dll 错误的解决方法
Jun 29 PHP
PHP set_error_handler()函数使用详解(示例)
Nov 12 PHP
php计算几分钟前、几小时前、几天前的几个函数、类分享
Apr 09 PHP
在Linux系统下一键重新安装WordPress的脚本示例
Jun 30 PHP
php实现图片上传并进行替换操作
Mar 15 PHP
php 使用html5实现多文件上传实例
Oct 24 PHP
PHP获取IP地址所在地信息的实例(使用纯真IP数据库qqwry.dat)
Nov 15 PHP
smarty模板数学运算示例
Dec 11 PHP
PHP文件上传、客户端和服务器端加限制、抓取错误信息、完整步骤解析
Jan 12 PHP
laravel 去掉index.php伪静态的操作方法
Oct 12 PHP
关于Laravel参数验证的一些疑与惑
Nov 19 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
PHP5.0~5.6 各版本兼容性cURL文件上传功能实例分析
2018/05/11 PHP
PHP实现数据四舍五入的方法小结【4种方法】
2019/03/27 PHP
laravel 实现上传图片到本地和前台访问示例
2019/10/21 PHP
YII2框架中actions的作用与使用方法示例
2020/03/13 PHP
使用jQuery.Validate进行客户端验证(初级篇) 不使用微软验证控件的理由
2010/06/28 Javascript
js动画效果制件让图片组成动画代码分享
2014/01/14 Javascript
文本域光标操作的jQuery扩展分享
2014/03/10 Javascript
jquery简单实现外部链接用新窗口打开的方法
2015/05/30 Javascript
javascript创建函数的20种方式汇总
2015/06/23 Javascript
jQuery实现灰蓝风格标准二级下拉菜单效果代码
2015/08/31 Javascript
javascript针对cookie的基本操作实例详解
2015/11/30 Javascript
Javascript获取统一管理的提示语(message)
2016/02/03 Javascript
ES6中非常实用的新特性介绍
2016/03/10 Javascript
TypeScript学习之强制类型的转换
2016/12/27 Javascript
nodejs中向HTTP响应传送进程的输出
2017/03/19 NodeJs
vue使用Axios做ajax请求详解
2017/06/07 Javascript
深入学习TypeScript 、React、 Redux和Ant-Design的最佳实践
2019/06/17 Javascript
JavaScript实现消消乐的源代码
2021/01/12 Javascript
[02:34]DOTA2英雄基础教程 幽鬼
2014/01/02 DOTA
[10:53]2018DOTA2国际邀请赛寻真——EG
2018/08/11 DOTA
python提示No module named images的解决方法
2014/09/29 Python
python实现发送邮件功能代码
2017/12/14 Python
详解利用OpenCV提取图像中的矩形区域(PPT屏幕等)
2019/07/01 Python
python实现经典排序算法的示例代码
2021/02/07 Python
详解Sticky Footer 绝对底部的两种套路
2017/11/03 HTML / CSS
管理学专业个人求职信范文
2013/09/21 职场文书
《蜗牛的奖杯》教后反思
2014/04/24 职场文书
致800米运动员广播稿(10篇)
2014/10/17 职场文书
2015年车间安全管理工作总结
2015/05/13 职场文书
2015年会计工作总结范文
2015/05/26 职场文书
禁毒主题班会教案
2015/08/14 职场文书
求职信如何撰写?
2019/05/22 职场文书
分析MySQL抛出异常的几种常见解决方式
2021/05/18 MySQL
MYSQL数据库使用UTF-8中文编码乱码的解决办法
2021/05/26 MySQL
python中mongodb包操作数据库
2022/04/19 Python
MySQL sql模式设置引起的问题
2022/05/15 MySQL