PHP 用の MVC フレームワークを書くことになると、誰もが最初に思い浮かべる言葉は「ホイールを作る」ということでしょう。深いスキルを持たないプログラマーは、マスターが書いた PHP フレームワークほど優れたものではないでしょう。 . 時間とさまざまなプロジェクトによってテストされてきたフレームワーク。それでも準備をして実行したのは、主な理由:
ということで、今回のホイール作りの目的はホイールを作ることではなく、ホイールの作り方に慣れ、ホイールの特徴をまとめ、ホイールをより良く使うことです。
完全な 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会将这个函数压入栈中,在实例化一个当前路径内找不到的类时,系统将会将函数出栈依次调用,直到实例化成功。
<code>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; } } </code>
现在Loader类还是一个简单的类,待以后慢慢完善。
接下来就是路由选择了,其本质是根据当前定义的全局URL模式选择合适的方法来分析传入的URI,加载对应的类,并实现对应的方法。
<code>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(); } } </code>
这样,我在地址栏输入 zbs.com/index.php?r=index/login 后,系统会自动调用/app/Controller/Index.php下的login方法。完成了这么一个简单的路由。
接下来我会优化现有的工具类,添加显示层,添加数据库类,还会将一些别的框架里非常cool的功能移植进来~
待续...