PHP용 고성능 자동 로더
13910 단어 phphighperformance
도서관
https://github.com/EFTEC/autoloadone
샘플 소스 코드
https://github.com/EFTEC/autoloadone-example
우리는 왜 이 도서관이 필요합니까?
무엇이 자동 장탄기입니까?
다음 예를 보도록 하겠습니다.
$obj=new \example\folder\SomeClass();
이 클래스를 실행하려면 코드를 사용해서 포함해야 합니다.include __DIR__'/folder/SomeClass.php';
$obj=new \example\folder\SomeClass();
그러나 어떤 클래스가 다른 클래스를 호출하거나 우리가 더 많은 클래스를 호출한다면?그리고 우리는 반드시 수동으로 그것을 포함해야 한다.include를 여러 번 호출하면 시스템이 실패할 수 있습니다.우리는 include_를 한 번 사용하는 것을 피할 수 있지만, 모든 문제를 해결할 수는 없습니다.자동 로더를 사용할 때, 필요할 때만 파일을 불러옵니다.
include 'autoload.php';
$obj=new \example\folder\SomeClass();
Composer의 자동 로드는 다음 정책을 사용합니다.그것은 작곡가에 의존한다.json은 이름 공간을 설정하고 만듭니다.그러나 이것은 우리의 코드가 PSR-0 또는 PSR-4라는 엄격한 준칙을 따르도록 요구한다.include 'vendor/autoloader.php';
$obj=new \example\folder\SomeClass();
작곡가와json"autoload": {
"psr-4": {
"example\\folder\": "example/folder/",
그러나 이 자동 로드기는 다음과 같은 작업을 수행합니다.return array(
'7b11c4dc42b3b3023073cb14e519683c' => $vendorDir . '/ralouphie/getallheaders/src/getallheaders.php',
이것은 $vendorDir와 연결되어 있으며, 요청마다 x 클래스가 실행됩니다.일반적인 Laravel 프로젝트에서는 +600회라고 불린다.Autolodone의 작동 방식은 다릅니다.
'example\folder' => '/folder',
따라서 인코딩도 하지 않고 상대 폴더를 계산할 때도 없습니다.그러나 그것도 별도의 최적화가 있다.수동으로 편집할 수 있습니다.폴더가 여러 번 사용되면 메모리를 절약하기 위해 복구할 수 있습니다.
$array=[]'example\folder2\Class1' => '|1|',
'example\folder2\Class2' => '|1|'...];
// And in another array
$array=[1 => '/folder2/MultipleClasses.php'];
클래스 example\folder2\Class1을 호출하려면 두 번째 그룹을 읽고 전체 경로를 만듭니다.이 변환은 요청 클래스에서만 실행되기 때문에 이 클래스를 호출하지 않으면 성능에 해를 끼치지 않습니다.PSR-0
강제적
PSR-4
\<NamespaceName>(\<SubNamespaceNames>)*\<ClassName>
모든 클래스 이름은 대소문자를 구분하는 방식으로 인용해야 합니다.
종료 클래스 이름은
.php
로 끝나는 파일 이름에 대응합니다.파일 이름은 종료 클래스의 대소문자와 일치해야 합니다.Autolodone 회사
PSR-0, PSR-4, 이름 공간, 다른 폴더, 심지어 클래스가 없는 모든 경우에 적용됩니다.PSR-4를 사용하는 경우 즉시 사용할 수 있습니다.
어떻게 시작합니까?
1) 라이브러리를 다운로드하거나 composer를 통해 포함합니다.
Autolodone 파일을 다운로드할 수 있습니다.php
https://github.com/EFTEC/autoloadone
composer를 통해 설치할 수도 있습니다.
composer require eftec/autoloadone
이 라이브러리는 의존 관계가 없기 때문에 모든 폴더에 다운로드하여 복사할 수도 있습니다.
2) 프로젝트 루트 디렉토리에 다음 파일 만들기
<?php
// if true then it also include files with autoloader
define('_AUTOLOAD_COMPOSERJSON',true);
// we include our library manually
include 'vendor/eftec/autoloadone/AutoLoadOne.php';
3) 웹 페이지로 실행
이 코드는 폴더를 스캔하여 클래스, 인터페이스, 구조, 간단한 PHP 파일을 추가하고 저장할 정보가 있는지 수집합니다.프로젝트의 규모에 따라 시간이 걸릴 수 있습니다.새 PHP 파일을 추가할 때마다 같은 폴더의 새 클래스가 아닌 다른 클래스와 같은 이름 공간을 사용해야 합니다.
4) 우리 교실을 소모한다.
이것은 autoload라는 파일을 생성합니다.php, 이것은 우리의 자동 불러오는 것입니다.
우리는 그것을 이렇게 부를 수 있다.
<?php
include 'autoload.php';
이렇게어떻게 사용합니까?
우선, 이 생성기나 자동 캐리어는 특정한 구조 폴더를 필요로 하지 않고, 심지어는 작곡가를 편집할 필요도 없다.json.이 라이브러리는composer를 무시합니다.json.
간단한 폴더와 클래스
📁 폴더/SomeClass.php
namespace example\folder;
class SomeClass
{
}
다음 클래스를 가정하면 클래스의 이름은 파일(SomeClass.php)의 이름(SomeClass)과 같습니다.우리는 어떻게 이런 것을 자동 캐리어에 추가합니까?클래스가 루트 폴더에 있으면 이미 포함되어 있습니다.라이브러리가 자동으로 불러오는 동안 다음 줄을 생성합니다.php
$arrautoload = [
'example\folder' => '/folder'..]
이름공간 예시\폴더로 클래스를 보려면 폴더라는 폴더를 볼 것이라고 합니다.여러 클래스를 포함하는 간단한 PHP 파일
왜 우리는 여러 종류의 파일을 포함해야 합니까?때때로 프로젝트의 업무 논리나 우리가 프로젝트의 파일 수를 줄이기를 원하기 때문에 우리는 엄격한 결합된 파일이 필요하다.
📁 2/MultipleClasses 축소php
namespace example\folder2;
class Class1 {
}
class Class2 {
}
Autolodone은 다음과 같이 모든 클래스를 이 파일에 저장합니다.$arrautoloadCustom = [
'example\folder2\Class1' => '/folder2/MultipleClasses.php',
'example\folder2\Class2' => '/folder2/MultipleClasses.php'...
이것은 두 개의 폴더를 포함하는 간단한 파일이기 때문에 자동 불러오는 것을 포함한다.php는 단순 클래스와 다르다.클래스 "example\folder2\Class1"을 호출하면 파일 "/folder2/MultipleClasses"를 호출합니다.php 등등.여러 개의 PHP 파일, 각 파일에 하나의 클래스가 있고 같은 폴더와 네임스페이스를 공유합니다.
📁 폴더 3/고객.php
namespace example\erp;
class Customer
{
}
📁 폴더 3/직원.phpnamespace example\erp;
class Employees
{
}
Autolodone은 이름 공간을 폴더와 연결시키기 때문에 효과적인 작업 방식입니다.$arrautoload = [
'example\erp' => '/folder3',
We don't need to run AutoLoadOne again if we add a new class in the same folder and in the same namespace.
우리 루트 폴더 이외의 라이브러리입니다.
가시화 인터페이스 (웹) 에서 다른 폴더 (상대 또는 절대 경로) 에서 라이브러리를 사용하는 것을 포함하여 많은 설정을 설정할 수 있습니다
이 예에서 우리는 상대 경로를 사용할 것이다.
📁 루트 폴더 <--우리의 루트 폴더
📁 외부 프로젝트/somefolder/ClassExternal.php<--우리가 포함하고 싶은 클래스.
Autolodone 관심 추가
$arrautoload = [
'external\somenamespace' => '../externalproject/somefolder'
클래스가 아닌 PHP 파일을 추가합니다.
클래스 없이 PHP 파일을 추가하고 실행할 수도 있습니다.이를 위해, 우리는 파일의 모든 부분에 주석을 추가해야 한다.
/** @autorun */
Autolodone 관심 추가@include __DIR__.'/noclasses/noclass.php';
그것은 직접 파일을 포함한다.우선 순위가 있는 비클래스 PHP 파일을 추가합니다.
이 시스템은 우선 순위가 있는 파일을 포함할 수 있도록 합니다.이를 위해, 우리는 파일의 모든 부분에 이 주석을 추가해야 한다
/** @autorun first */
그것은 일반적인 자동 운행 전에 호출된다.네임스페이스와 폴더는 포함되지 않습니다.
이 라이브러리에서는 폴더 및/또는 네임스페이스를 사용하여 파일을 제외할 수도 있습니다.
예를 들어, 이 라이브러리는composer 클래스를 자동으로 만듭니다.우리는 그것을 삭제함으로써 약간의 메모리를 절약할 수 있다.우리는 폴더나 이름 공간을 통해 삭제할 수 있다
'ComposerAutoloaderInit18396353ba4e6f59a571a2e69914dd47' => '|2|real.php',
'Composer\Autoload\ComposerStaticInit18396353ba4e6f59a571a2e69914dd47' => '|2|static.php'
Reference
이 문제에 관하여(PHP용 고성능 자동 로더), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/jorgecc/an-high-performance-autoloader-for-php-2f4k텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)