博客列表 >面向对象——接口与trait的基本功能

面向对象——接口与trait的基本功能

phpcn_u202398
phpcn_u202398原创
2020年05月01日 09:15:52785浏览

1、接口

1.1、多接口继承

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

  • 必须实现接口中的抽象方法

代码示例
  1. <?php
  2. //接口
  3. interface iSchool
  4. {
  5. //接口常量
  6. const school="清华大学";
  7. }
  8. interface iUser extends iSchool
  9. {
  10. //接口常量
  11. const name ="张三";
  12. const age = 23;
  13. }
  14. //接口实现多继承
  15. interface Infor extends iUser, iSchool
  16. {
  17. //接口方法
  18. public function print();
  19. }
  20. //实现类
  21. class Inf implements iSchool, Infor, iUser
  22. {
  23. public function print(){
  24. return "姓名:". iUser::name."<br>年龄:". iUser::age."<br>就读学校:". iSchool::school;
  25. }
  26. }
  27. //客户端实现
  28. echo (new Inf)->print();
  29. echo "<br>";
  30. //实现类
  31. class Inf1 implements Infor
  32. {
  33. public function print(){
  34. return "姓名:". iUser::name."<br>年龄:".iUser::age."<br>就读学校:".iSchool::school;
  35. }
  36. }
  37. //客户端实现
  38. echo (new Inf1)->print();
  39. ?>

1.2、抽象类实现接口

代码示例
  1. <?php
  2. // 用抽象类来部分实现一个接口
  3. interface iDb
  4. {
  5. // 接口方法
  6. public static function insert($db, $data);
  7. public static function select($db, $options=[]);
  8. public static function update($db,$options);
  9. public static function delete($db, $where);
  10. // 连接数据库
  11. public static function connect($dsn, $usrname, $pwd);
  12. }
  13. // 用一个抽象类只实现接口的连接方法: connect()
  14. abstract class aDb implements iDb
  15. {
  16. protected static $db = null;
  17. public static function connect($dsn, $username, $pwd)
  18. {
  19. self::$db = new PDO($dsn,$username,$pwd);
  20. return self::$db;
  21. }
  22. }
  23. // 工作类: 通用查询
  24. class DB extends aDb
  25. {
  26. public static function insert($db, $data)
  27. {
  28. }
  29. public static function select($db, $options=[])
  30. {
  31. $sql = 'select * from admins limit 5';
  32. return $db->query($sql);
  33. }
  34. public static function update($db,$options)
  35. {
  36. }
  37. public static function delete($db, $where)
  38. {
  39. }
  40. }
  41. // 客户端
  42. $config = [
  43. 'type' => $type ?? 'mysql',
  44. 'host' => $hsot ?? 'localhost',
  45. 'dbname' => $dbname ?? 'xxyl',
  46. 'charset' => $charset ?? 'utf8',
  47. 'port' => $port ?? '3306',
  48. 'username' => $username ?? 'root',
  49. 'password' => $pwd ?? 'root',
  50. ];
  51. // 创建PDO数据源
  52. $dsn = sprintf('%s:host=%s;dbname=%s;',$config['type'],$config['host'],$config['dbname']);
  53. // 使用自定义用户密码
  54. $username = $config['username'];
  55. $pawd = 'root';
  56. // 连接数据库: 实际上调用的是抽象类中的connect()方法完成,返回连接对象$db
  57. $db = DB::connect($dsn, $username, $pawd);
  58. // 查询操作
  59. $users = DB::select($db);
  60. // 遍历结果集
  61. foreach ($users as list('id'=>$id, 'name'=>$name,'phone'=>$phone)) {
  62. printf('%s => %s <br>', $id, $name,$phone);
  63. }
  64. ?>

1.3、接口实现多态

