>  기사  >  백엔드 개발  >  PHP는 프로젝트의 여러 자동 로딩 충돌을 해결합니다.

PHP는 프로젝트의 여러 자동 로딩 충돌을 해결합니다.

藏色散人
藏色散人앞으로
2020-01-10 17:36:502244검색

일부 프레임워크의 자동 로딩 메커니즘은 다음 자동 로딩 방식으로 제어권을 넘기지 않고 로딩할 수 없다는 사실이 발견되면 직접 오류를 보고합니다. 예를 들어 포함된 Alibaba Cloud Log Service Interface 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가 앞에 있을 것입니다. 매뉴얼을 확인하고 등록 순서를 조정하기 위해 다음 프로그램을 작성했습니다

위 내용은 PHP는 프로젝트의 여러 자동 로딩 충돌을 해결합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 csdn.net에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제