function foo () {
global $var;
// rest of code
}
私の小規模な PHP プロジェクトでは、通常は手続き型の方法を使用します。通常、システム構成を含む変数があり、関数でこの変数にアクセスする必要がある場合は、global $var;
.
これは悪い習慣ですか?
function foo () {
global $var;
// rest of code
}
私の小規模な PHP プロジェクトでは、通常は手続き型の方法を使用します。通常、システム構成を含む変数があり、関数でこの変数にアクセスする必要がある場合は、global $var;
.
これは悪い習慣ですか?
人々が他の言語でグローバル変数について話すとき、それは PHP でのそれとは異なる意味を持っています。これは、PHP では変数が実際にはグローバルではないためです。典型的な PHP プログラムのスコープは、1 つの HTTP リクエストです。セッション変数は通常、多くの HTTP リクエストを含むため、実際には PHP の「グローバル」変数よりも広いスコープを持ちます。
多くの場合 (常に?)、次のようなメソッドでメンバー関数を呼び出すことができますpreg_replace_callback()
。
preg_replace_callback('!pattern!', array($obj, 'method'), $str);
詳細については、コールバックを参照してください。
要点は、オブジェクトが PHP にボルトで固定されており、いくつかの点で扱いにくいということです。
さまざまな言語の標準や構造を PHP に適用することに過度に関心を持たないでください。もう 1 つのよくある落とし穴は、すべての上にオブジェクト モデルを貼り付けて、PHP を純粋な OOP 言語に変えようとすることです。
他のものと同様に、「グローバル」変数、手続き型コード、特定のフレームワーク、および OOP を使用するのは、理にかなっており、問題を解決し、記述する必要のあるコードの量を減らし、保守しやすく理解しやすくするためです。あなたがすべき。
グローバル変数を慎重に使用しないと、問題を見つけにくくなる可能性があります。PHP スクリプトを要求すると、関数に存在しない配列のインデックスにアクセスしようとしているという警告が表示されたとします。
アクセスしようとしている配列が関数に対してローカルである場合は、関数をチェックして、そこで間違いを犯していないかどうかを確認します。関数への入力に問題がある可能性があるため、関数が呼び出される場所を確認します。
しかし、その配列がグローバルである場合、そのグローバル変数を使用するすべての場所を確認する必要があり、それだけでなく、グローバル変数への参照がアクセスされる順序を把握する必要があります。
コードの一部にグローバル変数があると、そのコードの機能を分離することが難しくなります。なぜ機能を分離したいのですか?したがって、テストして他の場所で再利用できます。テストする必要がなく、再利用する必要のないコードがある場合は、グローバル変数を使用しても問題ありません。
受け入れられた回答に同意します。私は2つのことを追加します:
プレフィックスを使用して、すぐにグローバルとして識別できるようにします (例: $g_)
それらを 1 か所で宣言し、コード全体に散らばらないようにします。
経験、大学の学位、およびソフトウェア エンジニアリングに反対できるのは誰ですか? 私じゃない。オブジェクト指向の単一ページ PHP アプリケーションの開発では、名前空間の競合を気にせずにすべてをゼロから構築できることがわかっていると、より楽しくなります。ゼロから構築することは、多くの人がもうやらないことです。彼らには、気にかけるべき仕事、締め切り、ボーナス、または評判があります。これらのタイプは、リスクの高いビルド済みコードを大量に使用する傾向があるため、グローバル変数を使用するリスクはまったくありません。
プログラムのグローバル領域でしか使用されていなくても、グローバル変数を使用するのは悪いことかもしれませんが、ただ楽しみたい、何かを動かしたいという人たちのことを忘れないでください。
それがグローバル名前空間でいくつかの変数 (< 10) を使用することを意味する場合、それはプログラムのグローバル領域でのみ使用されます。はい、はい、MVC、依存性注入、外部コード、何とか、何とか、何とか、何とか。しかし、コードの 99.99% を名前空間とクラスに含め、外部コードをサンドボックス化した場合、グローバル変数を使用しても世界は終わりません (繰り返しますが、世界は終わりません)。
一般に、グローバル変数を使用することが悪い習慣だとは言いません。プログラムのグローバル領域の外でグローバル変数 (フラグなど) を使用すると、問題が発生し、(長期的には)その状態を簡単に見失う可能性があるため、お勧めできません。また、学習すればするほど、グローバル変数への依存度が低くなります。グローバル変数の使用に関連するバグを追跡する「喜び」を経験するからです。これだけでも、同じ問題を解決する別の方法を見つける動機になります。偶然にも、これは PHP の人々を名前空間とクラス (静的メンバーなど...) の使い方を学ぶ方向に押しやる傾向があります。
コンピュータサイエンスの分野は広大です。悪いラベルを付けてみんなを怖がらせて何かをするのをやめさせると、彼らはそのラベルの背後にある理由を真に理解する楽しさを失うことになります。
必要に応じてグローバル変数を使用しますが、それらを使用せずに問題を解決できるかどうかを確認してください。衝突、テスト、およびデバッグは、問題の単なる説明ではなく、問題の本質を詳しく理解することで、より意味のあるものになります。
として:
global $my_global;
$my_global = 'Transport me between functions';
Equals $GLOBALS['my_global']
悪い習慣です(Wordpressのように$pagenow
)...うーん
これを考慮してください:
$my-global = 'Transport me between functions';
PHPエラーですが:
$GLOBALS['my-global'] = 'Transport me between functions';
はエラーではありません。ハイフンは、のような「共通の」ユーザー宣言変数と衝突しません$pagenow
。また、大文字を使用すると、スーパーグローバルが使用されていることを示し、コード内で簡単に見つけたり、ファイル内の検索で追跡したりできます
次のように、単一のソリューションに対してすべてのクラスを構築するのが面倒な場合は、ハイフンを使用します。
$GLOBALS['PREFIX-MY-GLOBAL'] = 'Transport me ... ';
しかし、より広い用途の場合、配列として 1 つのグローバルを使用します。
$GLOBALS['PREFIX-MY-GLOBAL']['context-something'] = 'Transport me ... ';
$GLOBALS['PREFIX-MY-GLOBAL']['context-something-else']['numbers'][] = 'Transport me ... ';
後者は、データを「キャッシュ」するたびにシングルトン クラスで混乱するのではなく、「コーラ ライト」の目的または使用に関する良い実践です。私が間違っているか、ここでばかげたことを見逃している場合は、コメントしてください...