Rumah  >  Artikel  >  pembangunan bahagian belakang  >  php 解决项目中多个自动加载冲突问题

php 解决项目中多个自动加载冲突问题

藏色散人
藏色散人ke hadapan
2020-01-10 17:36:502237semak imbas

在有的框架中的自动加载机制,在发现无法加载时, 直接报错, 而没有把控制权转交给下一个自动加载方法., 如我要引入阿里云日志服务接口sdk,该sdk中自带自动加载方法,如下:

<?php
/**
 * Copyright (C) Alibaba Cloud Computing
 * All rights reserved
 */
$version = &#39;0.6.0&#39;;
function Aliyun_Log_PHP_Client_Autoload($className) {
    $classPath = explode(&#39;_&#39;, $className);
    if ($classPath[0] == &#39;Aliyun&#39;) {
        if(count($classPath)>4)
            $classPath = array_slice($classPath, 0, 4);
        $filePath = dirname(__FILE__) . &#39;/&#39; . implode(&#39;/&#39;, $classPath) . &#39;.php&#39;;
        if (file_exists($filePath))
            require_once($filePath);
    }
}
spl_autoload_register(&#39;Aliyun_Log_PHP_Client_Autoload&#39;);

上面自动加载方法会与原有框架自己的加载方法冲突,解决方法如下:

<?php
function autoloadAdjust()
{
    // 取原有的加载方法
    $oldFunctions = spl_autoload_functions();
    // 逐个卸载
    if ($oldFunctions){
        foreach ($oldFunctions as $f) {
            spl_autoload_unregister($f);
        }
    }
    // 注册本框架的自动载入
    spl_autoload_register(
        # 就是aliyun sdk的加载方法
        function ($className) {
            $classPath = explode(&#39;_&#39;, $className);
            if ($classPath[0] == &#39;Aliyun&#39;) {
                    if(count($classPath)>4)
                    $classPath = array_slice($classPath, 0, 4);
                unset($classPath[0]);
                $filePath = dirname(__FILE__) . &#39;/&#39; . implode(&#39;/&#39;, $classPath) . &#39;.php&#39;;
                if (file_exists($filePath))
                    require_once($filePath);
            }
        }
    );
    // 如果引用本框架的其它框架已经定义了__autoload,要保持其使用
    if (function_exists(&#39;__autoload&#39;)) {
        spl_autoload_register(&#39;__autoload&#39;);
    }
    // 再将原来的自动加载函数放回去
    if ($oldFunctions){
        foreach ($oldFunctions as $f) {
            spl_autoload_register($f);
        }
    }
}
# 最后调用上面方法
autoloadAdjust();

注意在引入时,按照上面方法使用可能要改变代码中的文件路径

参考: 

近日,开发中,使用了ZF框架和一个自有框架进行配合.  

先启动了ZF, 之后,启动自有框架,  这时发现 自有框架的自动加载 不生效.

双方都使用了 spl_autoload_register 对自动加载方法进行了 注册.

分析后发现, ZF的加载方法,在发现无法加载时, 直接报错, 而没有把控制权转交给下一个自动加载方法.

如果先注册自有框架的加载方法,就不会出问题.因为自有框架的自动加载方法 找不到类时,会返回False,这将控制权转交给下一个加载方法

项目状态导致注册顺序只能是ZF在前面.  查了手册 写了下面的程序来调整注册顺序

Atas ialah kandungan terperinci php 解决项目中多个自动加载冲突问题. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:csdn.net. Jika ada pelanggaran, sila hubungi admin@php.cn Padam
Artikel sebelumnya:Jupyter Notebook下安装PHP内核Artikel seterusnya:php实现上传图片功能