php抽象 与接口

抽象方法和抽象类

PHP5支持抽象类和抽象方法。抽象类不能直接被实例化,你必须先继承该抽象类,然后再实例化子类。抽象类中 至少要包含一个抽象方法。如果类方法被声明为抽象的,那么其中就不能包括具体的功能实现。

继承一个抽象类的时候,子类必须实现抽象类中的所有抽象方法;另外,这些方法的可见性 必须和抽象类中一样(或者更为宽松)。如果抽象类中某个抽象方法被声明为protected,那么子类中实现的方法就应该声明为protected或者public,而不 能定义为private。

定义

什么是抽象方法?我们在类里面定义的没有方法体的方法就是抽象方法,所谓的没有方法体指的是,在方法声明的时候没有大括号以及其中的内容,而是直接在声明时在方法名后加上分号结束,另外在声明抽象方法时还要加一个关键字“abstract”来修饰;

abstract function fun1();
abstract function fun2();

 

那么什么是抽象类呢?只要一个类里面有一个方法是抽象方法,那么这个类就要定义为抽象类,抽象类也要使用“abstract”关键字来修饰;在抽象类里面 可以有不是抽象的方法和成员属性,但只要有一个方法是抽象的方法,这个类就必须声明为抽象类,使用”abstract”来修饰

abstract class Demo
{var $test;abstract function fun1();abstract function fun2();function fun3(){... ...}
}

 上例中定义了一个抽象类“Demo”使用了”abstract”来修饰, 在这个类里面定义了一个成员属性“$test”,和两个抽象方法“fun1”和“fun2”还有一个非抽象的方法fun3();那么抽象类我们怎么使用 呢?最重要的一点就是抽象类不能产生实例对象,所以也不能直接使用,前面我们多次提到过类不能直接使用,我们使用的是通过类实例化出来的对象,那么抽象类 不能产生实例对象我们声明抽象类有什么用呢?我们是将抽象方法是做为子类重载的模板使用的,定义抽象类就相当于定义了一种规范,这种规范要求子类去遵守, 子类继函抽象类之后,把抽象类里面的抽象方法按照子类的需要实现。子类必须把父类中的抽象方法全部都实现,否则子类中还存在抽象方法,那么子类还是抽象 类,还是不能实例化对;为什么我们非要从抽象类中继承呢?因为有的时候我们要实现一些功能就必须从抽象类中继承,否则这些功能你就实现不了,如果继承了抽 象类,就要实现类其中的抽象方法;

$demo=new Demo();class Test extends Demo
{function fun1(){... ...}function fun2(){... ...}
}

 

PHP 接口

PHP 类是单继承,也就是不支持多继承,当一个类需要多个类的功能时,继承就无能为力了,为此 PHP 引入了类的接口技术。

如果一个抽象类里面的所有方法都是抽象方法,且没有声明变量,而且接口里面所有的成员都是 public 权限的,那么这种特殊的抽象类就叫 接口 。

接口使用关键字 interface 来定义,并使用关键字 implements 来实现接口中的方法,且必须完全实现。

例子:

 <?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;}
}// 下面的写法是错误的,会报错:
// Fatal error: Class BadTemplate contains 1 abstract methods
// and must therefore be declared abstract (iTemplate::getHtml)
class BadTemplate implements iTemplate
{private $vars = array();public function setVariable($name, $var){$this->vars[$name] = $var;}
}
?> 

 

实现多个接口

PHP也可以在继承一个类的时候同时实现多个接口:

class 子类 extends 父类 implemtns 接口1, 接口2, ...
{......
}
 <?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(){}
}
?> 

抽象类和接口的区别

接口是特殊的抽象类,也可以看做是一个模型的规范。接口与抽象类大致区别如下:

  1. 一个子类如果 implements 一个接口,就必须实现接口中的所有方法(不管是否需要);如果是继承一个抽象类,只需要实现需要的方法即可。
  2. 如果一个接口中定义的方法名改变了,那么所有实现此接口的子类需要同步更新方法名;而抽象类中如果方法名改变了,其子类对应的方法名将不受影响,只是变成了一个新的方法而已(相对老的方法实现)。
  3. 抽象类只能单继承,当一个子类需要实现的功能需要继承自多个父类时,就必须使用接口。

 

 

转载于:https://www.cnblogs.com/zoubizhici/p/5570224.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/490532.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++ string转字符串

假设有一个string字符串&#xff0c;定义为string s "123"&#xff0c;则以下两种方法均可将其转换为char* s.c_str()s.data() 区别在于data除了返回字符串内容外&#xff0c;不附加结束符’\0’&#xff0c;而c_str()返回一个以‘\0’结尾的字符数组。 注意&…

Nature展示迄今为止最详细的“人脑零部件清单”

来源&#xff1a;中国生物技术网近日&#xff0c;美国艾伦脑科学研究所的一项新研究为我们展示了迄今为止最详细的“人脑零部件清单”&#xff0c;阐明了人类大脑皮层的细胞结构&#xff0c;它对于理解我们的认知能力和对疾病的易感性至关重要。该研究近日已发表在《Nature》上…

matlab调用ANSYS--------2

最近使用ANSYS计算温度场方面的东西&#xff0c;每次都要手动运行&#xff0c;自己处理计算结果。可怜无助的我深感劳累啊&#xff0c;最主要的是怎么能把我宝贵的时间用在重复的劳动中。so&#xff0c;出于懒的需要&#xff0c;查询了一些关于matlab调用ANSYS的资料&#xff0…

beautifulsoup网页爬虫解析_爬虫第三天——初识Xpath

解析神器Xpath&#xff1a;1. 什么是XpathXPath即为XML路径语言&#xff08;XML Path Language&#xff09;&#xff0c;它是一种用来确定XML文档中某部分位置的语言。XPath基于XML的树状结构&#xff0c;提供在数据结构树中找寻节点的能力。起初XPath的提出的初衷是将其作为一…

全球知名大学课件下载地址汇总

本文集合了美国众多知名大学的网上课程课件&#xff0c;不用花一分钱就能获得知名大学的前沿知识&#xff01;聪明的同学早就收藏转发啦 美国大学课件下载地址汇总 1、加州大学伯克利分校http://webcast.berke…

C++将01数组转换为二进制对应的数值

假设有一个32维的01数组array&#xff0c;假设array的值为 01001010001011110100101000101111 如果需要将其转换为用该数组值代表的二进制所对应的数值&#xff0c;即通过该数组得到01001010001011110100101000101111这个int型数值&#xff08;int型有4字节&#xff0c;一共4…

机器人4.0时代来临!四大核心技术助推大规模商用部署

来源&#xff1a;北京物联网智能技术应用协会当前&#xff0c;全球机器人市场规模持续扩大&#xff0c;工业机器人市场增速稳定&#xff0c;服务机器人增速突出。2018 年&#xff0c;全球机器人市场规模达 298.2 亿美元&#xff0c; 2013-2018 年的平均增长率约为 15.1%。 在装…

Chapter2 MSP430硬件结构

1、总架构 MSP430单片机采用冯诺依曼结构&#xff0c;包含16位RISC CPU、存储器、片内外设、时钟系统、仿真系统以及数据总线和地址总线。 2、MSP430X CPU(CPUX) DB    AB          ALU位数 MSP430F1XX 16位  16位(最大寻址64KB) …

怎么用python编写个apk_新手用tkinter写了一个APK提取工具

[Python] 纯文本查看 复制代码""" author:qh datetime:2019-3-15 mood:<(*&#xffe3;▽&#xffe3;*)/ """ import os import base64 import requests import json import shutil import hashlib from tkinter import * from tkinter impo…

Matlab给Ansys助攻

