PHP 名前空間 名前空間/カテゴリ名の使用/フレームワークの自動読み込み機構

WBOY
リリース: 2016-06-23 13:17:16
オリジナル
788 人が閲覧しました

php 5.3 以降、PHP には名前空間/遅延静的バインディング/ラムダ匿名関数などの主要な機能が追加されました

名前空間の参照により、PHP のコード構造の柔軟性と制御性がさらに向上し、コード構造のさまざまな側面を簡単に組み合わせることができます。プロジェクトのツールクラスは分類され、管理されます

各 PHP フレームワークは、ファイル パス マッピングと自動ロード機能に名前空間を使用します

以下で Yii2 の分析を行ってみましょう

まず、Yii2 のコントローラー記述ルールを見てみましょう

controllersIndexController.php

<?php /** * 自动载入机制 *///==========================================================================================//声明自己的命名空间 此命名空间下的类皆归属于此命名空间管理//==========================================================================================namespace app\controllers;//==========================================================================================//use 声明其实只是为 yii\web\Controller 定义一个别名:Controller 方便我们再上下文中使用//而并非像 C/C++的include JAVA的import将导入的文件加载进来(当然php为解释语言 不存在预编译这一步)//==========================================================================================use yii\web\Controller;//==========================================================================================//IndexController的完整类名其实为 app\controller\IndexController//Controller 为 yii\web\Controller php 解释到此点才会去加载此类//==========================================================================================class IndexController extends Controller {    public function actionIndex() {        //不使用 use 提前声明 手写完整的类名        $model = new \app\models\EntryForm();//注意当前上下文中存在命名空间 所以要从根命名空间 '\' 开始    }}?>
ログイン後にコピー

1. 特定の名前空間コンテキスト内の他の名前空間にあるクラスにアクセスする場合、別名として use を使用することも、このクラスの完全名を使用することもできます。 '' ルート名前空間で始まる必要があります。そうしないと、インタープリターは現在の名前空間コンテキストで呼び出しているとみなします。つまり、foobar メソッドは currentNamespace の foobar メソッドにロードされます

名前空間は Linux ファイルに非常に似ていますsystem、'' はルートを表し、ルートで始まらないものはすべて現在の名前空間に基づいているとみなされます

2. foobar を使用した後、new bar() は次のようになります。 new foobar() を使用して、異なる名前空間にある同じクラス名を持つクラスを同時に参照する場合、 as を使用して新しいエイリアスを定義することもできます

use foo\bar\sameName as classA;use bar\foo\sameName as classB;new classA(); // new \foo\bar\sameName;new classB(); // new \bar\foo\sameName;
ログイン後にコピー

3.エントリ ファイルのロード パラメータ設定を通じてアプリケーション本体を読み込み、ルーティング コンポーネントをロードし、リクエストを解析し、コントローラをディスパッチします。メソッドを呼び出すと、プロセス中に

use yii\web\Controller;
ログイン後にコピー
などの他のクラスが呼び出されます。システムは最後のロードを試行します。それでもこのクラスをロードできない場合はエラーが報告されます

Yii2のエントリーファイルを見てみましょう アプリケーションエンティティ起動後の自動ロード機能の登録処理

index.php

自動ローディング関数がまだ登録されていないため、設定とシステムフレームワークをロードするときにエントリファイルはrequire呼び出しを使用します

Yiiブートストラップファイルをロードします 次に、spl_autoload_registerを通して自動ローディング関数を登録しました

Yii。 php

Yii2 のオートローディング関数

BaseYii に継承されているものは、名前空間タイプのクラス名に従ってこのクラスのクラス名をマッピングすることです

たとえば、yiiwebController クラスがマッピングされます。 yii に従って '/web/Controller.php' ファイルに追加し、このファイルは yiiwebController クラスにアクセスするためにロードします

自分で作成したコントローラーまたはモデルにアクセスします。 as 'appcontrollersIndexController' 'appmodelsEntryForm'


autoload 関数は、アプリ マッピング キーワードに従ってコントローラーまたはモデル フォルダーの下に配置され、対応するファイルを読み込むことができます。これが、クラス名とファイル名がロードされる理由です。相互に対応しない場合は、固定の require ファイルを通じてのみロードできます。
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート