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 相关文章推荐
第二节 对象模型 [2]
Oct 09 PHP
echo, print, printf 和 sprintf 区别
Dec 06 PHP
PHP的单引号和双引号 字符串效率
May 27 PHP
php smarty函数扩展
Mar 15 PHP
php高级编程-函数-郑阿奇
Jul 04 PHP
php类中private属性继承问题分析
Nov 01 PHP
ThinkPHP标签制作教程
Jul 10 PHP
PHP curl模拟登录带验证码的网站
Nov 30 PHP
PHP实现统计在线人数功能示例
Oct 15 PHP
PHP中大括号'{}'用法实例总结
Feb 08 PHP
PHP环形链表实现方法示例
Sep 15 PHP
PHP children()函数讲解
Feb 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+AJAX聊天程序[聊天室]提供下载
2007/07/21 PHP
GBK的页面输出JSON格式的php函数
2010/02/16 PHP
探讨PHP中this,self,parent的区别详解
2013/06/08 PHP
php使用百度天气接口示例
2014/04/22 PHP
检测codeigniter脚本消耗内存情况的方法
2015/03/21 PHP
Laravel 5框架学习之向视图传送数据(进阶篇)
2015/04/08 PHP
WordPress中自定义后台管理界面配色方案的小技巧
2015/12/29 PHP
PHP4和PHP5版本下解析XML文档的操作方法实例分析
2017/05/20 PHP
js捕获鼠标滚轮事件代码
2013/12/16 Javascript
JS正则表达式验证数字代码
2014/01/28 Javascript
alert出数组中的随即值代码
2014/09/25 Javascript
EasyUI实现第二层弹出框的方法
2015/03/01 Javascript
jQuery实现ajax的叠加和停止(终止ajax请求)
2016/08/08 Javascript
AngularJS应用开发思维之依赖注入3
2016/08/19 Javascript
js面向对象编程总结
2017/02/16 Javascript
socket.io学习教程之深入学习篇(三)
2017/04/29 Javascript
深入理解移动前端开发之viewport
2018/10/19 Javascript
vue中如何实现后台管理系统的权限控制的方法步骤
2019/09/05 Javascript
[01:38]完美世界DOTA2联赛(PWL)宣传片:第一站
2020/10/26 DOTA
Python 文件操作技巧(File operation) 实例代码分析
2008/08/11 Python
Python 调用VC++的动态链接库(DLL)
2008/09/06 Python
python使用datetime模块计算各种时间间隔的方法
2015/03/24 Python
python执行等待程序直到第二天零点的方法
2015/04/23 Python
python中list常用操作实例详解
2015/06/03 Python
Python调用C语言的方法【基于ctypes模块】
2018/01/22 Python
Python pandas用法最全整理
2019/08/04 Python
nginx搭建基于python的web环境的实现步骤
2020/01/03 Python
Selenium使用Chrome模拟手机浏览器方法解析
2020/04/10 Python
Python+Kepler.gl实现时间轮播地图过程解析
2020/07/20 Python
荷兰网上鞋店:Ziengs.nl
2017/01/02 全球购物
Hotels.com英国:全球领先的酒店住宿提供商
2019/01/24 全球购物
大学毕业生自荐书怎么写?
2014/01/06 职场文书
亚布力滑雪场导游词
2015/02/09 职场文书
创业计划书之小型广告公司
2019/10/22 职场文书
关于springboot配置druid数据源不生效问题(踩坑记)
2021/09/25 Java/Android
Java后端 Dubbo retries 超时重试机制的解决方案
2022/04/14 Java/Android