代码实例
  1. <?php
  2. // 接口来实现多态
  3. interface iDb
  4. {
  5. // 接口方法
  6. public static function insert($db, $data);
  7. public static function select($db, $options=[]);
  8. public static function update($db,$options);
  9. public static function delete($db, $where);
  10. // 连接数据库
  11. public static function connect($dsn, $usrname, $pwd);
  12. }
  13. // 用一个抽象类只实现接口的连接方法: connect()
  14. class PDO_Db implements iDb
  15. {
  16. protected static $db = null;
  17. public static function connect($dsn, $username, $pwd)
  18. {
  19. self::$db = new PDO($dsn,$username,$pwd);
  20. return self::$db;
  21. }
  22. public static function insert($db, $data)
  23. {
  24. }
  25. public static function select($db, $options=[])
  26. {
  27. }
  28. public static function update($db,$options)
  29. {
  30. }
  31. public static function delete($db, $where)
  32. {
  33. }
  34. }
  35. class SQL_Db implements iDb
  36. {
  37. protected static $db = null;
  38. public static function connect($dsn, $username, $pwd)
  39. {
  40. self::$db = new PDO($dsn,$username,$pwd);
  41. return self::$db;
  42. }
  43. public static function insert($db, $data)
  44. {
  45. }
  46. public static function select($db, $options=[])
  47. {
  48. }
  49. public static function update($db,$options)
  50. {
  51. }
  52. public static function delete($db, $where)
  53. {
  54. }
  55. }
  56. // 工作类: 通用查询
  57. class DB
  58. {
  59. public static function insert($db, $data)
  60. {
  61. }
  62. public static function select($db, $options=[])
  63. {
  64. $sql = 'select * from admins limit 5';
  65. return $db->query($sql);
  66. }
  67. public static function update($db,$options)
  68. {
  69. }
  70. public static function delete($db, $where)
  71. {
  72. }
  73. }
  74. // 客户端
  75. $config = [
  76. 'type' => $type ?? 'mysql',
  77. 'host' => $hsot ?? 'localhost',
  78. 'dbname' => $dbname ?? 'xxyl',
  79. 'charset' => $charset ?? 'utf8',
  80. 'port' => $port ?? '3306',
  81. 'username' => $username ?? 'root',
  82. 'password' => $pwd ?? 'root',
  83. ];
  84. // 创建PDO数据源
  85. $dsn = sprintf('%s:host=%s;dbname=%s;',$config['type'],$config['host'],$config['dbname']);
  86. // 使用自定义用户密码
  87. $username = $config['username'];
  88. $pawd = 'root';
  89. $db = PDO_Db::connect($dsn, $username, $pawd);
  90. $db = SQL_Db::connect($dsn, $username, $pawd);
  91. // 查询操作
  92. $users = DB::select($db);
  93. // 遍历结果集
  94. foreach ($users as list('id'=>$id, 'name'=>$name,'phone'=>$phone)) {
  95. printf('%s => %s <br>', $id, $name,$phone);
  96. }
  97. ?>

2、trait的基本功能

  • Trait 是为类似 PHP 的单继承语言而准备的一种代码复用机制
  • 从基类继承的成员会被 trait 插入的成员所覆盖。优先顺序是来自当前类的成员覆盖了 trait 的方法,而 trait 则覆盖了被继承的方法。
    代码实例
  1. <?php
  2. trait User{
  3. // 常规
  4. protected $name = '李明';
  5. public function getName()
  6. {
  7. return $this->name;
  8. }
  9. // 静态
  10. public static $sex = '男';
  11. public static function getSex()
  12. {
  13. return self::$sex;
  14. }
  15. // 抽象
  16. // 抽象静态属性
  17. public static $School;
  18. // 抽象静态方法
  19. abstract public static function getSchool();
  20. }
  21. class Infor {
  22. public static function getSchool()
  23. {
  24. return self::$School;
  25. }
  26. use User;
  27. }
  28. $inf = new Infor();
  29. Infor::$School="清华大学";
  30. echo $inf->getName() .'-->'.$inf->getSex().'-->'.$inf->getSchool();

学习总结

本节课我们学习了接口与trait的基本功能,学习到了php通过接口实现多继承,以及多态的概念,对trait知识有了初步的了解。通过以后的实践来深层次了理解接口与trait的基本功能。

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