博客列表 >composer、接口与抽象类学习小结

composer、接口与抽象类学习小结

cool442
cool442原创
2022年06月03日 18:28:02543浏览

1. composer

composer 是什么

  • php 包依赖管理工具
  • 包: 组件,一组相关的类,接口,trait 的结合体
  • 依赖: A -> B -> C -> D
  • composer 就是用 php 语言开发的

组件放在了哪里

从哪下载

windows 下载

下载地址:https://getcomposer.org/download/

  • 官网下载: https://getcomposer.org/composer.phar
  • 将 php.exe 所在路径添加到全局 path 变量中
  • 将下载的 composer.phar 复制到 php.exe 所在目录中
  • 创建 composer.bat:@php "%~dp0composer.phar" %*

  • php composer.phar -V

  • 简化成: composer -V
  • 将镜像改为国内阿里云:composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/

常用指令

  • composer init 创建composer.json配置文件
  • composer install: 安装 composer.json 中的依赖
  • composer update: 更新依赖 与lock文件保持一致
  • composer dump-autoload: 打印自动加载索引
  • composer self-update: 更新 composer 版本
  • composer require: 添加依赖到 composer.json 中
  • composer create-project: 安装项目
  • composer config -l -g 查看composer配置
  • composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ 配置中国镜像

composer自动加载 autoload

  • 文件级: “files”, 需要将加载的文件逐个导入
  • 目录级: “classmap”,类目录的映射
  • 空间级: “psr-4”: 命名空间映射到目录
  • 无论是哪一种,最后都要执行一下”composer dump”,更新 composer.json 中的 autoload 配置项

2. 有验证码的登录页面

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>登录</title>
  8. <style>
  9. div {
  10. width: 10em;
  11. margin: 15% auto;
  12. }
  13. p {
  14. margin: 0.5em 0;
  15. }
  16. input {
  17. width: 100%;
  18. height: 1.8em;
  19. }
  20. #captcha,
  21. img {
  22. width: 46%;
  23. height: 1.8em;
  24. vertical-align: middle;
  25. }
  26. input[type="button"]:hover {
  27. cursor: pointer;
  28. }
  29. span {
  30. display: block;
  31. height: 1.8em;
  32. line-height: 1.8em;
  33. text-align: center;
  34. color: red;
  35. }
  36. </style>
  37. </head>
  38. <?php
  39. session_start();
  40. // 调用验证码包的自动加载文件
  41. require dirname(__DIR__, 1) . DIRECTORY_SEPARATOR . 'vendor' . DIRECTORY_SEPARATOR . 'autoload.php';
  42. use Gregwar\Captcha\CaptchaBuilder;
  43. // 创建验证码对象
  44. $builder = new CaptchaBuilder;
  45. // 调用方法生成验证码
  46. $builder->build();
  47. ?>
  48. <body>
  49. <div>
  50. <p><input type="text" name="username" id="username" placeholder="输入用户名"></p>
  51. <p><input type="password" name="password" id="password" placeholder="输入密码"></p>
  52. <p>
  53. <input type="text" name="captcha" id="captcha" placeholder="输入验证码" onblur="check_captcha()">
  54. <img src="<?= $builder->inline() ?>" />
  55. </p>
  56. <p><span></span></p>
  57. <p><input type="button" value="登 录" onclick="login()"></p>
  58. </div>
  59. </body>
  60. <script>
  61. async function check_captcha() {
  62. // 获取输入的验证码
  63. let captcha = document.querySelector("#captcha").value;
  64. url = `Request_ContAroller.php?captcha=${captcha}`;
  65. const response = await fetch(url)
  66. response.json().then()
  67. }
  68. </script>
  69. </html>

