博客列表 >写一个类的自动加载器 2. 预习PDO基本知识,与常用的SQL语句

写一个类的自动加载器 2. 预习PDO基本知识,与常用的SQL语句

P粉314265155
P粉314265155原创
2022年08月22日 08:23:00304浏览

继承

  1. <?php
  2. // php默认是单继承
  3. // 项目不大, 不想用接口实现多继承
  4. // 又不想用父类,子类这样的继承方式来增加项目复杂度
  5. // 可以试这个"迷你"版的基类, trait
  6. // trait 可以看成是一个通用组件库,
  7. // trait 插入到任何一个类中, 来扩展这个类的功能
  8. // insteadOf 用在 trait 中解决 命名冲突
  9. // trait 一个特殊的类
  10. namespace _0816;
  11. // 1、经典单继承
  12. class A {
  13. public static function hello(){
  14. return __METHOD__.'我是A类方法'.'<hr>';
  15. }
  16. }
  17. class B extends A {
  18. }
  19. echo B::hello();
  20. // B的类名
  21. echo B::class;
  22. echo '<hr>';
  23. echo call_user_func([B::class,'hello']);
  24. echo '<hr>';
  25. // 2、接口简介实现了多继承
  26. interface iA {
  27. public static function hello ();
  28. }
  29. interface iB {
  30. public static function world();
  31. }
  32. class W implements iA, iB{
  33. public static function hello()
  34. {
  35. return __METHOD__.'我是w里面的A的方法';
  36. }
  37. public static function world(){
  38. return __METHOD__.'我是w里面的B的方法';
  39. }
  40. }
  41. echo call_user_func([W::class,'hello' ]).'<hr>';
  42. echo call_user_func([W::class,'world' ]).'<hr>';
  43. // 3、trait
  44. trait tA{
  45. public static function sex(){
  46. return __METHOD__.'我是TA的sex方法';
  47. }
  48. }
  49. trait tB{
  50. public static function email(){
  51. return __METHOD__.'我是TB的sex方法';
  52. }
  53. }
  54. class tC {
  55. use tA;
  56. use tB;
  57. }
  58. echo call_user_func([tC::class,'sex' ]).'<hr>';
  59. echo call_user_func([tC::class,'email' ]).'<hr>';
  60. echo'<hr>';
  61. // trait 的优先级
  62. // 父类parent < trait <子类
  63. class tG {
  64. public static function hello(){
  65. return __METHOD__.'我是 tD的hello方法';
  66. }
  67. }
  68. trait tJ{
  69. public static function hello(){
  70. return __METHOD__.'我是TJ的hello方法';
  71. }
  72. }
  73. class tH extends tG {
  74. use tJ;
  75. public static function hello(){
  76. return __METHOD__.'我是 TH 的hello方法';
  77. }
  78. use tJ;
  79. }
  80. echo call_user_func([tH::class,'hello' ]).'<hr>';
  81. echo '<hr>';
  82. // // 5. trait 命名冲突
  83. trait t2 {
  84. public static function hello(){
  85. return __METHOD__.'我是t2的hello方法';
  86. }
  87. }
  88. trait t1 {
  89. public static function hello(){
  90. return __METHOD__.'我是t1的hello方法';
  91. }
  92. }
  93. trait W3 {
  94. use t2,t1 {
  95. t2::hello as t3;
  96. t1::hello insteadOf t2;
  97. }
  98. }
  99. echo call_user_func([W3::class,'hello' ]).'<hr>';
  100. echo '<hr>';
  101. // 6. trait 优化
  102. trait t3 {
  103. public static function hello(){
  104. return __METHOD__.'我是t3的hello方法';
  105. }
  106. }
  107. trait t4 {
  108. public static function world(){
  109. return __METHOD__.'我是t4的world方法';
  110. }
  111. }
  112. trait t5{
  113. public static function sex(){
  114. return __METHOD__.'我是t5的 sex方法';
  115. }
  116. }
  117. trait t6 {
  118. public static function age(){
  119. return __METHOD__.'我是t6的age方法';
  120. }
  121. }
  122. // 简化
  123. trait importALL {
  124. use t3;
  125. use t4;
  126. use t5,t6;
  127. }
  128. trait W4 {
  129. // use t3;
  130. // use t4;
  131. // use t5,t6;
  132. use importALL ;
  133. }
  134. echo call_user_func([W4::class,'hello' ]).'<hr>';
  135. echo call_user_func([W4::class,'world' ]).'<hr>';
  136. echo call_user_func([W4::class,'sex' ]).'<hr>';
  137. echo call_user_func([W4::class,'age' ]).'<hr>';
  138. echo '<hr>';

自定加载器

  1. <?php
  2. // 自动加载器
  3. // namespace thinkPHP ;
  4. namespace admin;
  5. // 查看命名空间名称
  6. echo __NAMESPACE__;
  7. echo '<hr>';
  8. // 当前空间的引用
  9. // echo namespace;
  10. class A {
  11. }
  12. // new A();或者 namesapce ==tinkPHP 当前空间的引用
  13. new namespace\A();
  14. // 访问三个控制器 Demo1 Demo2 Demo 3 的 hello 方法
  15. // 加载 Demo1
  16. // require __DIR__.'/admin/controller/Demo1.php';
  17. // // 加载 Demo2
  18. // require __DIR__.'/admin/controller/Demo2.php';
  19. // // 加载 Demo3
  20. // require __DIR__.'/admin/controller/Demo3.php';
  21. //----------------------------------------------------------
  22. // 自动加载器
  23. // 为了实现自动加载,应该遵循一些约定
  24. // 1. 一个文件只有一个类
  25. // 2. 这个类名和文件名必须一致
  26. // 3. 这个类的命名空间,必须映射到类文件所在的路径
  27. // 函数注册
  28. // spl_autoload_register(function ($class) {
  29. // echo $class.'<hr>';
  30. // $path = str_replace('\\',DIRECTORY_SEPARATOR,$class);
  31. // // 增加判断 文件是否存在
  32. // $file =$path .'.php';
  33. // if(file_exists( $file)){
  34. // require $path . '.php';
  35. // }else{
  36. // echo '文件不存在';
  37. // }
  38. // });
  39. // 输出 Demo1 方法 完全限定名称:绝对路径
  40. // echo \admin\controller\Demo1::hello().'<hr>';
  41. // 限定名称:相对路径 命名空间名称变为admin 前面的admin可以省略
  42. echo controller\Demo1::hello().'<hr>';
  43. // 进一步简化
  44. // 别名 :从完全限定名称写起
  45. // use
  46. // 非限定名称 默认从全局开始 admin前面的 \ 可以省略 全局空间标识符可以不写
  47. use \admin\controller\Demo2;
  48. echo Demo2::hello();
  49. // 输出 Demo2 方法
  50. // echo \admin\controller\Demo2::hello().'<hr>';
  51. // 输出 Demo3 方法
  52. // echo \admin\controller\Demo3::hello().'<hr>';

自动加载器2

  1. <?php
  2. namespace admin;
  3. require 'autoloader.php';
  4. use admin\controller\Demo1;
  5. echo Demo1::hello();

自动加载器的 引用

引用1

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

引用2

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

引用3

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

数据库 操作 见下一作业

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