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
プロジェクトの作成
つまり、必要なファイルやフォルダを作成することです.
ファイルの追加
Db.php
自動ロード:
テスト
Myframework初期化ファイルindexを追加します.phpファイル
コードは次のとおりです.
名前空間名Myframeworkcoreが出力されます.
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.詳細
\< >(\< >)*\< >
という構造が必要です.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が出力されます.