PHP中关键字interface和implements详解


Posted in PHP onJune 14, 2017

PHP 接口

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

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

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

类中接口的应用

      1.关键字:interface

      2.关键字:implements

1.接口的介绍与创建

接口:一种成员属性全部为抽象或常量的特殊抽象类。

规则:

      1.类中全部为抽象方法。

      2.抽象方法钱不用加abstract。

      3.接口抽象方法属性为public。

      4.成员属性必须为常量。

格式代码如下:

interface demo { 
const NAME = "常量对象属性"; 
function fun1(); 
function fun2(); //抽象方法。 
}

2.接口的应用与规范

接口引用区别于类继承关键字 extends ,继承只能只是单一性,而接口可以使用关键字 implements 多个引用并用逗号分开

1.格式:普通类引用接口

class MyPc implements demo , demo2 , demo3 { 
... 
}

2.格式:抽象类应用接口例子

abstract class MyPc implements demo , demo2 , demo3 { 
... 
}

3.格式:继承父类引用接口并存

class MyPc extends Root implements demo , demo2 , demo3 { 
... 
}

先继承后接口,单继承多接口。

4.格式:接口与接口的继承

interface demo3 extends demo { 
... 
}

实例代码如下:

<?php 
interface demo { 
 const NAME = "名称"; 
 function fun1(); 
 function fun2(); 
} 
interface demo2 { 
 function fun3(); 
 function fun4(); 
} 
interface demo3 { 
 const TEST = "Test"; 
 function fun5(); 
} 
class MyPc implements demo, demo2 { 
 function fun1() { 
 echo "++++++++++<br />"; 
 } 
 function fun2() { 
 echo "----------<br />"; 
 } 
 function fun3() { 
 echo "1111111111<br />"; 
 } 
 function fun4() { 
 echo "2222222222<br />"; 
 } 
} 
class MyPs extends MyPc implements demo3 { 
 function fun5() { 
 echo "继承类后引用接口"; 
 } 
} 
$p = new MyPs; 
$p->fun1(); 
$p->fun2(); 
$p->fun3(); 
$p->fun4(); 
$p->fun5(); 
?>

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

实例代码如下:

<?php 
//定义接口 
interface User{ 
 function getDiscount(); 
 function getUserType(); 
} 
//VIP用户 接口实现 
class VipUser implements User{ 
 // VIP 用户折扣系数 
 private $discount = 0.8; 
 function getDiscount() { 
  return $this->discount; 
 } 
 function getUserType() { 
  return "VIP用户"; 
 } 
} 
class Goods{ 
 var $price = 100; 
 var $vc; 
 //定义 User 接口类型参数,这时并不知道是什么用户 
 function run(User $vc){ 
  $this->vc = $vc; 
  $discount = $this->vc->getDiscount(); 
 $usertype = $this->vc->getUserType(); 
  echo $usertype."商品价格:".$this->price*$discount; 
 } 
} 
$display = new Goods(); 
$display ->run(new VipUser); //可以是更多其他用户类型 
?>

运行该例子,输出:

VIP用户商品价格:80 元

该例子演示了一个 PHP 接口的简单应用。该例子中,User 接口实现用户的折扣,而在 VipUser 类里面实现了具体的折扣系数。最后商品类 Goods 根据 User 接口来实现不同的用户报价。

该例子仅限于演示 PHP 接口的用法,不涉及其科学与否。

实现多个接口

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

class 子类 extends 父类 implemtns 接口1, 接口2, ... 
{ 
 ...... 
}

抽象类和接口的区别

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

      1.一个子类如果 implements 一个接口,就必须实现接口中的所有方法(不管是否需要);如果是继承一个抽象类,只需要实现需要的方法即可。

      2.如果一个接口中定义的方法名改变了,那么所有实现此接口的子类需要同步更新方法名;而抽象类中如果方法名改变了,其子类对应的方法名将不受影响,只是变成了一个新的方法而已(相对老的方法实现)。

      3.抽象类只能单继承,当一个子类需要实现的功能需要继承自多个父类时,就必须使用接口。

<?php
//简单定义实现接口
interface UserInterface{ //定义user接口
 function getname();
}
interface TeacherInterface{ //定义teacher接口
 function getLengthofService();
}
class User implements UserInterface{ //实现user接口
 private $name="nostop";
 public function getName(){
  return $this->name;
 }
}
class Teacher implements TeacherInterface{ //实现teacher接口
 private $age=23;
 public function getLengthofService(){
  return $this->age;
 }
}
$user=new User();
echo $user->getName().'<br />';//nostop
$teacher=new Teacher();
echo $teacher->getLengthofService().'<br />';//23
//继承类实现接口
class GraduResultudent extends User implements TeacherInterface{ //继承User类 实现接口
 private $teacher;
 public function __construct(){  //定义构造函数
  $this->teacher=new Teacher(); //实例化Teacher对象
 }
 public function getLengthOfService(){ //实现TeacherInterface接口的方法
  return $this->teacher->getLengthOfService();
 }
}

class Result{
 public static function getUserName(UserInterface $_user){ //注意:这里面的类型变成接口类型
  echo "Name is ".$_user->getName().'<br />';
 }
 public static function getLengthOfService(TeacherInterface $_teacher){ //注意:这里面的类型变成接口类型
  echo "age is ".$_teacher->getLengthOfService();
 }
}

