PHPはPSR-4自動ロードを実現

3469 ワード

PSR 4標準定義
Autoloader
キーワード「必須」(「MUST」)、「絶対不可/絶対不可」(「MUST NOT」)、「必要」(「REQUIRD」)、「将」(「SHALL」)、「できない」(「SHALL NOT」)、「すべき」(「SHOULD」)、「いけない」(「SHOULD NOT」)、「推薦」(「RECOMMENDED」)、「できる」(「MAY」)および「オプション」(「OPTIONAL」)の詳細は「RFC 2119」を参照してください.
1.概要
本PSRは、ファイルパス[自動読み込み][http://tools.ietf.org/html/rfc2119]対応するクラスに関する仕様であり、本仕様は相互運用可能であり、いずれかの自動ロード仕様の補足として使用することができ、その中にはPSR-0が含まれている.また、本PSRは自動ロードされたクラスに対応するファイル格納パス仕様も含まれている.
2.詳細
  • ここでの「クラス」は、一般に、すべてのclassクラス、インタフェース、traits多重化可能なコードブロック、および他の類似構造を指す.
  • 完全なクラス名には、
    \<    >(\<     >)*\<  >
    という構造が必要です.
  • 完全なクラス名には、「vendor namespace」と呼ばれるトップクラスのネーミングスペースが必要です.
  • 完全なクラス名には、1つ以上のサブネーミング空間があり得る.
  • 完全なクラス名には最終的なクラス名が必要です.
  • 完全なクラス名のいずれかの部分の下落線には特別な意味はありません.
  • 完全なクラス名は任意の大文字と小文字から構成することができる.
  • すべてのクラス名は、大文字と小文字が敏感でなければなりません.

  • 完全なクラス名に従って対応するファイルをロードすると......
  • 完全なクラス名のうち、最も前のネーミングスペース区切り記号を削除し、前に連続する1つ以上のネーミングスペースとサブネーミングスペースは、「ネーミングスペース接頭辞」として、少なくとも1つの「ファイルベースディレクトリ」に対応する必要があります.
  • ネーミングスペースプレフィックスに続くサブネーミングスペースは、対応する「ファイルベースディレクトリ」と一致する必要があります.ネーミングスペースセパレータはディレクトリセパレータとして使用されます.
  • の末尾のクラス名は、対応する.phpは接尾辞のファイルの同名です.
  • 自動ローダ(autoloader)の実装では、例外を投げ出すことができず、いずれかのレベルのエラー情報をトリガすることができず、戻り値があるべきではない.

  • 3.例
    次の表に、スペシフィケーションの完全なクラス名、ネーミングスペースの接頭辞、およびファイルベースディレクトリに対応するファイルパスを示します.
    完全なクラス名
    名前空間接頭辞
    ファイルベースディレクトリ
    ファイルのパス
    \Acme\Log\Writer\File_Writer
    Acme\Log\Writer
    ./acme-log-writer/lib/
    ./acme-log-writer/lib/File_Writer.php
    \Aura\Web\Response\Status
    Aura\Web
    /path/to/aura-web/src/
    /path/to/aura-web/src/Response/Status.php
    \Symfony\Core\Request
    Symfony\Core
    ./vendor/Symfony/Core/
    ./vendor/Symfony/Core/Request.php
    \Zend\Acl
    Zend
    /usr/includes/Zend/
    /usr/includes/Zend/Acl.php
    プロジェクトの作成
    つまり、必要なファイルやフォルダを作成することです.
    mkdir ~/namespace
    cd ~/namespace
    mkdir ~/namespace/vendor/Myframework/core/db
    
    
    

    ファイルの追加
    Db.php
    vim ~/namespace/vendor/Myframework/core/Db.php
    コードをDbに追加する.php
    <?php
    namespace Myframework\core;
    class Db{
        public function __construct(){
            echo __NAMESPACE__;
        }
    }
    ?>

    自動ロード:
    vim ~/namespace/vendor/autoload.php
    コード:
    <?php
    function autoload($className)
    {
        $className = ltrim($className, '\\');
        $fileName  = '';
        $namespace = '';
        if ($lastNsPos = strrpos($className, '\\')) {
            $namespace = substr($className, 0, $lastNsPos);
            $className = substr($className, $lastNsPos + 1);
            $fileName  = str_replace('\\', DIRECTORY_SEPARATOR, $namespace) . DIRECTORY_SEPARATOR;
        }
        $fileName .= str_replace('_', DIRECTORY_SEPARATOR, $className) . '.php';
        require BASEPATH.'vendor'.DIRECTORY_SEPARATOR.$fileName;
    }
    spl_autoload_register('autoload');

    テスト
    Myframework初期化ファイルindexを追加します.phpファイル
    vim ~/namespace/index.php

    コードは次のとおりです.
    /*      */
    error_reporting(-1);
    ini_set('display_errors',1);
    
    //  
    define('BASEPATH',dirname(__FILE__));
    
    //    
    require BASEPATH.'vendor'.DIRECTORY_SEPARATOR.'autoload.php';
    
    //    
    use \Myframework\core\Db;
    $db = new Db();

    名前空間名Myframeworkcoreが出力されます.