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