$object=new GraduResultudent();
Result::getUserName($object); //Name is nostop
Result::getLengthOfService($object); //age is 23
echo "<br />";
//接口实现用户的折扣
interface People{ //定义接口
 function getUserType();
 function getCount();
}

class VipUser implements People{ //实现接口
 //用户折卡系数
 private $discount=0.8;
 function getUserType(){
  return "VIP用户";
 }
 function getCount(){
  return $this->discount;  
 }
}

$vip=new VipUser(); //实现化对象
echo $vip->getUserType().'商品价格:'.$vip->getCount()*100; //VIP用户商品价格:80

class Goods{
 var $price=100;
 var $member;
 function run(People $member){ //注意:这里面的参数类型是接口类型
  $this->member=$member;
  $discount=$this->member->getCount();
  $usertype=$this->member->getUserType();
  echo $usertype."商品价格:".$this->price*$discount;
 }
}
$display=new Goods();
$display->run(new VipUser);//VIP用户商品价格:80

?>

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

PHP 相关文章推荐
一个PHP+MSSQL分页的例子
Oct 09 PHP
php检测网页是否被百度收录的函数代码
Oct 09 PHP
Yii框架form表单用法实例
Dec 04 PHP
php的crc32函数使用时需要注意的问题(不然就是坑)
Apr 21 PHP
PHP封装的Twitter访问类实例
Jul 18 PHP
PHP获取指定月份第一天和最后一天的方法
Jul 18 PHP
php mongodb操作类 带几个简单的例子
Aug 25 PHP
php观察者模式应用场景实例详解
Feb 03 PHP
PHP实现的服务器一致性hash分布算法示例
Aug 09 PHP
PHP7 安装event扩展的实现方法
Oct 08 PHP
php判断IP地址是否在多个IP段内
Aug 18 PHP
PHP实现爬虫爬取图片代码实例
Mar 03 PHP
详解php中的implements 使用
Jun 13 #PHP
PHP在弹框中获取foreach中遍历的id值并传递给地址栏
Jun 13 #PHP
php 中的closure用法详解
Jun 12 #PHP
PHP依赖注入(DI)和控制反转(IoC)详解
Jun 12 #PHP
PHP正则删除HTML代码中宽高样式的方法
Jun 12 #PHP
浅谈PHP中的面向对象OOP中的魔术方法
Jun 12 #PHP
用php+ajax新建流程(请假、进货、出货等)
Jun 11 #PHP
You might like
如何在PHP中使用Oracle数据库(3)
2006/10/09 PHP
用PHP制作的意见反馈表源码
2007/03/11 PHP
PHP集成FCK的函数代码
2008/09/27 PHP
php根据指定位置和长度获得子字符串的方法
2015/03/17 PHP
Zend Framework教程之Zend_Registry对象用法分析
2016/03/22 PHP
php中mkdir()函数的权限问题分析
2016/09/24 PHP
PHP CURL采集百度搜寻结果图片不显示问题的解决方法
2017/02/03 PHP
javascript 建设银行登陆键盘
2008/06/10 Javascript
JavaScript 读取元素的CSS信息的代码
2010/02/07 Javascript
Javascript下IE与Firefox下的差异兼容写法总结
2010/06/18 Javascript
对象无length属性时IE6/IE7中无法将其转换成伪数组(ArrayLike)
2011/07/31 Javascript
js中对象的声明方式以及数组的一些用法示例
2013/12/11 Javascript
Jquery实现点击按钮,连续地向textarea中添加值的实例代码
2014/03/08 Javascript
nodejs实现bigpipe异步加载页面方案
2016/01/26 NodeJs
node.js从数据库获取数据
2016/05/08 Javascript
js基于cookie方式记住返回页面用法示例
2016/05/27 Javascript
Actionscript与javascript交互实例程序(修改)
2016/09/22 Javascript
使用PBFunc在Powerbuilder中支付宝当面付款功能
2016/10/01 Javascript
Vue指令的钩子函数使用方法
2017/03/20 Javascript
使用cropper.js裁剪头像的实例代码
2017/09/29 Javascript
angularjs中判断ng-repeat是否迭代完的实例
2018/09/12 Javascript
微信小程序picker组件关于objectArray数据类型的绑定方法
2019/03/13 Javascript
vue中npm包全局安装和局部安装过程
2019/09/03 Javascript
layui在form表单页面通过Validform加入简单验证的方法
2019/09/06 Javascript
[06:38]DOTA2怒掀电竞风暴 2013Chinajoy
2013/07/27 DOTA
Python遍历文件夹 处理json文件的方法
2019/01/22 Python
在pycharm中关掉ipython console/PyDev操作
2020/06/09 Python
css3 旋转按钮 使用CSS3创建一个旋转可变色按钮
2012/12/31 HTML / CSS
DHC中国官方购物网站:日本通信销售No.1化妆品
2016/08/20 全球购物
Lime Crime官网:美国一家主打梦幻精灵系的彩妆品牌
2019/03/22 全球购物
慈善捐赠倡议书
2014/08/30 职场文书
英语自我介绍演讲稿
2014/09/01 职场文书
销售员岗位职责
2015/02/10 职场文书
Python集合的基础操作
2021/11/01 Python
SpringBoot整合minio快速入门教程(代码示例)
2022/04/03 Java/Android
Spring Boot项目传参校验的最佳实践指南
2022/04/05 Java/Android