ASCII码 ASCII码

composer常用命令以及使用验证码插件的演示,以及composer自动加载和接口与抽象类。

发布于:2022-02-19 18:06:24  栏目:技术文档

composer常用指令" class="reference-link">composer常用指令

composer

1. composer 是什么

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

2. 组件放在了哪里

  • github.com, gitee.com
  • 查询平台: https://packagist.org

3. 从哪下载

  • 官网下载:https://getcomposer.org/
  • 中文网: https://www.phpcomposer.com/

4. 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/

5. 常用指令

  • composer init
  • 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/ 配置中国镜像

6. composer自动加载 autoload

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

composer使用验证码插件

当前页面中使用到的php函数有

函数 参数 使用规范
strcasecmp() 参数为2个值,例如strcasecmp(test1,test2) 结果=0或>0或< 0 // 0 - 如果两个字符串相等, < 0 - 如果 string1 小于 string2 , > 0 - 如果 string1 大于 string2
strcmp() 跟上一个类似 跟上一个类似,只不过区分大小写比较
  1. <?php
  2. require __DIR__ . DIRECTORY_SEPARATOR . 'vendor' . DIRECTORY_SEPARATOR . 'autoload.php';
  3. //echo __DIR__ . DIRECTORY_SEPARATOR . 'vendor' . DIRECTORY_SEPARATOR . 'autoload.php';
  4. //die;
  5. use Gregwar\Captcha\CaptchaBuilder;
  6. $builder = new CaptchaBuilder;
  7. $builder->build();
  8. // $builder->save('out.jpg');
  9. // header('Content-type: image/jpeg');
  10. // $builder->output();//以Content-type: image/jpeg图片二进制模式展示在浏览器
  11. ?>
  12. <img src="<?php echo $builder->inline(); ?>" />
  13. <!-- 上面是以html页面的 图片模式展现在页面中 -->
  14. <?php
  15. $_SESSION['phrase'] = $builder->getPhrase(); //这里是将$builder->getPhrase() 也就是验证码的数字,赋值给$_SESSION['phrase']
  16. //那么已经拿到了图片的文字部分
  17. echo $_SESSION['phrase'];
  18. $userInput = $_SESSION['phrase'];
  19. $_POST['captcha'] = $userInput;
  20. // strcasecmp() 有两个值,是比较两个值的字符串 并且不区分大小写 如果相等则返回0 如果第一个小于第二个,则返回 <0
  21. // 0 - 如果两个字符串相等
  22. // <0 - 如果 string1 小于 string2
  23. // >0 - 如果 string1 大于 string2
  24. // strcmp() 函数 是区分大小写
  25. if (strcasecmp($_POST['captcha'], $_SESSION['phrase']) === 0) {
  26. echo '<br>验证通过<br>';
  27. } else {
  28. echo '验证失败';
  29. };
  30. // testPhrase是验证码插件里面封装的类属性 判断和用户输入的是否一直
  31. if ($builder->testPhrase($userInput)) {
  32. echo '你太牛了 验证通过 <br>';
  33. } else {
  34. echo '验证失败';
  35. }

composer自动加载机制

composer的自动加载机制是通过psr-4来映射加载的是命名空间映射的目录,看下composer配置文件,例如下图:前面是命名空间名 后面是映射的目录,在映射的目录中当命名空间都为Gebi/Laolu时,并且都在src目录中时,将自动加载,如果你有新的目录和命名空间的自动加载映射时,只需要在下方继续按照他的格式写一遍即可,写完记得使用composer dump-autoload更新一下配置文件。在require哪一行,是加载的插件,当然也可以进行加载多个插件,在里面写入新的插件名称和版本后,直接在命令行执行命令composer update即可,目前我在src下面增加了2个命名空间的类,贴一下代码

  1. <?php
  2. namespace Gebi\Laolu;
  3. class Account
  4. {
  5. //写入一个静态的方法
  6. public static function index()
  7. {
  8. // 静态方法返回一个值
  9. return __METHOD__;
  10. }
  11. }
  1. <?php
  2. namespace Gebi\Laolu;
  3. class Adou
  4. {
  5. static function index()
  6. {
  7. return '<br>测试composer自动加载机制';
  8. }
  9. }
  10. // 修改composer配置文件时,例如增加了一个命名空间的映射路径时,需要更新一下composer文件,命令是composer dump-autoload

下面是index.php 类的入口文件因为写的是静态类方法,所以直接加载,当然,你肯定要先引入一下composer的自动加载文件

  1. <?php
  2. require __DIR__ . DIRECTORY_SEPARATOR . 'vendor' . DIRECTORY_SEPARATOR . 'autoload.php';
  3. // echo __DIR__ . DIRECTORY_SEPARATOR . 'vendor' . DIRECTORY_SEPARATOR . 'autoload.php';
  4. use Gebi\Laolu\Account;//use引入命名空间
  5. use Gebi\Laolu\Adou;
  6. echo Account::index();//静态类方法的调佣
  7. echo Adou::index();

访问index.php截图:

接口与抽象类

接口的规范以及工作类的使用,怎么使用普通类来调用工作类并输出理解部分:接口与类其实就是接口定义一个规范,通过这个规范给工作类以及抽象类来使用,然后普通类来调用工作类并输出渲染到页面接口使用代码interface继承接口使用implements来继承 就叫做继承吧 没别的词了抽象类不支持实例化,可以使用普通类或者工作类去访问这个抽象类或者继承这个抽象类然后实例化访问,在接口中声明的常量,可以直接在接口中访问,使用静态类的方法来访问即可,当然也可以用继承的工作类和抽象类来访问,代码部分:

  1. <?php
  2. /**
  3. * 接口是定义,类(抽象类)是实现
  4. * interface 接口名称 目的是建立通用的标准 才能被认为实现了接口
  5. *
  6. *
  7. *
  8. */
  9. //为计算机(主程序)扩展功能 计算机官方给出一种标准
  10. // 这里interface usb 就是一个接口,接口只定义了接口的规范,类是使用里面的规范完成特定的内容
  11. interface USB
  12. {
  13. //接口中只能定义常量和接口方法
  14. // 抽象方法
  15. function run(); //定义的一个方法 但是并没有方法体
  16. // function cal(); //当存在两个方法时,下面的工作类在工作类中只使用了一个方法来实现类中的功能时,需要将工作类更改为抽象类
  17. }
  18. //实现接口 使用implements来实现 类似继承
  19. // 为计算机提供 USB键盘功能
  20. abstract class Ukey implements USB
  21. {
  22. function run()
  23. {
  24. // 接口中定义的方法有两个时,在类中使用的只有一个时,需要将类更改为抽象类,并不能定义为工作类
  25. return "运行usb键盘设备";
  26. }
  27. }
  28. class Umemo implements USB
  29. {
  30. // 工作类按照自己的需求去实现接口中定义的抽象方法 多态方法
  31. function run()
  32. {
  33. return "运行USB储存盘";
  34. }
  35. }
  36. class Umouse implements USB
  37. {
  38. function run()
  39. {
  40. return '运行usb鼠标';
  41. }
  42. }
  43. class Computer
  44. {
  45. function useUsb($usb)
  46. {
  47. return $usb->run();
  48. }
  49. }
  50. // 将这个类 new实例化
  51. $c = new Computer;
  52. // 实例化之后 传入Umouse的实例化结果 然后访问实例化的这个run()方法
  53. echo $c->useUsb(new Umouse());
  54. //接口中定义的都是公开方法,类属性不能定义在接口中,类常量可以
  55. //一个工作类必须将接口中的所有方法按照自己的需求去实现,否则该类需定义成抽象类
  56. //抽象类中可以有抽象方法和普通方法 ,不能被实例化
  57. interface iDemo
  58. {
  59. const APP_NAME = 'hidemi小卖铺';
  60. public static function getInfo(...$info);
  61. public static function cal($a, $b);
  62. }
  63. //抽象类
  64. abstract class aDemo implements iDemo
  65. {
  66. static function getInfo(...$info)
  67. {
  68. //print_r 支持两个值 如果只填写变量,将打印输出,但是如果第二个值填写true将只打印不输出
  69. return print_r($info, true);
  70. }
  71. }
  72. //工作类
  73. class work extends aDemo
  74. {
  75. static function cal($a, $b)
  76. {
  77. return pow($a, $b); //求a的b次方
  78. }
  79. }
  80. // $a = new aDemo;抽象类不支持实例化
  81. echo work::getInfo("飞机", "600万", "好几吨", "我的草原我的马,我想杂耍就杂耍");
  82. $b = work::cal(50, 60);
  83. echo "我赚了 $b 元";
  84. //常量最好的是以接口的方式去访问
  85. echo "<br>";
  86. echo iDemo::APP_NAME;
  87. echo "<br>";
  88. echo aDemo::APP_NAME;
  89. echo aDemo::getInfo("飞机", "600万", "好几吨", "我的草原我的马,我想杂耍就杂耍");
  90. /**
  91. * php中,类的继承只能是单继承,即类C不能同时继承类A和类B,那么对于对特定类的功能进行拓展,可以use trait,还可以使用接口来实现类似于多方继承的好处,。
  92. * 先继承后实现
  93. * 工作类 extends 普通类(抽象类)implements 接口1,接口2....接口n
  94. */
  95. /**
  96. * oop 三大特性 封装 多态 继承
  97. * 多态性是指同一操作作用于不同类的实例,将产生不同的效果,即不同类的对象收到相同的消息时,得到不同的结果。在PHP中实现多态的方式有2种:通过继承实现多态和通过接口实现多态。多态指的是方法的重写。
  98. */
  99. /**
  100. * 什么时候使用抽象类,接口,trait?
  101. * 1. 如果你想使用模型,为多个紧密想关的对象提供规范,就使用抽象类;如果你想创建一项功能,随后在多个不想管的对象中实现,就使用接口。
  102. * 2. 如果你的对象必须从多个源头继承行为,就使用接口;php中的类可以实现多个接口,但只能继承一个类(抽象类)。
  103. * 3.如果你知道所有类将共享一个方法实现时,就使用抽象类,并在抽象类中实现这个方法。你不能在接口中实现方法。
  104. * 4. 如果所有类都共享一段相同的代码,就使用trait。
  105. *
  106. */
相关推荐
阅读 +