大家好&#xff0c;今天二狗准备介绍一下如何利用matlab写一些简单的脚本去解决一些复杂的事情&#xff0c;比如为大型有限元软件Ansys服务&#xff08;类比&#xff09;包括数值模拟的前处理和后处理&#xff0c;都大有作为。用过Ansys&#xff08;没有Ctrlz&#xff09;的童鞋…

归并排序的时间复杂度为什么为nlogn

归并排序的递归过程如下&#xff0c;该递归树的高度为log2n&#xff08;计算过程&#xff1a;假设待排序的数组元素个数为n&#xff0c;设高度为x&#xff0c;x意味着n个元素需要连续二分x次才剩下1个元素&#xff0c;即n/2^x1&#xff0c;xlog2n&#xff09;&#xff0c;每一层…

reflection

function $f new ReflectionFunction(funcName);var_dump($f->getFileName());exit; method $func new ReflectionMethod(classname,function); var_dump($func->getFileName()); 转载于:https://www.cnblogs.com/fenle/p/5573841.html

python二分法查找算法_排序算法和二分法查找

请填充代码&#xff0c;使mySort()能使传入的参数按照从小到大的顺序显示出来。 function mySort() { var tags new Array(); for (var i 0; i < arguments.length; i) { tags.push(arguments[i]); } tags.sort(function sortNum(a, b) { return a - b; }); return tags; …

深度解读达芬奇架构:华为AI芯片的“秘密武器”

本文转自华为官网2019年6月&#xff0c;华为发布全新8系列手机SoC芯片麒麟810&#xff0c;首次采用华为自研达芬奇架构NPU&#xff0c;实现业界领先端侧AI算力&#xff0c;在业界公认的苏黎世联邦理工学院推出的AI Benchmark榜单中&#xff0c;搭载麒麟810的手机霸榜TOP3&#…

FGSM(Fast Gradient Sign Method)python实现

有现成的库cleverhans可以调用 https://github.com/cleverhans-lab/cleverhans 这个库是用tensorflow实现的&#xff0c;但也实现了pytorch版本 因为我调用的是pytorch版本&#xff0c;我接下来大概讲一下如何使用 他们给出了一个调用pytorch版本的例子&#xff1a; https…

记忆化搜索 codevs 2241 排序二叉树

codevs 2241 排序二叉树 ★ 输入文件&#xff1a;bstree.in 输出文件&#xff1a;bstree.out 简单对比时间限制&#xff1a;1 s 内存限制&#xff1a;128 MB 【问题描述】 一个边长为n的正三角形可以被划分成若干个小的边长为1的正三角形&#xff0c;称为单位三角形。 …

窥探当今AI芯片中的类脑模型

来源&#xff1a;脑人言撰文丨邓 磊&#xff08;加州大学-圣塔芭芭拉分校UCSB 博士后&#xff09;责编丨高茂森 Soma排版丨夏獭科学研究的动机&#xff0c;并非仅仅是出于能看到多酷炫的应用&#xff0c;而是因为我们尚有诸多未知世界需要探寻&#xff0c;这是一切应用的前提。…

mysql调优_MYSQL企业常用架构与调优经验分享

一、选择Percona Server、MariaDB还是MYSQL1、Mysql三种存储引擎MySQL提供了两种存储引擎&#xff1a;MyISAM和 InnoDB&#xff0c;MySQL4和5使用默认的MyISAM存储引擎。从MYSQL5.5开始&#xff0c;MySQL已将默认存储引擎从MyISAM更改为InnoDB。MyISAM没有提供事务支持&#xf…

shutdown-t-s3600定时关机

winr定时关机shutdown-t-s3600 单位 秒

pycharm无缘无故打开Nosetest

一个正常的代码&#xff0c;本来前几天可以正常run&#xff0c;突然有一天点击run之后不是运行程序&#xff0c;而是报错一堆&#xff1a; Launching Nosetest with arguments。。。 usage: _jb_nosetest_runner.py 。。。 _jb_nosetest_runner.py: error: unrecognized arg…