ホームページ php教程 php手册 PHP フレームワークをステップバイステップで作成する (11)

PHP フレームワークをステップバイステップで作成する (11)

Jun 21, 2016 am 08:50 AM
assign nbsp test view

以前にジャンプとリクエストの転送の実装方法について説明しました。もちろん、これは単なる概要であり、より詳細な内容については、特定のフレームワークの実装を自分で読む必要があります。

ジャンプと転送が利用できるようになったので、後でモデルの作成に戻ることができます。まず、以前の実装は非常に醜いものでした。

1 $viewPath = dirname(__FILE__) . '/../views/index.php';
1

2 if(file_exists($viewPath)) {
$viewPath = dirname(__FILE__) . '/../views/index.php';

3     include $viewPath;
テーブル>

4 } else {
2

5     echo 'view does not exists';

if(file_exists($viewPath)) {

6 }
テーブル>

3

$viewPath を含めます;

テーブル>

01
<テーブル>

4

02 class TestController extends Controller {

03 public function test() {
} else {

04 $this->_assign(array(

05             'arr' => array(
5 echo 'ビューが存在しません'; テーブル> 6 } テーブル> 次に、よりエレガントな方法でビューにデータを渡します。 を呼び出す方法について説明します。 01 <🎜> <🎜> <🎜> <テーブル> <🎜><🎜>02<🎜><🎜> <🎜><🎜>クラス TestController はコントローラ {<🎜><🎜> を拡張します <🎜> <🎜> <テーブル> <🎜><🎜>03<🎜><🎜> <🎜><🎜> パブリック関数 test() {<🎜><🎜> <🎜> <🎜> <テーブル> <🎜><🎜>04<🎜><🎜> <🎜><🎜> $this->assign(array(<🎜><🎜> <🎜> <🎜> <テーブル> <🎜><🎜>05<🎜><🎜> <🎜><🎜> 'arr' => 配列( テーブル>

06                 'test','test2'

07             ),

08             'str' => 'it is a str'

09         ));

10         $this->_display('test');

11     }

12 }

これは私が今日書いた後の呼び出し方法です。smarty を学習したことがある方なら、これが Smarty に非常に似ていることがわかるでしょう。実際、私も toper を書いたときに、smarty の影響を受けました。感想 ビューはsmartyを使いましたが、自作フレームワークということもあり、ビューは全て自分で書かないといけないので、それでも後からでも使えるようにしておきました。構成ファイルを変更することで、フレームワーク自体の実装を使用せずにビューを Smarty に切り替えることができます。

まず、コードを簡素化するために、実際の実装は誰でも理解できるように単純化しました。フレームワークはさらに複雑になります。

最初に代入します。その機能は変数に値を代入することです。ここでは、渡されるパラメーターはすべて HashTable と呼ばれるものであると仮定します。代入方法は、直接呼び出す必要はありません。このインターフェースを実装するための値:

1 protected  function _assign(Array $arr) {
1

2         View::assign($arr);
保護された関数 _assign(Array $arr) { テーブル> 2 View::assign($arr); テーブル>

3     }

ビューのデータの保存と表示を処理するために、View.php ファイルを定義しました。もちろん、View::assign メソッドは実装された関数の 1 つです。 。 。

View.php ではどのように実装されますか?

1 private static $_data = array();
1

2     public static function assign($arr) {

プライベート static $_data = array();

3         foreach($arr as $key => $val) {
テーブル>

4             if(!is_int($key)) {

2

5                 //过滤掉如array('test','test2')这种数据

6                 self::$_data[$key] = $val;
パブリック静的関数 assign($arr) {

テーブル>
7             }

8         }
3

9     }
foreach($arr as $key => $val) { テーブル> 4 if(!is_int($key)) { テーブル> 5 //array('test','test2') などのデータを除外します テーブル> 6 self::$_data[$key] = $val; テーブル> 7 } テーブル> 8 } テーブル> 9 } テーブル>

assign は静的メソッドであり、データをこのクラスに格納する必要があるため、静的メンバー変数 $_data を定義する必要があります。この変数には、コントローラーによって渡されたデータが格納されます。型ヒントは以前にコントローラーの assign で実行されていたため、View の assign によって渡される仮パラメーターはすべて配列であることが保証されます。必要なのは foreach だけであり、それらを順番に格納するので、self を使用しないのはなぜでしょうか。 ::$ を直接指定すると、文が 1 つしかないので、_data = $arr はどうでしょうか?

まず、配列内のデータの一部が間違っている可能性があります。たとえば、array('test','test2') のデータ test と test2 が何を表しているのかわかりません。要件がより厳しい場合は、ユーザーに直接警告することもできます。

第 2 に、ユーザーが assign を複数回呼び出す可能性があります。参照が直接使用されると、2 回目の assign 呼び出しで最初のデータが失われるため、これは許容できません。

割り当ては完了しました。次に、それをどのように表示するかという問題があります。コントローラーでは、内部実装を担当せず、インターフェイスを直接呼び出す方が良いですが、特定の書式設定が必要です。インターフェースを呼び出す前に行う必要があります:

01 protected function _display($str) {
01

02         if(is_string($str)) {

保護された関数 _display($str) {

03             $str = str_replace(array(
テーブル>

04                 '.','#'

02

05             ),array(

06                 '/','.'
if(is_string($str)) {

テーブル>
07             ),$str);

08             View::display(MODULES_PATH . View::VIEW_BASE_PATH . $str . '.php');
03 $str = str_replace(array( テーブル> 04 ‘.’,’#’ テーブル> 05 ),array( テーブル> 06 '/','.' テーブル> 07 ),$str); テーブル> 08 View::display(MODULES_PATH . View::VIEW_BASE_PATH . $str . '.php'); テーブル>

09         }

10     }

見た目の美しさやその他の XXX の理由から、実際のパラメータとして渡されるときは / を表すパスを変更できます。test/test2.php が呼び出されると、test に渡すだけで済みます。 .test2.php で十分です。もちろん、これには問題もあります。先ほどの例のように、test.test2.php が実際には test/test2/php に解析されるため、これをどのように解決するかが問題になります。 # を使用して表すので、渡されると test.test2#php になります。もう 1 つ問題があります。.php は基本的にすべてのページに存在するのに、なぜそれを渡す必要があるのでしょうか? フレームワークはそれを直接追加するだけなので、ユーザーは test.test2 を入力するだけなので、論理的には簡単です。テストモジュールの下のビューファイルtest2を理解するために。 thinkphp を使用したことがある人なら、これがその書き方に非常に似ていることがわかると思います。実際、私が書き始めたとき、thinkphp のソースコードを読みながら書いたので、多くの点でそのアイデアを借用しました。私は個人的に # を使用するのが嫌いなので、基本的にビュー ファイルでは # を使用しません。test.view.php のような意味のないファイル名を記述するのはそれほど退屈ではないと思うからです。PHP を直接テストするだけで十分です。一種の名前フレームワークは問題の一部を解決するのに役立つため、この問題は基本的に存在しません。

定数 View::VIEW_BASE_PATH もあります。この定数はビューのルート ディレクトリへのパスを表すため、実際に渡されるのは実際の絶対パスです。

display はこのビューファイルを表示するため、必ず特定のファイルを使用します。具体的な実装は次のとおりです。

1

1 public static function display($file) {

パブリック静的関数表示($file) {

2         if(file_exists($file)) {
テーブル>

3             extract(self::$_data);

2

4             include $file;

5         } else {
if(file_exists($file)) {

テーブル>
6             throw new ViewException(ViewException::NOT_EXISTS_TEMPLATE);
3 extract(self::$_data); テーブル> 4 $file をインクルード; テーブル> 5 } else { テーブル> 6 throw new ViewException(ViewException::NOT_EXISTS_TEMPLATE); テーブル>

7         }

8     }

抽出は配列の分割に関するものです。詳細については、PHP マニュアルを参照してください。

ビューファイルが存在しない可能性があるため、それを判断する必要があります。ビューファイルが存在しない場合、例外は ViewException を使用しており、このクラスは新しく定義されていることに注意してください。このパラメータは、ビュー テンプレートが存在しないためにこの例外が発生することを示します。

次に、この例外クラスの具体的な実装を見てみましょう:

01
01

02 class ViewException extends BaseException {

03     const NOT_EXISTS_TEMPLATE = 1;
テーブル>

04     public function __construct($code = 0) {

02

05         switch($code) {

06             case ViewException::NOT_EXISTS_TEMPLATE:
クラス ViewException extends BaseException {

テーブル>
07                 $msg = 'the template file is not exists';

08                 break;
03 const NOT_EXISTS_TEMPLATE = 1; テーブル> 04 パブリック関数 __construct($code = 0) { テーブル> 05 switch($code) { テーブル> 06 case ViewException::NOT_EXISTS_TEMPLATE: テーブル> 07 $msg = 'テンプレート ファイルが存在しません'; テーブル> 08 休憩; テーブル>

09             default :

10                 $msg = 'unknown exception';

11                 break;

12         }

13         parent::__construct($msg,$code);

14     }

15 }

このクラスは BaseException を継承しています。BaseException はデバッグ モードを実装しているため、ViewException にもこの機能があり、デバッグがオフになって例外がスローされた場合にのみジャンプします。エラーページに移動すると、例外が直接表示されないため、この処理の保守が容易になります。



このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Huawei Watch GT 5スマートウォッチが新機能を追加してアップデートされる Huawei Watch GT 5スマートウォッチが新機能を追加してアップデートされる Oct 03, 2024 am 06:25 AM

ファーウェイは、Watch GT 5 および Watch GT 5 Pro スマートウォッチ用のソフトウェア バージョン 5.0.0.100(C00M01) をグローバルに展開しています。これら 2 つのスマートウォッチは最近ヨーロッパで発売され、標準モデルが同社の最も安価なモデルとして登場しました。このハーモニー

鉄拳のカーネル・サンダースの夢をKFCが揚げた 鉄拳のカーネル・サンダースの夢をKFCが揚げた Oct 02, 2024 am 06:07 AM

『鉄拳』シリーズのディレクターである原田勝弘氏は、かつて真剣にカーネル・サンダースを象徴的な格闘ゲームに登場させようとした。 TheGamerとのインタビューで原田氏は、このアイデアを日本KFCに売り込み、ファストフード界のレジェンドをGとして追加したいと考えていたことを明かした。

初見:次期 Anker Zolo 4 ポート 140W ディスプレイ付き充電器の開封ビデオが流出 初見:次期 Anker Zolo 4 ポート 140W ディスプレイ付き充電器の開封ビデオが流出 Oct 01, 2024 am 06:32 AM

2024年9月初め、AnkerのZolo 140W充電器がリークされました。これは同社初のディスプレイ付き壁掛け充電器だったため、大きな話題になりました。 YouTube の Xiao Li TV からの新しい開封ビデオでは、この製品を直接見ることができます。

Cyber​​truck FSD のレビューでは、素早いレーン切り替えと全画面視覚化が賞賛されています Cyber​​truck FSD のレビューでは、素早いレーン切り替えと全画面視覚化が賞賛されています Oct 01, 2024 am 06:16 AM

テスラは最新の完全自動運転 (監視付き) バージョン 12.5.5 を展開しており、これには、ファウンデーション シリーズのトリム価格に含まれる機能を備えたピックアップが発売されてから 10 か月後に、約束されていたサイバートラック FSD オプションがついに付属します。 F

HyperOS を搭載した新しい Xiaomi Mijia グラフェン オイル ヒーターが到着 HyperOS を搭載した新しい Xiaomi Mijia グラフェン オイル ヒーターが到着 Oct 02, 2024 pm 09:02 PM

Xiaomiは間もなくMijiaグラフェンオイルヒーターを中国で発売する予定です。同社は最近、Youpin プラットフォームでホストされるスマート ホーム製品のクラウドファンディング キャンペーンを実施し、成功を収めました。ページによると、デバイスはすでに出荷され始めています

Garmin、新しいアップデートにより複数のスマートウォッチ向けの Adventure Racing アクティビティの改善をリリース Garmin、新しいアップデートにより複数のスマートウォッチ向けの Adventure Racing アクティビティの改善をリリース Oct 01, 2024 am 06:40 AM

Garmin は、最新のハイエンド スマートウォッチの新しい安定したアップデートのセットで月末を迎えます。要約すると、同社は Enduro 3、Fenix E、および Fenix 8 のバッテリー消耗の多さに対処するためにシステム ソフトウェア 11.64 をリリースしました (Amazon で現在 1,099.99 ドル)。

Samsung Galaxy Z Fold Special Edition、競合する名前が浮上、10月下旬に発売されることが判明 Samsung Galaxy Z Fold Special Edition、競合する名前が浮上、10月下旬に発売されることが判明 Oct 01, 2024 am 06:21 AM

サムスンの待望の折りたたみ式「スペシャルエディション」の発売には、また新たな展開が加わった。ここ数週間、いわゆる Galaxy Z Fold Special Edition に関する噂はかなり静かになりました。代わりに、焦点はGalaxy S25シリーズに移りました。

Manjaro 24.1「Xahea」は、KDE ​​Plasma 6.1.5、VirtualBox 7.1 などとともに起動します Manjaro 24.1「Xahea」は、KDE ​​Plasma 6.1.5、VirtualBox 7.1 などとともに起動します Oct 02, 2024 am 06:06 AM

10 年以上の歴史を持つ Manjaro は、インストールと使用が簡単で、初心者とパワーユーザーの両方に適した最もユーザーフレンドリーな Linux ディストリビューションの 1 つとみなされています。主にオーストリア、ドイツ、フランスで開発されたこの Arch ベースのディストリビューション

See all articles