博客列表 >0816-自动加载器、Trait、数据库连接插入数据操作

0816-自动加载器、Trait、数据库连接插入数据操作

三九三伏
三九三伏原创
2022年09月01日 09:27:30480浏览

一、自动加载器

非自动加载方式

缺点:require太多

  1. namespace admin;
  2. echo '当前命名空间:'.__NAMESPACE__.'<br>';
  3. //namespace是对当前命名空间的引用
  4. // class Test
  5. // {
  6. // }
  7. // $test = new namespace\Test();
  8. require __DIR__.'/admin/controller/Demo1.php';
  9. require __DIR__.'/admin/controller/Demo2.php';
  10. require __DIR__.'/admin/controller/Demo3.php';
  11. // use默认必须是“完全限定名称”,所以“\”全局空间标识符可以不写。
  12. use admin\controller\Demo1;
  13. use admin\controller\Demo2;
  14. use admin\controller\Demo3;
  15. // 访问三个控制器Demo1-3的index
  16. // 完全限定名称,绝对路径。
  17. // echo \admin\controller\Demo1::index().'<br>';
  18. // echo \admin\controller\Demo2::index().'<br>';
  19. // echo \admin\controller\Demo3::index().'<br>';
  20. // 限定名称,相对路径。
  21. // echo controller\Demo1::index().'<br>';
  22. // echo controller\Demo2::index().'<br>';
  23. // echo controller\Demo3::index().'<br>';
  24. // 非限定名称,当前路径。
  25. echo Demo1::index().'<br>';
  26. echo Demo2::index().'<br>';
  27. echo Demo3::index().'<br>';

自动加载器

解决require过多的问题
demo3.php代码

  1. require __DIR__.DIRECTORY_SEPARATOR.'autoloader.php';
  2. use admin\controller\Demo1;
  3. use admin\controller\Demo2;
  4. use admin\controller\Demo3;
  5. // 非限定名称,当前路径。
  6. echo Demo1::index().'<br>';
  7. echo Demo2::index().'<br>';
  8. echo Demo3::index().'<br>';

自动加载器autoloader.php代码

  1. // 自动加载器
  2. spl_autoload_register(function ($class){
  3. require $class.'.php';
  4. });

./controller/Demo1.php代码

  1. <?php
  2. /**
  3. * 为实现自动加载器,应该遵循一些约定
  4. * 1. 一个文件只有一个类。
  5. * 2. 这个类名和文件名必须一致。
  6. * 3. 这个类的命名空间,必须映射到类文件所在的路径。
  7. */
  8. namespace admin\controller;
  9. class Demo1
  10. {
  11. public static function index()
  12. {
  13. return __METHOD__;
  14. }
  15. }

./controller/Demo2.php代码

  1. namespace admin\controller;
  2. class Demo2
  3. {
  4. public static function index()
  5. {
  6. return __METHOD__;
  7. }
  8. }

./controller/Demo3.php代码

  1. namespace admin\controller;
  2. class Demo3
  3. {
  4. public static function index()
  5. {
  6. return __METHOD__;
  7. }
  8. }

运行demo3.php,结果:

trait

PHP默认是单继承,项目不大不必用接口实现多继承,父类子类继承方式会增加项目复杂度,可以用迷你版基类trait,trait可以看成一个通用组件插入到任何一个类中,实现类功能扩展。

  1. <?php
  2. namespace _0816;
  3. echo '<hr>'.'经典的类继承:'.'<br>';
  4. class A
  5. {
  6. public static function hello()
  7. {
  8. return __METHOD__;
  9. }
  10. }
  11. class B extends A
  12. {
  13. }
  14. // 调用方法
  15. // echo B::hello();
  16. // 完整类名
  17. // echo B::class;
  18. echo call_user_func([B::class,'hello']).'<br>';
  19. echo '<hr>'.'使用接口实现多继承:'.'<br>';
  20. interface iA
  21. {
  22. public static function hello();
  23. }
  24. interface iB
  25. {
  26. public static function world();
  27. }
  28. class W implements iA, iB
  29. {
  30. public static function hello()
  31. {
  32. return __METHOD__;
  33. }
  34. public static function world()
  35. {
  36. return __METHOD__;
  37. }
  38. }
  39. echo call_user_func([W::class,'hello']).'<br>';
  40. echo call_user_func([W::class,'world']).'<br>';
  41. echo '<hr>'.'trait实现多继承:'.'<br>';
  42. trait tA
  43. {
  44. public static function hello()
  45. {
  46. return __METHOD__;
  47. }
  48. }
  49. trait tB
  50. {
  51. public static function world()
  52. {
  53. return __METHOD__;
  54. }
  55. }
  56. class W1
  57. {
  58. use tA;
  59. use tB;
  60. }
  61. echo call_user_func([W1::class,'hello']).'<br>';
  62. echo call_user_func([W1::class,'world']).'<br>';
  63. echo '<hr>'.'trait优先级:'.'<br>';
  64. // 父类同名方法优先级 < trait类方法 < 自己类方法
  65. class P
  66. {
  67. public static function hello()
  68. {
  69. return __METHOD__;
  70. }
  71. }
  72. trait tC
  73. {
  74. public static function hello()
  75. {
  76. return __METHOD__;
  77. }
  78. }
  79. class S extends P
  80. {
  81. // public static function hello()
  82. // {
  83. // return __METHOD__;
  84. // }
  85. use tC;
  86. }
  87. echo call_user_func([S::class,'hello']).'<br>';
  88. echo '<hr>'.'trait命名冲突:'.'<br>';
  89. trait t1
  90. {
  91. public static function hello()
  92. {
  93. return __METHOD__;
  94. }
  95. }
  96. trait t2
  97. {
  98. public static function hello()
  99. {
  100. return __METHOD__;
  101. }
  102. }
  103. class W3
  104. {
  105. //t1和t2同名hello命名冲突
  106. // use t1;
  107. // use t2;
  108. use t1, t2
  109. {
  110. // 给t1引入别名,别名不影响任何方法,也不会重命名当前方法,所以阻碍不了冲突。
  111. t1::hello as tttt;
  112. // t2替代掉t1的方法,t1的hello方法被排除使用。
  113. t2::hello insteadof t1;
  114. }
  115. }
  116. echo call_user_func([W3::class,'hello']).'<br>';
  117. echo '<hr>'.'trait优化:'.'<br>';
  118. trait t3
  119. {
  120. public static function hello()
  121. {
  122. return __METHOD__;
  123. }
  124. }
  125. trait t4
  126. {
  127. public static function world()
  128. {
  129. return __METHOD__;
  130. }
  131. }
  132. trait t5
  133. {
  134. public static function say()
  135. {
  136. return __METHOD__;
  137. }
  138. }
  139. trait t6
  140. {
  141. public static function ok()
  142. {
  143. return __METHOD__;
  144. }
  145. }
  146. //优化在一个importAll中
  147. trait importAll
  148. {
  149. use T3;
  150. use T4;
  151. use T5;
  152. use T6;
  153. }
  154. class W4
  155. {
  156. use importAll;
  157. }
  158. echo call_user_func([W4::class,'hello']).'<br>';
  159. echo call_user_func([W4::class,'world']).'<br>';
  160. echo call_user_func([W4::class,'say']).'<br>';
  161. echo call_user_func([W4::class,'ok']).'<br>';

数据库的基本操作

数据库配置

./config/database.php

  1. <?php
  2. // 数据库链接参数
  3. return
  4. [
  5. // 数据库类型
  6. 'type' => 'mysql',
  7. // 主机IP
  8. 'host' => 'localhost',
  9. // 端口
  10. 'port' => '3306',
  11. // 数据库名,不提供数据库名execute()执行不成功,errorCode()打印3D000
  12. 'dbname' => 'phpedu',
  13. // 用户名
  14. 'username' => 'phpedu',
  15. // 密码
  16. 'password' => 'phpedu',
  17. // 字符集
  18. 'charset' => 'utf8',
  19. ];

数据库连接

./config/connect.php

  1. <?php
  2. namespace pdo_edu;
  3. use PDO;
  4. $dbConfig = require 'database.php';
  5. // printf('<pre>%s</pre>',print_r($dbConfig,true));
  6. extract($dbConfig);
  7. echo $type,$host,$username.'<br>','dbname='.$dbname.'<br>';
  8. $dsn = $type.':host='.$host.';dbname='.$dbname;
  9. $db = new PDO($dsn, $username, $password);
  10. // var_dump($db);

插入数据

./demo.php

  1. <?php
  2. // namespace pdo_edu;
  3. // use PDO;
  4. // /**
  5. // * 1.读:select
  6. // * 2.写:insert,update,delete
  7. // * CURD:增删改查
  8. // */
  9. // /**
  10. // * 1. 连接数据库。
  11. // * 2. CURD
  12. // * 3. 关闭连接。
  13. // */
  14. // // 1. 连接数据库
  15. // $dsn = 'mysql:host=localhost;dbname=phpedu;port:3306;charset=utf8';
  16. // $username = 'phpedu';
  17. // $password = 'phpedu';
  18. // $db = new PDO($dsn, $username, $password);
  19. // var_dump($db);
  20. // // 2. CURD
  21. // // 3. 关闭连接
  22. // // 销毁连接对象
  23. // // $db = null;
  24. // // unset($db);
  25. ////////////demo2////////////
  26. namespace pdo_edu;
  27. use PDO;
  28. // 1. 连接数据库
  29. require __DIR__ . '/config/connect.php';
  30. // var_dump($db);
  31. // 2. CURD
  32. // INSERT INTO 表名 (字段名1,字段名2,字段名3...) VALUE (值1,值2,值3...)
  33. // 简化:INSERT 表名 (字段名1,字段名2,字段名3...) VALUE (值1,值2,值3...)---少了INTO
  34. // ------如果是mysql且插入单条,还可以简化------
  35. // INSERT 表名 SET 字段名1=值1,字段名2=值2,字段名3=值3... 推荐尽可能使用
  36. // SELECT * FROM `staff` WHERE 1
  37. /**
  38. * 1. SQL关键字推荐全部大写。
  39. * 2. 表明,字段名必须用反引号,防止和关键字冲突。
  40. */
  41. $sql = "INSERT `staff` SET `id` = 1, `name` = 'admin', `gender`=1, `email`='admin@php.cn'";
  42. // 创建sql语句对象
  43. $stmt = $db->prepare($sql);
  44. var_dump($db);
  45. var_dump($stmt);
  46. if ($stmt->execute())
  47. {
  48. echo '插入成功!';
  49. }else{
  50. echo '插入不成功!';
  51. // 获取错误码
  52. echo $stmt->errorCode();
  53. // 进一步获取错误信息
  54. print_r ($stmt->errorInfo());
  55. }
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议