찾다
개발 도구composer작곡가 자동 로딩 메커니즘에 대한 자세한 설명

다음 composer 튜토리얼 칼럼에서는 작곡가 자동 로딩 메커니즘을 더 얕은 것부터 더 깊은 것까지 소개하겠습니다. 필요한 친구들에게 도움이 되길 바랍니다!

작곡가 자동 로딩 메커니즘에 대한 자세한 설명

머리말

작곡가의 자동 로딩 메커니즘에 남은 유일한 메모리는 "spl_auto???"와 "네임스페이스 기반 파일 경로 파생"뿐입니다. . . 아직 불완전합니다. .

온라인에서 자세한 설명을 모으고 싶었지만 내 의견에 맞는 "단순한 것부터 깊은 것까지" 기사를 찾을 수 없었습니다.
그래서 이 메모를 가지고 왔습니다.

다음 지식 포인트가 곧 제공될 예정입니다.
1. spl_autoload_register에 대해 알아보기
2. 작곡가 업데이트 이야기

Text

1. spl_autoload_register에 대해 알아보기


작곡가 자동 로딩 메커니즘에 대한 자세한 설명(게으른 분들은 빨간 부분만 보시면 됩니다)

잘 모르셨나요?

현지어로 번역해 보겠습니다.

새 클래스를 생성하는 경우 먼저 클래스 파일을 요구하거나 포함해야 합니다. 로드되지 않으면 오류가 보고됩니다. 이로 인해 문제가 발생합니다. 이 경우 파일의 헤더는 요구 사항과 포함으로 가득 차 있는데, 이는 분명히 프로그래머의 "게으른" 요구 사항과 일치하지 않습니다.

클래스 파일을 요구하거나 포함하지 않고 정상적으로 새 클래스를 생성하기 위해 자동 로딩 메커니즘이 등장했습니다. spl_autoload_register 함수는 이를 위해 특별히 설계되었습니다.

스크린샷에서 우리는 이 함수에 세 개의 매개변수가 있다는 것을 알 수 있습니다:

Parameters자세한 설명autoload_function여기에 채워진 것은 ***"함수"*의 이름입니다 **, 문자 문자열 또는 배열, 이 기능의 기능은 새로운 경우 오류 보고를 피하기 위해 가능한 한 새로운 파일이 필요한 파일을 요구하거나 포함하는 것입니다. 간단히 말해서 ***파일을 자동으로 로드하는 함수를 캡슐화해야 합니다***throw자동으로 로드되는 함수를 등록할 수 없을 때 예외를 발생시킬지prepend 여부 함수 대기열의 헤드에 함수를 추가하려면 true이면 헤드이고, 그렇지 않으면 테일입니다

来一波代码,印象深刻一些:

//文件 testClass.php ,即将new的类
class TestClass{
    public function __construct() {
        echo '你已经成功new了我了';
    }
}

//文件autoloadDemo.php文件
spl_autoload_register('autoLoad_function', true, true);
function autoLoad_function($class_name){
    echo "所有的require或者include文件工作都交给我吧!\r\n";
    $class_filename = "./{$class_name}.php";
    echo "我来加载{$class_filename}文件\r\n";
    require_once("./{$class_name}.php");
}
$obj_demo = new TestClass();

输出:

所有的require或者include文件工作都交给我吧!
我来加载testClass.php文件
你已经成功new了我了

明白了这个加载的原理,看下文就顺利多了。

2.composer update发生的故事

将自动加载之前,必须要先说一下composer update,这里头承载了自动加载的前提。

composer项目都包含一个composer.json的配置文件。
작곡가 자동 로딩 메커니즘에 대한 자세한 설명
这里头有一个关键的字段"autoload",包含psr-4和files两个字段。

psr-4:说明是基于psr-4规范的类库,都支持自动加载,只要在后面的对象中以**“命名空间:路径”**的方式写入自己的类库信息即可。
files:这就就更直接了,写入路径就自动加载。

按照以上配置每回composer update之后呢,都会更新一个很重要的文件:./vender/composer/autoload_psr4.php。
작곡가 자동 로딩 메커니즘에 대한 자세한 설명

这个文件只做了一件事情:把命名空间和文件路径对应起来,这样后续自动加载就有映射根据了。

3.追踪一下composer的自动加载

composer的故事从唯一的一个require说起:

require '../vendor/autoload.php'

这个脚本执行了一个函数:

