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

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

藏色散人
Libérer: 2023-04-08 08:04:02
avant
2291 Les gens l'ont consulté

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;);
Copier après la connexion

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();
Copier après la connexion

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!

Étiquettes associées:
php
source:csdn.net
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal