新しい大規模な PHP プログラムを開発する場合でも、一部のデータはコードのさまざまな部分で使用する必要があるため、必然的にグローバル データを使用することになります。一般的なグローバル データには、プログラム設定クラス、データベース接続クラス、ユーザー情報などが含まれます。このデータをグローバル データにする方法は数多くありますが、最も一般的に使用される方法は、「global」キーワード宣言を使用することです。これについては、この記事の後半で詳しく説明します。
「global」キーワードを使用してグローバル データを宣言する唯一の欠点は、これが実際には非常に不適切なプログラミング方法であり、グローバル データによってコードが分離されるため、後でプログラムでより大きな問題が発生することがよくあることです。相互にリンクされているため、コードの一部を変更すると、他の部分に問題が発生する可能性があります。したがって、コード内に多くのグローバル変数がある場合、プログラム全体の保守が困難になります。
この記事では、さまざまな手法や設計パターンを通じてこのグローバル変数の問題を防ぐ方法を説明します。もちろん、最初にグローバル データに「global」キーワードを使用する方法とその仕組みを見てみましょう。グローバル変数と「global」キーワードを使用します
PHP はデフォルトでいくつかの「スーパーグローバル」変数を定義します。これらの変数は自動的にグローバル化され、$_GET や $_REQUEST など、プログラム内のどこからでも呼び出すことができます。通常、これらの変数はデータまたはその他の外部データから取得されますが、これらの変数は基本的に書き込み可能ではないため、通常は使用しても問題は発生しません。
ただし、独自のグローバル変数を使用することもできます。キーワード「global」を使用すると、グローバル データを関数のローカル スコープにインポートできます。 「変数の使用範囲」がわからない場合は、PHP マニュアルの該当する説明を参照してください。
「global」キーワードを使用したデモンストレーションの例を次に示します:
以下、引用内容です
以下、引用内容です
<?php
$my_var = 'Hello World';
test_global();
関数 test_global() {
// 現在ローカルスコープ内にあります
// $my_var 変数は存在しません
// エラーが発生します: "未定義の変数: my_var"
エコー $my_var;
// 次に、変数を重要視しましょう
グローバル $my_var;
// 作品:
エコー $my_var;
}
?>
上の例でわかるように、「global」キーワードはグローバル変数をインポートするために使用されます。うまく機能し、シンプルであるように見えますが、グローバル データを定義するために「global」キーワードを使用することをなぜ心配するのでしょうか?
これには 3 つの理由があります:
1. コードの再利用はほぼ不可能です
関数がグローバル変数に依存している場合、この関数を異なる環境で使用することはほとんど不可能です。もう 1 つの問題は、この関数を抽出して他のコードで使用できないことです。
2. デバッグと問題解決は非常に難しいです
グローバル変数を追跡することは、非グローバル変数を追跡することよりもはるかに困難です。グローバル変数は、不明瞭なインクルード ファイルで再定義されている可能性があり、非常に優れたプログラム エディタ (または IDE) を使用していても、問題を発見するまでに数時間かかる場合があります。
3. これらのコードを理解するのは非常に困難です
グローバル変数がどこから来て何に使われるのかを理解するのは困難です。開発プロセス中はすべてのグローバル変数を知っているかもしれませんが、約 1 年後には、少なくとも一部のグローバル変数を忘れてしまう可能性があります。その時点で、非常に多くのグローバル変数を使用したことを後悔するでしょう。
では、グローバル変数を使用しない場合は何を使用すればよいのでしょうか?以下にいくつかの解決策を見てみましょう。
関数パラメータを使用する
グローバル変数の使用をやめる 1 つの方法は、以下に示すように、単純に変数を引数として関数に渡すことです:
以下、引用内容です
以下、引用内容です
<?php
$var = 'Hello World';
テスト ($var);
関数テスト($var) {
$var をエコーする;
}
?>
グローバル変数だけを渡す必要がある場合、これは非常に優れた、または優れたソリューションです。しかし、多くの値を渡したい場合はどうすればよいでしょうか?
たとえば、データベース クラス、プログラム設定クラス、ユーザー クラスを使用する場合。私たちのコードでは、これら 3 つのクラスはすべてのコンポーネントで使用されるため、これらをすべてのコンポーネントに渡す必要があります。関数パラメーターのアプローチを使用する場合は、次のようにする必要があります:
以下、引用内容です
以下、引用内容です
<?php
$db = 新しい DBConnection;
$settings = 新しい設定_XML;
$user = 新しいユーザー;
test($db, $settings, $user);
機能テスト(&$db、&$settings、&$user) {
// 何かをしてください
}
?>
明らかに、これには価値がありません。追加する新しいオブジェクトができたら、各関数に関数パラメータをもう 1 つ追加する必要があります。したがって、別の方法を使用してそれを解決する必要があります。