ComposerAutoloaderInitd9b31141b114fcbee3cf55d0e97b7f87::getLoader()

继续跟getloader函数做了什么?

public static function getLoader() {
   if (null !== self::$loader) {
        return self::$loader;
    }

    spl_autoload_register(array('ComposerAutoloaderInitd9b31141b114fcbee3cf55d0e97b7f87', 'loadClassLoader'), true, true);
    self::$loader = $loader = new \Composer\Autoload\ClassLoader();
    spl_autoload_unregister(array('ComposerAutoloaderInitd9b31141b114fcbee3cf55d0e97b7f87', 'loadClassLoader'));

    $useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());
    if ($useStaticLoader) {
        require_once __DIR__ . '/autoload_static.php';

        call_user_func(\Composer\Autoload\ComposerStaticInitd9b31141b114fcbee3cf55d0e97b7f87::getInitializer($loader));
    } else {
        $map = require __DIR__ . '/autoload_namespaces.php';
        foreach ($map as $namespace => $path) {
            $loader->set($namespace, $path);
        }

        $map = require __DIR__ . '/autoload_psr4.php';
        foreach ($map as $namespace => $path) {
            $loader->setPsr4($namespace, $path);
        }

        $classMap = require __DIR__ . '/autoload_classmap.php';
        if ($classMap) {
            $loader->addClassMap($classMap);
        }
    }

    $loader->register(true);

    if ($useStaticLoader) {
        $includeFiles = Composer\Autoload\ComposerStaticInitd9b31141b114fcbee3cf55d0e97b7f87::$files;
    } else {
        $includeFiles = require __DIR__ . '/autoload_files.php';
    }
    foreach ($includeFiles as $fileIdentifier => $file) {
        composerRequired9b31141b114fcbee3cf55d0e97b7f87($fileIdentifier, $file);
    }

    return $loader;
}

这个函数主要做了两件事情:
1.将各种存有命名空间和文件映射关系的文件autoload_xxx.php加载了进来,并作了一些处理(比如:setPsr4将相关映射加载了进去,这个留意下,下文会有呼应。)。
2.注册了函数register

继续跟踪register做了什么:

public function register($prepend = false) {
   spl_autoload_register(array($this, 'loadClass'), true, $prepend);
}

原来调用了spl_autoload_register函数,当类没加载的时候使用loadClass来加载类。(这个前文讲的很清楚了,应该很熟了)

继续跟踪loadClass实现:

public function loadClass($class) {
	if ($file = $this->findFile($class)) {
		includeFile($file);
		return true;
	}
}

大概可以看出,是做了文件的include。
继续跟踪下是怎么查找文件的,看findFile函数:

public function findFile($class) {
    // class map lookup
    if (isset($this->classMap[$class])) {
        return $this->classMap[$class];
    }
    if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) {
        return false;
    }
    if (null !== $this->apcuPrefix) {
        $file = apcu_fetch($this->apcuPrefix.$class, $hit);
        if ($hit) {
            return $file;
        }
    }

    $file = $this->findFileWithExtension($class, '.php');

    // Search for Hack files if we are running on HHVM
    if (false === $file && defined('HHVM_VERSION')) {
        $file = $this->findFileWithExtension($class, '.hh');
    }

    if (null !== $this->apcuPrefix) {
        apcu_add($this->apcuPrefix.$class, $file);
    }

    if (false === $file) {
        // Remember that this class does not exist.
        $this->missingClasses[$class] = true;
    }

    return $file;
}

这个函数做了一件事:就是寻找类从上文的autoload_xxx.php初始化的数据中来寻找映射的文件路径。
其中这个函数findFileWithExtension,适用于寻找psr-4规范的文件的映射信息的。

继续跟踪findFileWithExtension:

