php自动加载机制

5 篇文章 0 订阅

为什么要实现自动加载机制?

在大项目中,就不用每次include/require文件,省心又高效,只要你不嫌累的话,就可以不使用。

PHP标准库(Standard PHP Library,缩写:SPL),是PHP5.0之后新添加的重要库

怎么实现?

无非就是动态的require文件
无非就是利用php的spl_autoload_register()函数
因为php会把 空间名+类名 当做 参数 传递给spl_autoload_register(),只要约束下空间名就是目录地址,就可以动态的require文件

一、spl_autoload_register

语法

  1. spl_autoload_register(callback $function_name)
  2. __autoload(callback $function_name)

为什么不使用__autoload?而使用spl_autoload_register?

  1. __autoload因为是一个全局函数,所以只能定义一次,使用多个会冲突报错;而 sql_autoload_register可定义多个,它有效地创建一个队列的自动装载函数并按顺序依次定义。
  2. spl_autoload_register是触发异常,可被catch捕捉到,而__autoload不可以。
  3. SPL函数很丰富,有更多的操作空间:如spl_autoload_unregister()注销已经注。册的函数、spl_autoload_functions()返回所有已经注册的函数等

二、代码实现

<?php
/*
test.php
*/
error_reporting(0); // 抑制脚本错误
define('DS',DIRECTORY_SEPARATOR); // 定义目录分隔符常量

use test1\Test1;
use test2\Test2;

Class Test
{
    public function __construct()
    {
        echo __CLASS__.PHP_EOL;
        new Test1();
        new Test2();
        new Test3();
    }
}

// 自定义加载器
// $name = __namespace__/__class__
function autoload($name){
    $file = $name.'.php';
    if (is_file($file)){
        require_once $file;
    }
    else{
        print_r('已经注册的加载器: ');
        print_r(spl_autoload_functions());
        print_r($name.'不存在');die;
    }
}

try{
    spl_autoload_register('autoload', true);
//    spl_autoload_register('autoload1', true); //触发异常
    spl_autoload_register('autoload1', false); //无触发异常
}catch (Exception $e){
    print_r($e->getMessage());
}

new Test();
/* result:
        Test
        test1\Test1
        test2\Test2
        已经注册的加载器: Array
        (
        [0] => autoload
        )
        Test3不存在
 */
// 由此可以看出,目录名==空间名(采用小写),文件名==类名(采用大驼峰法),类方法名(采用小驼峰法),函数名(采用下划线)
<?php
/*
test1/Test1.php
*/
namespace test1;

class Test1
{
    public function __construct()
    {
        echo __CLASS__.PHP_EOL;
    }
}
<?php
/*
test2/Test2.php
*/
namespace test2;

class Test2
{
    public function __construct()
    {
        echo __CLASS__.PHP_EOL;
    }
}

可以推出自动加载的习惯

  1. 目录名==空间名(采用小写)。
  2. 文件名==类名(采用大驼峰法)。
  3. 类方法名(采用小驼峰法)。
  4. 函数名(采用下划线)。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值