찾다
개발 도구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으로 문의하시기 바랍니다. 삭제
작곡가 : PHP 패키지 관리에 대한 포괄적 인 안내서작곡가 : PHP 패키지 관리에 대한 포괄적 인 안내서May 11, 2025 am 12:17 AM

Composer는 Composer.json 파일을 통해 프로젝트 종속성을 관리하는 PHP 의존성 관리 도구입니다. 1. Composerinit을 사용하여 프로젝트를 초기화하십시오. 2. ComposerRequireGuzzleHTTP/Guzzle과 같은 종속성을 추가하십시오. 3. 고급 사용에는 개인 리포지토리 구성 및 스크립트 후크 사용이 포함됩니다. 4. 종속성 충돌과 같은 일반적인 오류는 ComposerWhy-not 명령을 통해 디버깅 될 수 있습니다. 5. ComposerInstall-prefer-dist를 사용하고 주기적으로 종속성을 업데이트하는 데 성능 최적화가 권장됩니다.

작곡가 활동 : 종속성 해상도 자동화작곡가 활동 : 종속성 해상도 자동화May 10, 2025 am 12:22 AM

작곡가는 자동화 된 의존성 구문 분석을 통해 PHP 프로젝트의 종속성 관리를 단순화합니다. 1) 종속성 요구 사항을 해결하려면 Composer.json을 읽습니다. 2) 버전 충돌을 처리하기 위해 종속성 트리를 구축하십시오. 3) Packagist에서 공급 업체 디렉토리로 종속성을 다운로드하여 설치합니다. 4) Composer.lock을 생성하여 의존성 일관성을 보장하여 개발 효율성을 향상시킵니다.

AI 및 작곡가 : 코드 품질 및 개발 향상AI 및 작곡가 : 코드 품질 및 개발 향상May 09, 2025 am 12:20 AM

작곡가에서 AI는 의존성 추천, 의존성 충돌 해상도 및 코드 품질 개선을 통해 개발 효율성 및 코드 품질을 주로 향상시킵니다. 1. AI는 프로젝트 요구에 따라 적절한 종속성 패키지를 권장 할 수 있습니다. 2. AI는 의존성 충돌을 다루기위한 지능형 솔루션을 제공합니다. 3. AI는 코드를 검토하고 코드 품질을 향상시키기위한 최적화 제안을 제공합니다. 이러한 기능을 통해 개발자는 비즈니스 로직 구현에 더 집중할 수 있습니다.

작곡가를 정의하는 것 : 역할 이해작곡가를 정의하는 것 : 역할 이해May 08, 2025 am 12:07 AM

작곡가는 음악적 구조를 고안하고 악기 조합 선택, 다른 음악가들과 함께 일하는 역할을 포함하는 음악 작품을 만들어 감정을 표현하거나 이야기를 나누거나 아이디어를 표현하는 사람들입니다. 1) 작곡가는 창조적 인 과정에서 4 단계의 임신, 창조, 수정 및 개선을 거칠 것입니다. 2) 그들은 작업의 품질과 효과를 보장하기 위해 Harmony, Counterpoint 및 Melody와 같은 음악 이론을 습득해야합니다.

작곡가 : 종속성 설치, 업데이트 및 관리작곡가 : 종속성 설치, 업데이트 및 관리May 07, 2025 am 12:07 AM

Composer는 PHP의 종속성 관리 도구이며 Composer.json 및 Composer.lock 파일을 통해 프로젝트 종속성을 관리합니다. 1. Composer 설치 : 특정 명령을 실행하고 Composer.phar를 시스템 경로로 이동하십시오. 2. Composer 업데이트 : ComposelSelf-UpDate 명령을 사용하십시오. 3. 종속성 관리 : ComposerRequire 명령을 통해 종속성을 추가하고 관련 파일을 자동으로 업데이트하고 패키지를 다운로드하십시오.

AI 기반 작곡가 : 코드 생성 및 분석AI 기반 작곡가 : 코드 생성 및 분석May 06, 2025 am 12:11 AM

AI는 코드 생성 및 분석에서 중요한 역할을합니다. 1) 기계 학습 및 NLP (예 : Github의 부실)를 통해 코드 생성; 2) 코드 분석을 수행하고 Sonarqube와 같은 버그 및 최적화 제안을 식별합니다. 3) 개발 효율성 및 코드 품질을 향상 시키지만 수동 검토 및 최적화가 필요합니다.

작곡가 : AI 기반 도구 및 통합작곡가 : AI 기반 도구 및 통합May 05, 2025 am 12:11 AM

작곡가 자체에는 AI 기능이 포함되어 있지 않지만 AI 도구는 향상시킬 수 있습니다. 1) AI는 Composer.json 파일을 분석 할 수 있으며 종속성을 최적화하고 버전 충돌을 예측하는 것이 좋습니다. 2) Githubcopilot과 같은 AI 중심 플랫폼은 개발 효율성을 향상시키기 위해 실시간 코드 제안을 제공 할 수 있습니다. AI 도구를 사용할 때는 실제 상황과 함께 확인하고 조정해야합니다.

성공적인 작곡가의 속성성공적인 작곡가의 속성May 04, 2025 am 12:13 AM

성공적인 작곡가의 주요 특성은 다음과 같습니다. 1) 풍부한 창의성과 상상력, 2) 기술 기술과 도구의 탄탄한 숙달. 이러한 특성은 프로그래밍에서 창의적이고 구조화 된 사고와 유사하므로 작곡가가 창의성을 실현하고 음악 제작에서 작업을 최적화 할 수 있도록 도와줍니다.

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 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

맨티스BT

맨티스BT

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

에디트플러스 중국어 크랙 버전

에디트플러스 중국어 크랙 버전

작은 크기, 구문 강조, 코드 프롬프트 기능을 지원하지 않음

VSCode Windows 64비트 다운로드

VSCode Windows 64비트 다운로드

Microsoft에서 출시한 강력한 무료 IDE 편집기

ZendStudio 13.5.1 맥

ZendStudio 13.5.1 맥

강력한 PHP 통합 개발 환경

PhpStorm 맥 버전

PhpStorm 맥 버전

최신(2018.2.1) 전문 PHP 통합 개발 도구