private function findFileWithExtension($class, $ext) {
    // PSR-4 lookup
    $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext;

    $first = $class[0];
    if (isset($this->prefixLengthsPsr4[$first])) {
        $subPath = $class;
        while (false !== $lastPos = strrpos($subPath, '\\')) {
            $subPath = substr($subPath, 0, $lastPos);
            $search = $subPath.'\\';
            if (isset($this->prefixDirsPsr4[$search])) {
                $pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1);
                foreach ($this->prefixDirsPsr4[$search] as $dir) {
                    if (file_exists($file = $dir . $pathEnd)) {
                        return $file;
                    }
                }
            }
        }
    }

    // PSR-4 fallback dirs
    foreach ($this->fallbackDirsPsr4 as $dir) {
        if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) {
            return $file;
        }
    }

    // PSR-0 lookup
    if (false !== $pos = strrpos($class, '\\')) {
        // namespaced class name
        $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1)
            . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR);
    } else {
        // PEAR-like class name
        $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext;
    }

    if (isset($this->prefixesPsr0[$first])) {
        foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) {
            if (0 === strpos($class, $prefix)) {
                foreach ($dirs as $dir) {
                    if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
                        return $file;
                    }
                }
            }
        }
    }

    // PSR-0 fallback dirs
    foreach ($this->fallbackDirsPsr0 as $dir) {
        if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
            return $file;
        }
    }

    // PSR-0 include paths.
    if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) {
        return $file;
    }

    return false;
}

这个函数做了件事:将命名空间\类这样的类名,转换成目录名/类名.php这样的路径,再从前文setPsr4设置的映射信息中寻找映射信息,然后完成返回路径。

至此composer的自动加载机制结束。

위 내용은 작곡가 자동 로딩 메커니즘에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명
이 기사는 csdn에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제
작곡가 자격 증명 : 누군가를 작곡가로 만드는 이유는 무엇입니까?작곡가 자격 증명 : 누군가를 작곡가로 만드는 이유는 무엇입니까?Apr 14, 2025 am 12:13 AM

작곡가가되는 주요 요소는 다음과 같습니다. 1. 음악 이론 마스터 링, 2. 창의적이고 독창적, 3. 기술 능력, 4. 감정을 표현하고 이야기를 할 수있는 이야기, 5. 문화적, 역사적 배경 이해, 6. 이러한 요소가 함께 작곡가의 정체성과 능력을 구성합니다.

작곡가가되는 길 : 실용 가이드작곡가가되는 길 : 실용 가이드Apr 13, 2025 am 12:11 AM

작곡가가되는 단계에는 다음이 포함됩니다. 1. 메모, 리듬, 하모니 및 멜로디와 같은 음악의 기본 요소를 마스터합니다. 2. AbletonLive와 같은 적절한 기술 도구를 선택하십시오. 3. 영감 획득, 개념, 작문, 수정 및 개선을 포함하여 작곡 과정을 이해합니다. 4. 간단한 멜로디 생성으로 시작하고 조화와 같은 복잡한 기술을 점차적으로 시도하십시오. 5. 메모 선택 및 리듬 배열과 같은 디버깅 기술을 통해 일반적인 문제를 해결합니다. 6. 템플릿 사용, 버전 제어 및 협업과 같은 성능 최적화 및 모범 사례를 적용합니다.

작곡가 : 강력한 PHP 응용 프로그램 구축의 열쇠입니다작곡가 : 강력한 PHP 응용 프로그램 구축의 열쇠입니다Apr 12, 2025 am 12:05 AM

Composer는 종속성 관리를 단순화하고 개발 효율성 및 코드 품질을 향상시키기 때문에 강력한 PHP 응용 프로그램을 구축하는 핵심 도구입니다. 1) Composer는 Composer.json 파일을 통해 프로젝트 종속성을 정의하고 이러한 종속성을 자동으로 다운로드하고 관리합니다. 2) Composer.lock 파일을 생성하여 종속성 버전이 벤더/autoload.php를 통해 자동으로로드되도록합니다. 3) 사용의 예에는 로그 라이브러리 추가와 같은 기본 사용 및 버전 제약 조건 및 환경 변수 관리와 같은 고급 사용법이 포함됩니다. 4) 일반적인 오류 디버깅 기술에는 의존성 충돌 및 네트워크 문제 처리가 포함됩니다. 5) 성능 최적화 제안에는 Composer.Lock 파일 사용 및 자동로드 최적화가 포함됩니다.

작곡가 전문 지식 : 누군가를 숙련하게 만드는 것작곡가 전문 지식 : 누군가를 숙련하게 만드는 것Apr 11, 2025 pm 12:41 PM

작곡가를 사용할 때 능숙 해지려면 다음과 같은 기술을 마스터해야합니다. 1. Composer.json 및 Composer.lock Files, 2. Composer의 작동 방식 이해, 3. Master Composer의 명령 줄 도구, 4. 기본 및 고급 사용법 이해, 5. 일반적인 오류 및 디버깅 기술에 익숙하고, 사용법을 최적화하고 모범 사례를 최적화해야합니다.

