6

これに対する答えを見つけるのに苦労しています。確かに目の前にあると思いますが、まとめることはできません。

    //Global Variables
    global $GLOBAL;
    $GLOBAL['myPluginPath'] = dirname( __FILE__ );


    //Main Object   
    class My_Class {

            public function __construct() {

                    // Initialize Settings
                    require_once $GLOBAL['myPluginPath'] . '/settings.php';
                    $My_Settings = new My_Settings();

            } 
     }

変数を使用して、コードがより整理されているように感じられるようにします。パスがこのように定義されていると、コードが読みやすくなり、必要に応じてコード全体に適用されるように変数を変更しやすくなります。

これをメソッド内に記述することで、変数を機能させることができます。

    public function WhatEverFunc() {
        global $GLOBAL
        require_once $GLOBAL['myPluginPath'] . '/settings.php'; 
   }

ここでの主な質問は、これが悪い習慣であるかどうか疑問に思っています。そうでない場合は、global $GLOBAL各メソッド内で定義するよりも良い方法があります。ただし、それが悪い習慣である場合は、良い習慣を教えてもらえますか?

もう一つ、とても気になっていることがあります。メインの内部では、それがなくても機能するため__construct使用していませんglobal $GLOBALが、そのrequire_onceファイルの内部には、内部で使用する必要があるメソッドを持つ別のクラスがありglobal $GLOBALます。誰かがそれを説明できることを願っています。

これは悪い習慣だと言う人もいると思います。シングルトンパターン(悪い習慣)とグローバルパターンがあることを読みました。上記で何をしたかわかりませんが、私が達成しようとしていることでここで何をすべきかについて少し迷っています。

4

4 に答える 4

9

オブジェクトには、設計された機能を実行するために必要なものがすべて含まれている必要があります。そうでない場合は、データをパラメーターを介して渡す必要があります。

オブジェクトと手続き型コードの全体的なポイントの一部は、オブジェクトが何度も多くの場所で再利用できるということです。

Globals と OOP を使用することがなぜ悪い考えなのか、次の例を使用してみましょう。

優れたフロントエンド コードがあり、それをすべてオブジェクトを介して記述したとします。将来的には、サイト内のデータに関する追加のレポートを作成する必要があります。コードを書き始めて、フロントからクラスを再利用して、必要なほとんどすべてを実現できることに気付きますが、残念なことに、コードには、特定のスクリプトから呼び出された場合にフロントエンドでのみ表示されるグローバルへの参照が多数含まれています。

それは基本的に、オブジェクトを再利用できなくするだけです。

$GETおそらくベスト プラクティスではありませんが、さまざまな$_POST変数や、URL パラメーターなどの「グローバル」と見なされる可能性のあるその他の変数を取得する簡単なクラスをよく作成し、コードでこの情報を渡します。必要に応じてオブジェクト/関数に直接渡すか、実際にオブジェクト全体を渡します (ほとんどありません)。

このアプローチを使用することで、オブジェクトはすべて params で必要とされるため、オブジェクトが機能するために必要なものを正確に把握して、いつでも完全にオブジェクトを再利用する準備が整います。

于 2013-09-16T04:19:13.910 に答える
4

$GLOBALSを使用しないのはなぜですか? globalキーワードを使用する必要さえありません。

ここでの主な質問は、これが悪い習慣であるかどうか疑問に思っています

まあ、ほとんどの人は、グローバルな状態を持つことは悪い習慣だと言うと思います。なぜなら、管理や単体テストを行うのが難しいからです。ほとんどの人は、グローバル状態に依存する代わりに、クラスが必要とするものを直接注入する必要がある「依存性注入」を使用することをお勧めします。

于 2013-09-16T04:01:44.980 に答える
-3

この例を使用して問題を解決してください

global キーワードは、あなたが思っているようには機能しません。変数にグローバルスコープを持たせることはありません。外側のスコープで変数を使用することを呼び出す関数に指定するだけです。

例えば:

$a="test";

function something() {
    global $a;
    echo $a;  //Outputs: test
}

クラス内からアクセスできるように変数をグローバルにしたい場合は、$GLOBALS スーパーグローバルを使用する必要があります。

于 2013-09-16T04:06:29.103 に答える