PHP用の高性能自動ローダ


PHP 5.6以降のautoload 1ライブラリのコード例を示します.
図書館
https://github.com/EFTEC/autoloadone
例のソースコード
https://github.com/EFTEC/autoloadone-example
なぜ我々はこのライブラリが必要ですか?
  • 高性能ライブラリです.これは、速度とメモリ使用量の最適化されます.
  • それは特別な設定を必要としません.これは、実質的にすべてのプロジェクトで動作します.
  • それは標準的な、PSR - 0 PSR - 4または他を必要としません.しかし、それと互換性があります.

  • AutoLoaderとは


    次の例を言いましょう
    $obj=new \example\folder\SomeClass();
    
    このクラスを実行するには、コードを使用して含める必要があります.
    include __DIR__'/folder/SomeClass.php';
    $obj=new \example\folder\SomeClass();
    
    しかし、クラスSoceClassが他のクラスを呼ぶか、より多くのクラスを呼ぶならば、どうですか?それから手動でそれを含めなければなりません.includeが1回以上呼び出されると、システムは失敗する可能性があります.私たちは1度includeenseを使用してそれを避けることができますが、それはすべてのトラブルを解決しません.
    自動ローダを使用するときは、必要なときだけファイルを読み込みます.
    include 'autoload.php';
    $obj=new \example\folder\SomeClass();
    
    作曲家のautoloadは、次の戦略を使用します.作曲家に頼っている.名前空間の設定と作成のJSON.しかし、それは我々のコードが厳密なガイドライン(または2)、PSR - 0またはPSR - 4に従うことを必要とします.
    include 'vendor/autoloader.php';
    $obj=new \example\folder\SomeClass();
    
    
    と作曲家.JSON
    "autoload": {
      "psr-4": {
        "example\\folder\": "example/folder/",
    
    ただし、このAutoLoaderは次の操作を行います.
  • ライブラリを含みます.また、オートローダの種類に応じて別のライブラリが含まれます.
  • 作曲家のときにロードされる配列を読み込みます.JSONが処刑された.この配列はいくつかの奇抜な最適化を行いますが、呼び出されるたびにいくつかの連結を行います.何時ですか.顧客の要求ごとに一度!
  • return array(
        '7b11c4dc42b3b3023073cb14e519683c' => $vendorDir . '/ralouphie/getallheaders/src/getallheaders.php',
    
    リクエストされたリクエストXクラスごとに$ Vendordirが実行されます.平凡なlaravelプロジェクトでは、それは+ 600回と呼ばれます.
  • ファイルを呼び出すための異なる戦略があります.
  • それがper - per要求と呼ばれるので、それはシステムのパフォーマンスを傷つけることができました.例えば、1人の顧客がウェブサイトを呼ぶならば、彼は9つのAjax呼び出しをします、そして、彼は10の要求をしています.
    AutoLoadは異なる動作します.
    最初に、それはどんな作曲家も使用しません.JSON
  • 情報は少なくとも1回コンパイルされ、結果を4つの変数、名前空間=>パスリレーション、その他の名前空間=>ファイル名関係に格納します.
  • は3つのメソッドだけから成りますので、PHPは異なるPHPファイルやクラスをロードする必要はありません.
  • autoloadの情報は単純に例です.
    'example\folder' => '/folder',
    
    したがって、それはコード化されていません.しかし、それはまた、余分の最適化をします.手動で編集できます.
    フォルダが複数回使われるならば、それは再開されることができました
    $array=[]'example\folder2\Class1' => '|1|',
    'example\folder2\Class2' => '|1|'...];
    
    // And in another array
    
    $array=[1 => '/folder2/MultipleClasses.php'];
    
    クラス例\Folder 2\Class 1を呼び出したい場合、システムは2番目の配列を読み込み、それを使ってフルパスを作成します.この変換は、クラスが要求されたときのみ実行されます.したがって、クラスが呼び出されない場合はパフォーマンスは損なわれません.

    PSR - 0


    義務的な
  • 完全修飾された名前空間とクラスは以下の構造体を持っていなければなりません
  • 各名前空間はトップレベルの名前空間(“ベンダー名”)を持たなければなりません.
  • 各名前空間は、望むように多くのサブ名前空間を持つことができます.
  • 各名前空間の区切り文字は、ファイルシステムから読み込み時にDirectorySpertセパレータに変換されます.
  • クラス名の各文字をDirectorySumセパレータに変換します.名前空間に特別な意味はありません.
  • 完全修飾された名前空間とクラスが添えられます.ファイルシステムから読み込むときにphp.
  • ベンダー名、名前空間、およびクラス名のアルファベット文字は小文字と大文字の任意の組み合わせであるかもしれません.
  • PSR - 4

  • 用語「クラス」はクラス、インターフェース、特徴、および他の同様の構造を意味する.
  • 完全修飾クラス名には以下の形式があります.
  •     \<NamespaceName>(\<SubNamespaceNames>)*\<ClassName>
    
  • 完全修飾クラス名は、「ベンダー名前空間」としても知られるトップレベルの名前空間名を持たなければなりません.
  • 完全修飾クラス名は1つ以上のサブ名前空間名を持つことができます.
  • 完全修飾クラス名は終端クラス名を持たなければなりません.
  • アンダースコアは完全修飾クラス名のどの部分においても特別な意味を持たない.
  • 完全に修飾されたクラス名の
  • アルファベット文字は小文字と大文字の任意の組み合わせであるかもしれません.

  • すべてのクラス名は大文字小文字を区別したやり方で参照されなければなりません.
  • 完全修飾クラス名に対応するファイルをロードする場合
  • 完全な修飾されたクラス名(「名前空間接頭語」)で主要な名前空間セパレータを含んでいない1つ以上の主要な名前空間と下位名前空間名の連続したシリーズは、少なくとも一つの「ベースディレクトリ」に対応します.
  • 「名前空間接頭語」の後の隣接した下位名前空間名は「ベースディレクトリ」の中のサブディレクトリに対応します.サブディレクトリ名は、サブ名前空間名の場合と一致しなければなりません.

  • 終了クラス名は.phpにファイル名の末尾に相当する.ファイル名は終了するクラス名の場合と一致する必要があります.
  • 自動ローダの実装は例外をスローしてはならず、どんなレベルのエラーも発生してはいけません.
  • オートローダ


    これは、任意の場合、PSR - 0、PSR - 4、名前空間、別のフォルダー、およびクラスも動作します.あなたがPSR - 4を使っているならば、それは箱から働きます.

    ハウツーとスタイル.


    1 )ライブラリをダウンロードするか、作曲家を含む。


    AutoLoadoneファイルをダウンロードできます.PHP
    https://github.com/EFTEC/autoloadone
    または、作曲家を介してインストールすることができます

    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とautoloadです.
    次のように呼ぶことができた.
    <?php
    include 'autoload.php';
    
    そしてそれです.

    使い方は?


    最初に、このジェネレータまたはAutoloaderは、特定の構造フォルダーを必要としないか、さらに、作曲家を編集しません.JSONこのライブラリは作曲家を無視する.JSON

    単純なフォルダとクラス


    📁 フォルダ/someclass.PHP
    namespace example\folder;
    
    class SomeClass
    {
    }
    
    次のクラスを言いましょう.クラスの名前は、ファイルの名前(someclass)に等しくなります(someclass . php).このクラスをオートローダに追加するには?クラスがルートフォルダの中にあるならば、それはすでに含まれます.
    ライブラリは自動ロードの中で次の行を生成します.PHP
    $arrautoload = [
        'example\folder' => '/folder'..]
    
    私たちが名前空間の例のフォルダを持つクラスを見たいなら、「フォルダ」と呼ばれるフォルダを見ます.

    複数のクラスを持つ単純なPHPファイル。


    なぜ複数のクラスのファイルが必要ですか?時々、プロジェクトのビジネスロジックのために厳密に結合されたファイルを必要とするか、プロジェクトのファイル数を減らす必要があります.
    📁 マルチプレックス.PHP
    namespace example\folder2;
    
    class Class1 {
    
    }
    
    class Class2 {
    
    }
    
    このファイルの中のすべてのクラスを
    $arrautoloadCustom = [
       'example\folder2\Class1' => '/folder2/MultipleClasses.php',
       'example\folder2\Class2' => '/folder2/MultipleClasses.php'...
    
    それは2つのフォルダを持つ単純なファイルですので、autoloadが含まれます.PHPは単純なクラスとは異なります.この例では、“example\folder2\Class 1”というクラスを呼び出すと、ファイル'/folder 2/multipleclassを呼び出します.PHP 'など.

    複数のPHPはそれぞれ1つのクラスを持ち、同じフォルダと名前空間を共有します


    📁 カスタマー.PHP
    namespace example\erp;
    class Customer
    {
    }
    
    📁 従業員.PHP
    namespace example\erp;
    class Employees
    {
    }
    
    AutoLoadは名前空間をフォルダーに関連付けるので、効率的に動作するようになります.
    $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.


    私たちのルートフォルダの外のライブラリ。


    Visual Web(Web)では、他のフォルダ(相対パスまたは絶対パス)でライブラリを使用するなど、多くの構成を設定できます

    この例では、相対パスを使用します.
    📁 rootフォルダ<-- rootフォルダ
    📁 外部プロジェクト/somefolder/classexternal.PHP <--クラスを含めるクラスです.
    AutoLoadoneに続く
    $arrautoload = [
       'external\somenamespace' => '../externalproject/somefolder'
    

    非クラスのPHPファイルの追加。


    PHPファイルを追加せずに実行することもできます.このため、ファイルのどの部分にもコメントを追加する必要があります.
    /** @autorun */
    
    AutoLoadoneに続く
    @include __DIR__.'/noclasses/noclass.php';
    
    これは直接ファイルを含んでいます.

    非クラスのPHPファイルの優先度を追加します。


    システムはまた、優先順位のファイルを含めることができます.これを行うには、このコメントをファイルの一部に追加する必要があります
    /** @autorun first */
    
    それは、規則的なautorunの前に呼ばれます.

    名前空間とフォルダを除く。


    このライブラリはまた、フォルダと/または名前空間を使用してファイルを除外することができます.
    たとえば、このライブラリは自動的に作曲家のクラス(私たちがロードしたくない)のクラスになります.我々は、それを取り除くことによって、若干のRAMを節約することができました.フォルダまたは名前空間を介して削除できます
    'ComposerAutoloaderInit18396353ba4e6f59a571a2e69914dd47' => '|2|real.php',
    'Composer\Autoload\ComposerStaticInit18396353ba4e6f59a571a2e69914dd47' => '|2|static.php'