작곡가는 무엇을하고 있습니까?작곡가는 무엇을하고 있습니까?Apr 08, 2025 am 12:19 AM

Composer는 프로젝트 종속성을 선언, 다운로드 및 관리하는 데 사용되는 PHP의 종속성 관리 도구입니다. 1) Composer.json 파일을 통한 종속성 선언, 2) ComposerInstall 명령을 사용하여 종속성을 설치하고 3) 종속성 트리를 구문 분석하고 Packagist에서 다운로드하십시오.

앱 작곡가 란 무엇입니까?앱 작곡가 란 무엇입니까?Apr 07, 2025 am 12:07 AM

AppComposer는 응용 프로그램을 구축하고 관리하는 도구입니다. 1) 사전 정의 된 구성 요소를 드래그하고 구성하여 응용 프로그램 개발을 단순화하고 효율성을 향상시킵니다. 2) 개발자는 구성 요소를 정의하고 인터페이스를 결합하고 비즈니스 로직을 정의하며 궁극적으로 응용 프로그램을 렌더링 할 수 있습니다. 3) 작업 관리 및 조건부 렌더링과 같은 기본 및 고급 사용을 지원하여 유연한 응용 프로그램을 구축하는 데 도움이됩니다.

작곡가는 무엇을 사용합니까?작곡가는 무엇을 사용합니까?Apr 06, 2025 am 12:02 AM

Composer는 PHP의 종속성 관리 도구입니다. 작곡가를 사용하는 핵심 단계는 다음과 같습니다. 1) Composer.json의 종속성 선언 "Stripe/Stripe-PHP": "^7.0"; 2) ComposerInstall을 실행하여 종속성을 다운로드하고 구성합니다. 3) Composer.lock 및 Autoload.php를 통해 버전 및 자동로드를 관리합니다. 작곡가는 종속성 관리를 단순화하고 프로젝트 효율성과 유지 관리를 향상시킵니다.

작곡가 AI 란 무엇입니까?작곡가 AI 란 무엇입니까?Apr 05, 2025 am 12:13 AM

Composerai는 개발 효율성과 품질을 향상시키기 위해 코드를 생성하고 최적화하기위한 인공 지능 기반 도구입니다. 그 기능에는 다음이 포함됩니다. 1. 코드 생성 : 요구 사항에 따라 표준을 충족하는 코드 스 니펫 생성. 2. 코드 최적화 : 기존 코드를 분석하여 최적화 제안을하십시오. 3. 자동 테스트 : 테스트 케이스를 생성하여 코드 품질을 보장합니다.

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
4 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25 : Myrise에서 모든 것을 잠금 해제하는 방법
1 몇 달 전By尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

안전한 시험 브라우저

안전한 시험 브라우저

안전한 시험 브라우저는 온라인 시험을 안전하게 치르기 위한 보안 브라우저 환경입니다. 이 소프트웨어는 모든 컴퓨터를 안전한 워크스테이션으로 바꿔줍니다. 이는 모든 유틸리티에 대한 액세스를 제어하고 학생들이 승인되지 않은 리소스를 사용하는 것을 방지합니다.

맨티스BT

맨티스BT

Mantis는 제품 결함 추적을 돕기 위해 설계된 배포하기 쉬운 웹 기반 결함 추적 도구입니다. PHP, MySQL 및 웹 서버가 필요합니다. 데모 및 호스팅 서비스를 확인해 보세요.

SecList

SecList

SecLists는 최고의 보안 테스터의 동반자입니다. 보안 평가 시 자주 사용되는 다양한 유형의 목록을 한 곳에 모아 놓은 것입니다. SecLists는 보안 테스터에게 필요할 수 있는 모든 목록을 편리하게 제공하여 보안 테스트를 더욱 효율적이고 생산적으로 만드는 데 도움이 됩니다. 목록 유형에는 사용자 이름, 비밀번호, URL, 퍼징 페이로드, 민감한 데이터 패턴, 웹 셸 등이 포함됩니다. 테스터는 이 저장소를 새로운 테스트 시스템으로 간단히 가져올 수 있으며 필요한 모든 유형의 목록에 액세스할 수 있습니다.

ZendStudio 13.5.1 맥

ZendStudio 13.5.1 맥

강력한 PHP 통합 개발 환경