博客列表 >PHP基础-接口, trait的基本语法和使用场景举例

PHP基础-接口, trait的基本语法和使用场景举例

岂几岂几
岂几岂几原创
2020年05月02日 02:46:39728浏览

1. 接口的基本语法和使用场景

1.1 接口可以突破PHP类的继承限制, 允许多继承, 形成了多层级的接口

  1. Demo: 使用接口实现多继承
  2. // 接口1
  3. interface Itf1
  4. {
  5. public function func1();
  6. public static function func2();
  7. }
  8. // 接口2
  9. interface Itf2
  10. {
  11. public const CONST1 = '我是接口声明的常量';
  12. }
  13. // 实现类
  14. /* 多继承 */
  15. class Demo1 implements Itf1, Itf2
  16. {
  17. public function func1()
  18. {
  19. return '我是' . __METHOD__;
  20. }
  21. public static function func2()
  22. {
  23. return '我是' . __METHOD__;
  24. }
  25. public static function getConst()
  26. {
  27. return self::CONST1;
  28. }
  29. }
  30. // 客户端调用
  31. /* 获取接口常量 */
  32. echobr(Demo1::getConst());
  33. /* 调用接口声明的方法 */
  34. echobr((new Demo1)->func1());
  35. echobr(Demo1::func2());
  36. /*
  37. result:
  38. 我是接口声明的常量
  39. 我是Demo1::func1
  40. 我是Demo1::func2
  41. */

1.2 接口继承, 使用extends关键字, 接口定义时, 可以继承多个其他接口

  1. /** Demo2: 定义接口时, 继承另外的接口 */
  2. interface Itf3 extends Itf1, Itf2
  3. {
  4. // 啥也不做, 就继承Itf1和Itf2两个接口
  5. }
  6. // 实现类
  7. class Demo2 implements Itf3
  8. {
  9. public function func1()
  10. {
  11. return '我是' . __METHOD__;
  12. }
  13. public static function func2()
  14. {
  15. return '我是' . __METHOD__;
  16. }
  17. public static function getConst()
  18. {
  19. return self::CONST1;
  20. }
  21. }
  22. // 客户端调用
  23. /* 获取接口常量 */
  24. echobr(Demo2::getConst());
  25. /* 调用接口声明的方法 */
  26. echobr((new Demo2)->func1());
  27. echobr(Demo2::func2());
  28. /*
  29. result:
  30. 我是接口声明的常量
  31. 我是Demo2::func1
  32. 我是Demo2::func2
  33. */

1.3 使用抽象类可以实现接口的部分抽象方法

  1. /** Demo3: */
  2. // 抽象类
  3. abstract class AbsDemo implements Itf3
  4. {
  5. /* 只实现func1方法 */
  6. public function func1()
  7. {
  8. return '我是' . __METHOD__;
  9. }
  10. /* func2方法留着由实现类来实现 */
  11. abstract public static function func2();
  12. }
  13. // 实现类
  14. class Demo3 extends AbsDemo
  15. {
  16. public static function func2()
  17. {
  18. return __METHOD__ . '方法, 由' . __CLASS__ . '实现';
  19. }
  20. }
  21. // 客户端调用
  22. /* 获取接口常量 */
  23. echobr(Demo3::CONST1);
  24. /* 调用接口声明的方法 */
  25. echobr((new Demo3)->func1());
  26. echobr(Demo3::func2());
  27. /*
  28. result:
  29. 我是接口声明的常量
  30. 我是AbsDemo::func1
  31. Demo3::func2方法, 由Demo3实现
  32. */

1.4 接口允许的成员有: 抽象方法, 常量, 构造方法(魔术方法的一种)

  1. // Demo4: 接口允许的成员
  2. interface Itf4
  3. {
  4. // 1. 常量
  5. public const CONST1 = '我是接口声明的常量';
  6. // 2. 抽象方法
  7. /* 普通抽象方法 */
  8. public function func1();
  9. /* 静态抽象方法 */
  10. public static function func2();
  11. // 3. 构造方法
  12. public function _construct();
  13. }

2. trait的基本语法与使用场景

2.1 trait的基本语法

  • 使用trait关键字定义trait
  • trait允许的成员有: 普通属性, 普通方法, 静态属性, 静态方法, 普通抽象成员, 普通抽象方法, 静态抽象属性, 静态抽象方法等. 不能在trait中定义常量.
  1. /** Demo1: 定义trait, trait允许的成员 */
  2. trait Trait1
  3. {
  4. // 普通成员
  5. /* 使用trait的类中不能有同名属性, 所以一般不在trait中 */
  6. public $username = 'zhangsan';
  7. public function func1()
  8. {
  9. return '我是一个普通的方法';
  10. }
  11. // 静态成员
  12. public static $message = '有内奸, 终止交易';
  13. public static function func2()
  14. {
  15. return '我是一个静态方法';
  16. }
  17. // 抽象成员
  18. /* 普通抽象成员 */
  19. public $param;
  20. abstract public function func3();
  21. /* 静态抽象成员 */
  22. public static $staticParam;
  23. abstract public static function func4();
  24. }

2.1 trait基本使用场景: 实现代码复用

  1. // 打招呼的trait
  2. trait Trait2
  3. {
  4. public static function sayHi()
  5. {
  6. return '你好, 我是' . __CLASS__;
  7. }
  8. }
  9. // 使用trait的类
  10. class Demo4
  11. {
  12. // 使用trait, 相当于把trait中定义的成员复制粘贴到使用类中
  13. use Trait2;
  14. }
  15. // 客户端调用
  16. echobr(Demo4::sayHi());
  17. /*
  18. result:
  19. 你好, 我是Demo4
  20. */

3. 学习心得

  • 接口规定了一类事物应有的行为, 但并不提供这些行为的实现. 在实际使用中, 会把接口作为方法的参数, 方法在使用接口的方法时, 可以不关心接口的具体实现. 如:数据库操作, 只需知道调用接口的SQL处理方法, 就能返回什么样的数据即可. 而数据库操作的实现, 连接数据库的方式, 甚至使用什么数据库, 是可以暂时不关注的.
  • trait提供了一种比类库的概念小的工具集合, 它也能实现代码的复用. 除开不能定义常量属性外, 其他成员类型均可在trait中定义. 可以把trait看作是不能实例化的普通类, 或是以use方式引入的抽象类.
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议