Blogger Information
Blog 36
fans 0
comment 0
visits 28234
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
面向对象——接口与trait的基本功能
phpcn_u202398
Original
779 people have browsed it

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的基本功能。

Correcting teacher:天蓬老师天蓬老师

Correction status:qualified

Teacher's comments:为什么要把一个功能分到多个类, 或者trait中, 原因只有一个, 就是为了好维护, 这样就可以把不同的功能模板交给不同的人处理
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post