Correcting teacher:天蓬老师
Correction status:qualified
Teacher's comments:其实你也可换个组件进行演示的, 不必与老师的一样
通过本此学习,大致了解了自动加载器的原理,然而在实际编写的过程的路径的拼接还是出了一些问题,花了一些时间才搞定了,在这里也给看到帖子的朋友们说一声,这块要多注意一下哦!
至于Composer呢,就应用组件就比较简单了(这也侧面证明了composer的强大哦!),基本按照老师的流程,做了一遍就成功了,但是在CMD命令这里还是有些问题,一定要找对目录才行,安装错地方可就尴尬了。
其次,组件的更深入的应用,还有要根据自己的需求,多看看组件文档和联系测试才行哦!
组件/包商店: https://packagist.org
图片验证码组件地址: https://packagist.org/packages/gregwar/captcha
自定义的自动加载器输出
使用composer导入的图片验证组件输出
/*
* 传统文件加载使用`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('文件不存在,加载失败');
}
});
<?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;
<?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();
<?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()">';