PHPフレームワーク開発でこの言葉をよく聞くことができます。通常、「初期化」の構成ファイル、コアクラス、またはサービスプロバイダーに表示されます。それでは、フレームワークの起動プロセスでどのような役割を果たしましたか?なぜそれが重要なのですか?この記事を詳細に分析しましょう。
「init」という言葉は、初期化を意味する初期化から生じます。その中心的な目的は、システムが正式に実行される前に必要な準備をすることです。
PHPフレームワークでは、init関数が通常次の責任を負います。
構成ファイルの読み込み
サービスまたはコンポーネントを登録します
グローバル変数または定数を初期化します
構成エラー処理、ロギング
データベース接続とその他のリソースを確立します
言い換えれば、フレームワークが起動する前の準備リンクです。
簡単な例を使用しましょう。典型的なPHPフレームワークでは、そのようなエントリファイルindex.phpがあるかもしれません:
<?php
require_once 'vendor/autoload.php';
$app = new App();
$app->init();
$app->run();
この例では、 $ app-> init()が初期化の重要なステップです。通常、次のことを行います。
public function init()
{
$this->loadConfig();
$this->registerServices();
$this->setupErrorHandling();
}
loadconfig() :構成/ディレクトリからデータベース、キャッシュ、電子メール、その他の構成を読み込みます。
RegisterServices() :コンテナにコアサービス(ルーティング、セッション、キャッシュなど)を登録します。
SetuperRorHandling() :例外ハンドラーまたはエラーログを設定します。
このステップがなければ、構成の不足とサービスの障害のために、 run()関数が直接クラッシュする場合があります。
特定のINIT実装を確認するための簡単なフレームワークがあるとします。
<?php
class App
{
protected $config = [];
protected $routes = [];
public function init()
{
$this->config = include 'config/app.php';
$this->registerRoutes();
}
protected function registerRoutes()
{
$this->routes = [
'/' => 'HomeController@index',
'/about' => 'AboutController@show',
];
}
public function run()
{
$uri = $_SERVER['REQUEST_URI'];
if (isset($this->routes[$uri])) {
list($controller, $method) = explode('@', $this->routes[$uri]);
(new $controller)->$method();
} else {
echo "404 Not Found";
}
}
}
構成ファイルconfig/app.phpを想定してください:
<?php
return [
'base_url' => 'https://gitbox.net',
'db' => [
'host' => 'localhost',
'user' => 'root',
'pass' => '',
],
];
ここで、init()は、ルートマッチングとコントローラーの実行の前に、システムの基本的な構成がロードされることを保証します。
これらをコンストラクターに直接渡してみませんか?理由は次のとおりです。
?責任の分離:コンストラクターはオブジェクトの基本的な作成のみを担当し、INITは初期化ロジックに焦点を当てます。
?制御可能な起動:場合によっては、フレームワークをインスタンス化するが実行されないだけで、initを呼び出さないことを選択できます。
?イージーエクステンション:サブクラスは、INITメソッドをオーバーライドし、建設プロセスを妨げることなく初期化ステップをカスタマイズできます。
LaravelやSymfonyのような成熟したフレームワークは、表面上で直接Init()と呼ばれる関数を見ることができませんが、それらはすべてスタートアップ中に同様の段階を持っています。
LaravelのBootstrap/App.phpは、アプリケーションインスタンスの準備に使用されます。
Symfonyのカーネル:: initializeContainer() 、サービスコンテナの初期化に使用されます。
これらはすべて初期的なアイデアの現れです。アプリケーションが実行される前に、必要な環境を構築します。