Heim  >  Artikel  >  Backend-Entwicklung  >  PHP löst mehrere automatische Ladekonflikte im Projekt

PHP löst mehrere automatische Ladekonflikte im Projekt

藏色散人
藏色散人nach vorne
2020-01-10 17:36:502244Durchsuche

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

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

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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:csdn.net. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen