在调用某个命名空间中的类时,需要用include / require
先加载类所在的文件,但这种方法有时效率低,不能实现按需加载;可用自动加载的方式来解决这个问题。下面演示类(自定义的类和composer中的类)的自动加载.
一、自定义自动加载器, 遵循psr-4标准
1. 自动加载器
// 文件名load.php
/**
*导入命名空间`src\home`中的User类,
*导入文件`src\home\User.php` (windows系统)或者`src/home/User.php` (mac系统)
*导入时通过`use App\edu\home\User;`调用
*/
namespace load;
spl_autoload_register(function ($class)
{
//导入的路径和实际路径进行映射
$prefix = 'App\edu';
$file = __DIR__ . '\\src\\' . substr($class, strlen($prefix)) . '.php';
$file = str_replace("\\", DIRECTORY_SEPARATOR, $file);
file_exists($file) ? require $file : '文件不存在,加载失败.';
});
2. 要加载的文件
// 文件名 src\home\User.php;
namespace src\home;
class User
{
public static function test(): string
{
return __METHOD__;
}
}
die(User::test());
3.调用
// 文件名 main.php
namespace main;
use App\edu\home\User;
require 'load.php';
//触发自动加载器
User::abc;
结果
//运行main.php文件
src\home\User::test
二、composer的安装和引入项目的方式
以composer引入验证码的项目gregwar/captcha为例
1. composer的安装
//windows安装步骤
1. 从 `phpcomposer.com`中下载安装包'Composer-Setup.exe',根据提示安装;
2. 如果安装包安装失败, 则从`phpcomposer.com`中下载 `composer.phar`文件 或 从阿里云下载 `mirrors.aliyun.com/composer/composer.phar`;
3. 将`composer.phar`文件和`php.exe`文件放在同一目录;
4. 新建`txt`文件,里面复制如下同容,另存为`composer.bat`文件:
@php "%~dp0composer.phar" %
5. 双击打开` composer.bat `文件
6. 打开终端,输入:
composer (如果失败,则定位到php.exe所在文件夹下,再输入composer)
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/
//mac安装步骤
打开终端,输入
curl -sS https://getcomposer.org/installer | php (等待下载)
sudo rm -f (此处输入密码)
sudo mv composer.phar /usr/local/bin/composer
composer --version
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/
2. gregwar/captcha的安装
1. 在搜索平台<https://packagist.org/>输入: chaptcha ,找到 'gregwar/captcha',打开链接
2. 复制指令 composer require gregwar/captcha
3. 打开终端,进入要操作的目录,粘贴指令,例如:
cd "C:\phpstudy_pro\phpstudy_pro\WWW\php\0213"
composer require gregwar/captcha
3. 引入项目
调用
//文件名captcha.php
namespace captcha;
use Grewar\Captcha\CaptchaBuilder;
//自动加载文件
//vendor\gregwar\captcha\src\Grewar\Captcha\CaptchaBuilder.php
require __DIR__ . 'vender\autoload.php';
//实例化验证码类`
$builder = new CaptchaBuilder;
//生成验证码
$builder->build();
//生成内联验证码,放在内联标签:base64
echo '<img src="' . $builder->inline() . '" onclick="location.reload()">';
结果
结语
composer项目自带加载器,直接调用就可以。自定义的自动加载器,语法如下:
spl_autoload_register ([ callable $autoload_function [, bool $throw = true [, bool $prepend = false ]]] ) : bool
作用:注册给定的函数作为 __autoload 的实现
参数:
@ $autoload_function 欲注册的自动装载函数。如果没有提供任何参数,则自动注册 autoload 的默认实现函数spl_autoload()。
@ throw 此参数设置了 autoload_function 无法成功注册时, spl_autoload_register()是否抛出异常。
@ prepend 如果是 true,spl_autoload_register() 会添加函数到队列之首,而不是队列尾部。
返回值:成功时返回 TRUE, 或者在失败时返回 FALSE。