Maison  >  Article  >  développement back-end  >  PHP résout plusieurs conflits de chargement automatique dans le projet

PHP résout plusieurs conflits de chargement automatique dans le projet

藏色散人
藏色散人avant
2020-01-10 17:36:502244parcourir

Dans certains frameworks, le mécanisme de chargement automatique signale directement une erreur lorsqu'il s'avère qu'il ne peut pas être chargé, sans transférer le contrôle à la méthode de chargement automatique suivante. Par exemple, je souhaite présenter le SDK d'interface de service Alibaba Cloud. Dans le SDK, il est livré avec une méthode de chargement automatique, comme suit :

<?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;);

La méthode de chargement automatique ci-dessus entrera en conflit avec la méthode de chargement du framework d'origine. La solution est la suivante :

<?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();

Remarque. que lors de son introduction, utilisez-le selon la méthode ci-dessus. Vous devrez peut-être changer le chemin du fichier dans le code

Référence :

Récemment, lors du développement, le framework ZF et un framework indépendant est utilisé pour coopérer.

Démarrer d'abord Après avoir installé ZF, j'ai démarré mon propre framework et j'ai constaté que le chargement automatique de mon propre framework ne prenait pas effet.

Les deux les parties ont utilisé spl_autoload_register pour enregistrer la méthode de chargement automatique.

Après analyse, elle a été trouvée, la méthode de chargement de ZF signale directement une erreur lorsqu'il s'avère qu'elle ne peut pas être chargée, sans transférer le contrôle à la méthode de chargement automatique suivante.

Si vous enregistrez d'abord la méthode de chargement de votre propre framework, il n'y aura aucun problème car lorsque la méthode de chargement automatique du framework indépendant ne trouve pas la classe, elle renvoie False, qui transfère le contrôle à. la méthode de chargement suivante

L'état du projet fait que l'ordre d'enregistrement est ZF en premier. J'ai vérifié le manuel et écrit Suivez la procédure ci-dessous pour ajuster l'ordre d'enregistrement

.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer