博客列表 >面向接口编程与trait

面向接口编程与trait

赵大叔
赵大叔原创
2020年05月02日 16:38:22736浏览

接口

1、基本语法和使用场景

声明关键字: interface
语法和类相似: 抽象方法, 常量, 构造方法
所有方法都是抽象方法
访问控制必须是public
接口: 完全分离了” 设计(抽象类中完成)与实现(工作类中完成)
实现接口关键字:implements
突破php类的继承限制,实现多继承(多层级)

2、接口成员和接口继承

接口成员有:接口常量接口方法构造方法

3、实例演示代码:

单接口:

  1. <?php
  2. // 接口使用场景1: 单接口
  3. interface iActor
  4. {
  5. // 接口常量
  6. const NATION = '中国';
  7. // 接口方法: 都是抽象方法
  8. public function resume();
  9. }
  10. // 工作类实现接口
  11. class Lending implements iActor
  12. {
  13. protected $name = '张小哥';
  14. // 接口中的抽象方法,必须在工作类实现
  15. public function resume()
  16. {
  17. return $this->name . ' 的国籍是: ' . iActor::NATION;
  18. }
  19. }
  20. // 客户端
  21. $lending = new Lending;
  22. echo $lending->resume();

效果图:

接口多继承:

  1. <?php
  2. // 接口多层级继承
  3. interface iName
  4. {
  5. // 接口常量
  6. const NAME1 = '张三丰';
  7. }
  8. interface iSchool
  9. {
  10. // 接口常量
  11. const SCHOOL1 = '武当';
  12. }
  13. interface iNfor
  14. {
  15. // 接口方法
  16. public function in();
  17. }
  18. // 实现类
  19. class User implements iName, iSchool, iNfor
  20. {
  21. public function in()
  22. {
  23. return iName::NAME1 . '--->' . iSchool::SCHOOL1 .'<br>';
  24. }
  25. }
  26. echo ( new User)->in();

效果图:

抽象类部分实现接口方法:

  1. <?php
  2. // 抽象类部分实现接口方法
  3. interface iPerformanc
  4. {
  5. public function bushi(int $diem, int $base1);
  6. public function jishu(int $base);
  7. }
  8. // 用抽象类只实现接口的一个方法: jishu()
  9. abstract class cAlculat implements iPerformanc
  10. {
  11. public function jishu(int $base)
  12. {
  13. return $base;
  14. }
  15. }
  16. // 工作类
  17. class Tinh extends cAlculat
  18. {
  19. public function bushi(int $diem, int $base)
  20. {
  21. return $hieuqua = $base * 0.6 * (($diem-100)/100);
  22. }
  23. }
  24. // 调用
  25. $base = (new Tinh) -> jishu(549);
  26. echo '绩效是:' .(new Tinh) -> bushi(116,$base);

效果图:

接口实现多态操作:

  1. <?php
  2. namespace demo2;
  3. //接口实现多态
  4. interface iPerformanc
  5. {
  6. const JISHU = 520;
  7. public function cach(int $diem);
  8. }
  9. // cach tinh bushi
  10. class Bushi implements iPerformanc
  11. {
  12. public function cach(int $diem)
  13. {
  14. return $jixiao = iPerformanc::JISHU * 0.6 * (($diem-100)/100);
  15. }
  16. }
  17. // cach tinh xuong
  18. class Xuong implements iPerformanc
  19. {
  20. public function cach(int $diem)
  21. {
  22. return $jixiao = iPerformanc::JISHU * 0.8 * (($diem-100)/100);
  23. }
  24. }
  25. // 调用
  26. // 计算部窒绩效
  27. echo (new Bushi) -> cach(116) .'<br>';
  28. // 计算分厂绩效
  29. echo (new Xuong) -> cach(116) .'<br>';

效果图:

trait

调用关键字:use
声明关键词:trait
trait里面可以有:静态成员,抽象成员,普通成员;不能使用常量。
trait内的属性会和调用它的类内的同名的属性冲突:
优先顺序:当前类成员 > trait类成员 > 基类成员
一个类可以继承多个trait, 通过逗号相隔
trait不能在接口中使用

实例演示代码:

  1. <?php
  2. // trait: 间接实现横向多继承
  3. trait myTrait
  4. {
  5. public static $name = '我是: Trait中的属性';
  6. }
  7. class Tinhluong
  8. {
  9. public static function in() {
  10. return '父类方法: Tinhluong';
  11. }
  12. }
  13. class Tinhson extends Tinhluong
  14. {
  15. use myTrait;
  16. public static function in() {
  17. return '子类方法: Tinhson';
  18. }
  19. }
  20. echo Tinhluong::in() .'<br>';
  21. echo Tinhson::$name .'<br>';
  22. echo Tinhson::in() .'<br>';

实例演示效果图:

总结:作业写下来的感觉就是:原理懂了,但是具体怎么用还很蒙——课堂连接数据库案例也能看懂,但是要自己上手写就很吃力了,所以自己写了个简单例子。

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议