PHP的自动加载器、Composer导入图片验证组件
学习总结
通过本此学习,大致了解了自动加载器的原理,然而在实际编写的过程的路径的拼接还是出了一些问题,花了一些时间才搞定了,在这里也给看到帖子的朋友们说一声,这块要多注意一下哦!
至于Composer呢,就应用组件就比较简单了(这也侧面证明了composer的强大哦!),基本按照老师的流程,做了一遍就成功了,但是在CMD命令这里还是有些问题,一定要找对目录才行,安装错地方可就尴尬了。
其次,组件的更深入的应用,还有要根据自己的需求,多看看组件文档和联系测试才行哦!
组件/包商店: https://packagist.org
图片验证码组件地址: https://packagist.org/packages/gregwar/captcha
运行效果
自定义的自动加载器输出
使用composer导入的图片验证组件输出
目录结构
- AntsFramework :自动加载的类的文件目录;
- Controllers :调用类的脚本文件目录;
- vendor :composer自动生成的组件库;
- gregwar :图片验证码组件(composer自动安装);
- symfony :图片验证码依赖(composer自动安装);
项目代码
autoloader.php
/*
* 传统文件加载使用`include / require`, 加载效率低, 不能实现按需要加载;
* `__autoload()`, `spl_autoload_register()`注册加载器, 各框架各异并不统一
* */
/*
* PSR-4: 实现代码在运行时, 实时查找PHP类/接口/Trait文件, 并自动加载到当前的脚本中
* PSR-4: 要求需要自动加载的文件路径必须与该文件中的代码的命名空间一一对应
* */
/*
* 涉及的函数
* strncmp():字符串比较,二进制安全模式;
* substr($str,$start,$length):从$str的第$start位置,截取$length的字符串,作为子串返回;
* strlen($str):字符串长度;
* str_replace('原始子字符串','替换后的子字符串',$str父串):子字符串替换;
* */
namespace ants;
//注册一个自动加载器
spl_autoload_register(function ($className)
{
//设置项目包 前缀
$prefix='Apps\ants\\';
//设置具备项目包前缀的类名称文件,所在的根目录
$base_dir= __DIR__ . '/';
//去掉项目项目前缀,获取真实的类名称
$real_className=substr($className, strlen($prefix));
// 将命名空间分隔符,替换成目录分隔符
$path = str_replace('\\', DIRECTORY_SEPARATOR, $real_className);
// 加上基目录和php的后缀'.php'
$file = $base_dir . $path . '.php';
// 查看文件是否存在
if (file_exists($file)){
require $file;
}else{
//echo $file.'<br>';
die('文件不存在,加载失败');
}
});
BaseController.php (被调用的类)
<?php
/**
* Created by PhpStorm.
* User: Air15_2019
* Date: 2020/2/14
* Time: 18:03
*/
namespace Apps\ants;
class BaseController{
public static function showPage(){
return '这是 BaseController类下的showPage()方法 !';
}
}
//echo BaseController::class;
Index.php(调用自动加载器,实现类加载的脚本)
<?php
/**
* Created by PhpStorm.
* User: Air15_2019
* Date: 2020/2/14
* Time: 17:43
*/
namespace ants;
use Apps\ants\BaseController;
require '../AntsFramework/autoloader.php';
echo BaseController::showPage();
Captcha.php(代用composer组件,显示验证码)
<?php
/**
* Created by PhpStorm.
* User: Air15_2019
* Date: 2020/2/14
* Time: 21:33
*/
namespace ants;
//导入验证码组件
use Gregwar\Captcha\CaptchaBuilder;
//引入composer创建的,符合PSR-4规范的自动加载器
require __DIR__.'/../vendor/autoload.php';
/*
* 组件调用
* */
//实例化类的对象
$builder=new CaptchaBuilder();
//生成验证码
$builder->build();
echo'这是通过Composer自动加载器导入的--- 验证码组件---<br><br>';
echo '<img src="' . $builder->inline() .'" onclick="location.reload()">';