thinkphp5.0ネーミングスペース

10204 ワード

ネーミングスペース
ThinkPHPはネーミングスペース方式でクラスライブラリファイルを定義し自動ロードし、マルチモジュールとComponentクラスライブラリ間のネーミングスペース衝突問題を効果的に解決し、より効率的なクラスライブラリ自動ロードメカニズムを実現した.
ネーミングスペースの基本概念がわからない場合は、PHPマニュアル:PHPネーミングスペース
特に、PHPに内蔵されているクラスライブラリを呼び出す必要がある場合、または第三者がネーミングスペースを使用していないクラスライブラリを呼び出す必要がある場合は、クラスライブラリをインスタンス化するときに\を追加してください.たとえば、次のようにします.
//      
$class = new stdClass();
$xml  =  new SimpleXmlElement($xmlstr); //       $class = new \stdClass(); $xml = new \SimpleXmlElement($xmlstr);

ThinkPHP 5.0では、クラスライブラリに存在するネーミングスペースを正しく定義し、ネーミングスペースのパスがクラスライブラリファイルのディレクトリと一致するだけで、クラスの自動ロードを実現し、真の不活性ロードを実現することができる.
たとえば、\think\cache\driver\Fileクラスは次のように定義されます.
namespace think\cache\driver;

class File { }

クラスをインスタンス化すると、次のようになります.
$class = new \think\cache\driver\File();

システムは、thinkphp/library/think/cache/driver/File.phpのパスを持つクラスファイルを自動的にロードします.
5.0デフォルトのディレクトリ仕様は小文字で、クラスファイルの名前はアルパカ法で、頭文字は大文字です.
原則として、ネーミングスペースの定義とディレクトリが一致する限り、アルパカ法で命名されたディレクトリをサポートできます.たとえば、次のようになります.
我々はインスタンス化
$class = new \Think\Cache\Driver\File();
thinkphp/library/Think/Cache/Driver/File.phpファイルが自動的にロードされます.
ルートネーミングスペース(クラスライブラリパッケージ)
ルートネーミングスペースは重要な概念であり、上の\think\cache\driver\Fileクラスを例にとると、thinkはルートネーミングスペースであり、その対応する初期ネーミングスペースディレクトリはシステムのクラスライブラリディレクトリ(thinkphp/library/think)であり、ルートネーミングスペースがクラスライブラリパッケージに対応していることを簡単に理解することができる.
システムに組み込まれているいくつかのルートネーミングスペース(クラスライブラリパッケージ)は、次のとおりです.
名前
説明
クラスライブラリディレクトリ
think
システムコアクラスライブラリ
thinkphp/library/think
traits
システムTraitクラスライブラリ
thinkphp/library/traits
app
クラスライブラリの適用
application
新しいルートネーミングスペースを追加する必要がある場合は、2つの方法があります.新しいルートネーミングスペースを登録するか、EXTEND_PATHディレクトリ(自動登録)を入れます.
このマニュアルのサンプルコードは、簡潔化のため、指定されたクラスライブラリのネーミングスペースがない場合は、thinkネーミングスペースを指します.たとえば、次のコードです.
Route::get('hello','index/hello');
use think\Routeまたは
\think\Route::get('hello','index/hello');

自動登録
私たちは自分のクラスライブラリパッケージディレクトリをEXTEND_PATHディレクトリ(extend、構成可能)に入れるだけで、対応するネーミングスペースを自動的に登録することができます.例えば、次のようにします.extendディレクトリの下にmyディレクトリを追加し、\my\Testクラスを定義します(クラスファイルはextend/my/Test.phpにあります).
namespace my;

class Test { public function sayHello() { echo 'hello'; } }

インスタンス化と呼び出しを直接行うことができます.
$Test = new \my\Test();
$Test->sayHello();

アプリケーション・エントリ・ファイルでEXTEND_PATH定数を再定義した場合、\my\Testクラスのファイルの場所を変更することもできます.たとえば、次のようにします.
define('EXTEND_PATH','../vendor/');

では、\my\Testクラスのファイルの位置は/vendor/my/File.phpになります.
手動登録
手動で登録することで、新しいルートネーミングスペースを登録することもできます.たとえば、次のようにします.
アプリケーション・エントリ・ファイルに次のコードを追加します.
\think\Loader::addNamespace('my','../application/extend/my/');

複数のルートネーミングスペースを同時に登録する場合は、次の操作を行います.
\think\Loader::addNamespace([ 'my' => '../application/extend/my/', 'org' => '../application/extend/org/', ]);

アプリケーションのプロファイルに直接構成を追加することもでき、アプリケーションが実行されると自動的に登録されます.
'root_namespace' => [
    'my'  => '../application/extend/my/',
    'org' => '../application/extend/org/', ]

クラスライブラリパッケージの適用Composerに自動的にロードされたクラスライブラリと競合することを回避するために、アプリケーションクラスライブラリのネーミングスペースのルートは、appに統一されています.たとえば、次のようになります.
namespace app\index\model;

class User extends \think\Model { }

クラスファイルはapplication/index/model/User.phpにあります.
namespace app\admin\Event;
class User { }

クラスファイルはapplication/admin/event/User.phpにあります.
appルートのネーミングスペースが適切でないか、競合していると判断した場合は、アプリケーションプロファイルで変更できます.
'app_namespace' =>  'application',

定義後、クラスライブラリの名前空間を次のように変更します.
namespace application\index\model;

class User extends \think\Model { }

ネームスペースエイリアス
フレームワークでは、名前空間に別名を定義できます.たとえば、次のようになります.
namespace app\index\model;

use think\Model;

class User extends Model { }

コントローラで呼び出す方法は次のとおりです.
namespace app\index\controller;

use app\index\model\User; class Index { public function index() { $user = new User(); } }

アプリケーション・パブリック・ファイルに名前空間別名を登録すると、次のようになります.
\think\Loader::addNamespaceAlias('model','app\index\model');

では、上記のコントローラコードを次のように変更できます.
namespace app\index\controller;

use model\User; class Index { public function index() { $user = new User(); } }

このマニュアルの後続の章は、PHPのネーミングスペースを知っている上で、自分でPHPの基礎を補充してください.そうしないと、後続のドキュメントとThinkPHP 5にいます.0の学習過程で、ネーミングスペースの理解不足が最大の学習障害になります.
転載先:https://www.cnblogs.com/chinalorin/p/5828434.html