3.接口与抽象类

  1. <?php
  2. use aDemo as GlobalADemo;
  3. /**
  4. * 接口是定义,类(抽象类)是实现
  5. * interface的目的是建立通用的标准,只有实现了这些标准,才能被认为实现了接口
  6. */
  7. // 为计算机(主程序)扩展功能,计算机官方结出一种公开标准
  8. // 定义USB接口
  9. interface USB
  10. {
  11. // 接口只能定义常量和抽象方法
  12. // 抽象方法,必须是公开的
  13. function run();
  14. }
  15. // 为计算机扩展usb键盘功能,实现usb接口
  16. class usbKey implements USB
  17. {
  18. // 接口中有几个抽象方法都必须在类中实现,否则为抽象类。
  19. function run()
  20. {
  21. return "运行USB键盘";
  22. }
  23. }
  24. class usbMemo implements USB
  25. {
  26. function run()
  27. {
  28. return "运行U盘";
  29. }
  30. }
  31. // 计算机主程序
  32. class computer
  33. {
  34. // 创建使用接口类方法
  35. function useUsb($driver)
  36. {
  37. // 运行接口通用方法
  38. return $driver->run();
  39. }
  40. }
  41. $com = new computer;
  42. echo $com->useUsb(new usbKey);
  43. echo $com->useUsb(new usbMemo);
  44. /**
  45. * 1. 接口中定义的均是公开的抽象方法,类属性不能定义在接口中,类常量可以。
  46. * 2.一个工作类必须将接口中的所有方法按照自己的需求去实现,否则该类要定义成抽象类。
  47. * 3. 抽象类中可以有抽象方法和普通方法,不能被实例化。
  48. */
  49. // 定义接口
  50. interface aDemo
  51. {
  52. const FILM_NAME = "海底总动员";
  53. public static function get_msg(...$msg);
  54. public static function play($a, $b);
  55. }
  56. // 抽象类:没有实现接口中所有的方法,因此为抽象类
  57. abstract class film implements aDemo
  58. {
  59. public static function get_msg(...$msg)
  60. {
  61. return print_r($msg, true);
  62. }
  63. }
  64. // 工作类
  65. class work extends film
  66. {
  67. public static function play($a, $b)
  68. {
  69. return '今日票房:' . $a * $b . '元';
  70. }
  71. }
  72. echo '<br>' . aDemo::FILM_NAME . '<br>';
  73. echo film::FILM_NAME . '<br>';
  74. echo work::FILM_NAME . '<br>';
  75. echo film::get_msg('尼莫', '小鱼', '大海') . '<br>';
  76. echo work::get_msg('尼莫', '小鱼', '大海') . '<br>';
  77. echo work::play(6000, 45);
  78. /**
  79. * php中,类的继承只能是单继承,即类C不能同时继承类A和类B,那么对于对特定类的功能进行拓展,可以use trait,还可以使用接口来实现类似于多方继承的好处,。
  80. * 先继承后实现
  81. * 工作类 extends 普通类(抽象类)implements 接口1,接口2....接口n
  82. */
  83. /**
  84. * oop 三大特性 封装 多态 继承
  85. * 多态性是指同一操作作用于不同类的实例,将产生不同的效果,即不同类的对象收到相同的消息时,得到不同的结果。在PHP中实现多态的方式有2种:通过继承实现多态和通过接口实现多态。多态指的是方法的重写。
  86. */
  87. /**
  88. * 什么时候使用抽象类,接口,trait?
  89. * 1. 如果你想使用模型,为多个紧密想关的对象提供规范,就使用抽象类;如果你想创建一项功能,随后在多个不想管的对象中实现,就使用接口。
  90. * 2. 如果你的对象必须从多个源头继承行为,就使用接口;php中的类可以实现多个接口,但只能继承一个类(抽象类)。
  91. * 3.如果你知道所有类将共享一个方法实现时,就使用抽象类,并在抽象类中实现这个方法。你不能在接口中实现方法。
  92. * 4. 如果所有类都共享一段相同的代码,就使用trait。
  93. *
  94. */
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议