PHP löst mehrere automatische Ladekonflikte im Projekt

藏色散人
Freigeben: 2023-04-08 08:04:02
nach vorne
2261 Leute haben es durchsucht

In einigen Frameworks meldet der automatische Lademechanismus direkt einen Fehler, wenn festgestellt wird, dass er nicht geladen werden kann, ohne die Kontrolle an die nächste automatische Lademethode zu übergeben. Ich möchte beispielsweise das Alibaba Cloud Log Service Interface SDK vorstellen. Im SDK gibt es eine automatische Lademethode wie folgt:

<?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;);
Nach dem Login kopieren

Die obige automatische Lademethode steht in Konflikt mit der ursprünglichen Lademethode des Frameworks. Die Lösung lautet wie folgt:

<?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();
Nach dem Login kopieren

Hinweis Wenn Sie es einführen, verwenden Sie es gemäß der oben genannten Methode. Möglicherweise müssen Sie den Dateipfad im Code ändern Zur Zusammenarbeit wird ein eigenes Framework verwendet.

Zuerst starten Nach der Installation von ZF habe ich mein eigenes Framework gestartet und festgestellt, dass das automatische Laden meines eigenen Frameworks nicht wirksam wurde.

Beide Parteien Verwendet spl_autoload_register, um die automatische Lademethode zu registrieren.

Nach der Analyse wurde festgestellt, dass die Lademethode von ZF direkt einen Fehler meldet, wenn festgestellt wird, dass sie nicht geladen werden kann, ohne die Kontrolle an die nächste automatische Lademethode zu übergeben.

Wenn Sie zuerst die Lademethode Ihres eigenen Frameworks registrieren, gibt es kein Problem, denn wenn die automatische Lademethode des eigenen Frameworks die Klasse nicht finden kann, gibt sie False zurück, wodurch die Kontrolle an den nächsten Ladevorgang übergeben wird Methode

Der Projektstatus führt dazu, dass die Registrierungsreihenfolge zuerst ZF ist. Ich habe das Handbuch überprüft und Folgendes geschrieben: Gehen Sie wie folgt vor, um die Registrierungsreihenfolge anzupassen

Das obige ist der detaillierte Inhalt vonPHP löst mehrere automatische Ladekonflikte im Projekt. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
php
Quelle:csdn.net
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage