独自の PHP フレームワークの構築経験 (1)、PHP フレームワークの構築経験_PHP チュートリアル

WBOY
リリース: 2016-07-12 08:55:57
オリジナル
918 人が閲覧しました

自己の PHP 架台の注意(一),架橋 php 架台の注意

はじめに

PHP 用の MVC フレームワークを書くことになると、誰もが最初に思い浮かべる言葉は「ホイールを作る」ということでしょう。深いスキルを持たないプログラマーは、マスターが書いた PHP フレームワークほど優れたものではないでしょう。 . 時間とさまざまなプロジェクトによってテストされてきたフレームワーク。それでも準備をして実行したのは、主な理由:

  • PHP のすべての側面を理解しているつもりですが、PHP を学習してまだ日が浅く、よく使用される多くの関数のパラメーターや一部の関数については、時々マニュアルを確認する必要があります。名前空間、リフレクションなどの PHP の新しい機能。簡単に見ただけで、実際には適用していません。
  • PHP は多くの知識を持ち、複雑です。通常のプロジェクトは主にビジネス ロジック コードであり、フレームワークはこれらの知識を統合できるプロジェクトです。
  • 自分でフレームワークを書くときは、TP/CI/YII など、これまでに使用したフレームワークのソース コードも参照します。ソース コードを見ると、フレームワークを理解するのにも役立ちます。将来使いたいフレームワークを受け入れやすくなります。

ということで、今回のホイール作りの目的はホイールを作ることではなく、ホイールの作り方に慣れ、ホイールの特徴をまとめ、ホイールをより良く使うことです。

完全な PHP フレームワークの作成について話す場合、デザイン パターン、イテレータ、イベント、フックなどの多くの PHP 知識ポイントと、多くの基本知識の柔軟な適用を習得する必要があります。これらを完全に制御することはできないと思うので、まずは自分でスケルトンを構築し、さまざまな PHP フレームワークの特性を参照して、徐々に改善していくステップです。仕事の都合上、アルゴリズムやネットワークなどのプログラミングの基礎を夜に習得する必要があるため、PHP フレームワーク部分を更新する時間が週末しかない場合があります。使用したナレッジ ポイントをまとめ、フレームワークの更新後にブログ記事を更新します。機能。

まずフレームワークの現在のソースコードを置きます:GITHUB/zhenbianshu


フレームワーク全体

まず、PHP の MVC フレームワークのワークフローを要約します。

簡単に言えば、エントリファイルを使用してリクエストを受け入れ、ルートを選択し、リクエストを処理し、結果を返します。

もちろん、たった数文でまとめたものでも、実際には多くの作業が必要です。PHP フレームワークは、リクエストを受け取るたびに定数を定義し、設定ファイルと基本クラスを読み込み、アクセスされた URL に基づいて論理的な判断を行い、対応する (モジュール) コントローラーとメソッドを呼び出し、対応するクラスを自動的にロードします。リクエストの処理後、フレームワークは対応するテンプレート ファイルを選択してレンダリングし、HTML ページの形式で応答を返します。ロジックを処理するときは、エラーと例外の処理も考慮する必要があります。

1. MVC フレームワークとして、全体の状況を制御するための固有のエントリー ファイルが必要です。すべてのアクセス要求は、フレームワークのルート ディレクトリにあるindex.php などのこのエントリー ファイルに最初に入力します。基本フォルダー パス、現在の環境に基づいてエラー レポートのレベルを定義します。

2. PHP で別のファイルをロードするには、require と include を使用します。これらは両方とも、ターゲット ファイルの内容を現在のファイルにロードし、require ステートメントを置き換えて、ロード時に実行されます。必要なときに実行され、毎回実行されます。これらの _once 構造はすべて、複数回書き込まれた場合に 1 回だけ実行されることを意味します。

3. フレームワーク内の設定変数は、専用の設定ファイルを使用して保存されます。ここでは、TP の配列の戻りメソッドを模倣し、compileConf() 関数を使用して配列を解析し、配列のキーを定数として定義します。配列の値として。

リーリー

名前空間と自動読み込み

なぜ名前空間と自動読み込みを組み合わせるのですか?

PHPプロジェクトでは、クラスが多い場合、クラス名が重複すると混乱が生じますし、同じフォルダ内に同じ名前のファイルが存在できないので、この時に名前空間とフォルダが一緒に活躍します。私の理解では、フォルダーは 1 つずつのボックスであり、名前空間はラベルのようなもので、ボックスはラベルに対応します。クラスを定義するときは、さまざまなクラスを異なるボックスに入れ、対応するラベルを付けます。クラスを自動的にロードする場合、ラベル (名前空間) に基づいて対応するボックス (フォルダー) を簡単に見つけ、対応するクラス ファイルを見つけることができます。

クラスの自動ロードに関しては、__autoload() マジック関数が知られています。これは、現在のパスに見つからないオブジェクトをインスタンス化するときに、渡されたクラス名に従って、対応するクラス ファイルが自動的に呼び出されます。関数本体にロードされます。

现在我们多用spl_autoload_register()函数,它可以注册多个函数来代替__autoload函数的功能,我们传入一个函数名为参数,spl_autoload_register会将这个函数压入栈中,在实例化一个当前路径内找不到的类时,系统将会将函数出栈依次调用,直到实例化成功。

spl_autoload_register('Sqier\Loader::autoLoad'); class Loader { public static function autoLoad($class) { //如果有的话,去除类最左侧的\ $class = ltrim($class, '\\'); //获取类的路径全名 $class_path = str_replace('\\', '/', $class) . EXT; if (file_exists(SYS_PATH . $class_path)) { include SYS_PATH . $class_path; return; } if (file_exists(APP_PATH . $class_path)) { include APP_PATH . $class_path; return; } } 
ログイン後にコピー

现在Loader类还是一个简单的类,待以后慢慢完善。


路由选择

接下来就是路由选择了,其本质是根据当前定义的全局URL模式选择合适的方法来分析传入的URI,加载对应的类,并实现对应的方法。

class Router { public static $uri; public static function bootstrap() { self::$uri = $_SERVER['REQUEST_URI']; switch (URL_MODE) { case 1: { self::rBoot(); break; } default: { self::rBoot(); } } } public static function rBoot() { $router = isset($_GET['r']) ? explode('/', $_GET['r']) : [ 'index', 'index' ]; $cName = 'Controller\\' . ucfirst($router[0]); $aName = isset($router[1]) ? strtolower($router[1]) . 'Action' : 'indexAction'; $controller = new $cName(); $controller->$aName(); } } 
ログイン後にコピー

这样,我在地址栏输入 zbs.com/index.php?r=index/login 后,系统会自动调用/app/Controller/Index.php下的login方法。完成了这么一个简单的路由。


后续

接下来我会优化现有的工具类,添加显示层,添加数据库类,还会将一些别的框架里非常cool的功能移植进来~

待续...

www.bkjia.com true http://www.bkjia.com/PHPjc/1114479.html TechArticle 搭建自己的PHP框架心得(一),搭建php框架心得 前言 说到写PHP的MVC框架,大家想到的第一个词--造轮子,是的,一个还没有深厚功力的程序...
関連ラベル:
php
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!