1. composer
composer 是什么
- php 包依赖管理工具
- 包: 组件,一组相关的类,接口,trait 的结合体
- 依赖: A -> B -> C -> D
- composer 就是用 php 语言开发的
组件放在了哪里
- github.com(国外)
- gitee.com(国内)
- 查询平台: https://packagist.org
从哪下载
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. 有验证码的登录页面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>登录</title>
<style>
div {
width: 10em;
margin: 15% auto;
}
p {
margin: 0.5em 0;
}
input {
width: 100%;
height: 1.8em;
}
#captcha,
img {
width: 46%;
height: 1.8em;
vertical-align: middle;
}
input[type="button"]:hover {
cursor: pointer;
}
span {
display: block;
height: 1.8em;
line-height: 1.8em;
text-align: center;
color: red;
}
</style>
</head>
<?php
session_start();
// 调用验证码包的自动加载文件
require dirname(__DIR__, 1) . DIRECTORY_SEPARATOR . 'vendor' . DIRECTORY_SEPARATOR . 'autoload.php';
use Gregwar\Captcha\CaptchaBuilder;
// 创建验证码对象
$builder = new CaptchaBuilder;
// 调用方法生成验证码
$builder->build();
?>
<body>
<div>
<p><input type="text" name="username" id="username" placeholder="输入用户名"></p>
<p><input type="password" name="password" id="password" placeholder="输入密码"></p>
<p>
<input type="text" name="captcha" id="captcha" placeholder="输入验证码" onblur="check_captcha()">
<img src="<?= $builder->inline() ?>" />
</p>
<p><span></span></p>
<p><input type="button" value="登 录" onclick="login()"></p>
</div>
</body>
<script>
async function check_captcha() {
// 获取输入的验证码
let captcha = document.querySelector("#captcha").value;
url = `Request_ContAroller.php?captcha=${captcha}`;
const response = await fetch(url)
response.json().then()
}
</script>
</html>
3.接口与抽象类
<?php
use aDemo as GlobalADemo;
/**
* 接口是定义,类(抽象类)是实现
* interface的目的是建立通用的标准,只有实现了这些标准,才能被认为实现了接口
*/
// 为计算机(主程序)扩展功能,计算机官方结出一种公开标准
// 定义USB接口
interface USB
{
// 接口只能定义常量和抽象方法
// 抽象方法,必须是公开的
function run();
}
// 为计算机扩展usb键盘功能,实现usb接口
class usbKey implements USB
{
// 接口中有几个抽象方法都必须在类中实现,否则为抽象类。
function run()
{
return "运行USB键盘";
}
}
class usbMemo implements USB
{
function run()
{
return "运行U盘";
}
}
// 计算机主程序
class computer
{
// 创建使用接口类方法
function useUsb($driver)
{
// 运行接口通用方法
return $driver->run();
}
}
$com = new computer;
echo $com->useUsb(new usbKey);
echo $com->useUsb(new usbMemo);
/**
* 1. 接口中定义的均是公开的抽象方法,类属性不能定义在接口中,类常量可以。
* 2.一个工作类必须将接口中的所有方法按照自己的需求去实现,否则该类要定义成抽象类。
* 3. 抽象类中可以有抽象方法和普通方法,不能被实例化。
*/
// 定义接口
interface aDemo
{
const FILM_NAME = "海底总动员";
public static function get_msg(...$msg);
public static function play($a, $b);
}
// 抽象类:没有实现接口中所有的方法,因此为抽象类
abstract class film implements aDemo
{
public static function get_msg(...$msg)
{
return print_r($msg, true);
}
}
// 工作类
class work extends film
{
public static function play($a, $b)
{
return '今日票房:' . $a * $b . '元';
}
}
echo '<br>' . aDemo::FILM_NAME . '<br>';
echo film::FILM_NAME . '<br>';
echo work::FILM_NAME . '<br>';
echo film::get_msg('尼莫', '小鱼', '大海') . '<br>';
echo work::get_msg('尼莫', '小鱼', '大海') . '<br>';
echo work::play(6000, 45);
/**
* php中,类的继承只能是单继承,即类C不能同时继承类A和类B,那么对于对特定类的功能进行拓展,可以use trait,还可以使用接口来实现类似于多方继承的好处,。
* 先继承后实现
* 工作类 extends 普通类(抽象类)implements 接口1,接口2....接口n
*/
/**
* oop 三大特性 封装 多态 继承
* 多态性是指同一操作作用于不同类的实例,将产生不同的效果,即不同类的对象收到相同的消息时,得到不同的结果。在PHP中实现多态的方式有2种:通过继承实现多态和通过接口实现多态。多态指的是方法的重写。
*/
/**
* 什么时候使用抽象类,接口,trait?
* 1. 如果你想使用模型,为多个紧密想关的对象提供规范,就使用抽象类;如果你想创建一项功能,随后在多个不想管的对象中实现,就使用接口。
* 2. 如果你的对象必须从多个源头继承行为,就使用接口;php中的类可以实现多个接口,但只能继承一个类(抽象类)。
* 3.如果你知道所有类将共享一个方法实现时,就使用抽象类,并在抽象类中实现这个方法。你不能在接口中实现方法。
* 4. 如果所有类都共享一段相同的代码,就使用trait。
*
*/