3

私は CodeIgniter のフレームワーク構造を理解しようとしていますが、始めたばかりで、この小さな誤解を思いつきました。

誰かが次のことを理解するのを手伝ってくれませんか:-

1-なぜ彼らは参照を使用してクラスのインスタンスを渡すのですか...つまり、単純な変数だけではないのですか?

2-そして、関数がクラスの名前を「文字列変数」ではなく配列に保存するのはなぜですか(私のphp用語を最悪だと判断しないでください).. ?!

static $_classes = array();
                   ^^^^^^^ this cloud be just ("") or am i missing something

ここに関数があるので、探しに行く必要はありません。

function &load_class($class, $directory = 'libraries', $prefix = 'CI_')
    {
        static $_classes = array();

        // Does the class exist?  If so, we're done...
        if (isset($_classes[$class]))
        {
            return $_classes[$class];
        }

        $name = FALSE;

        // Look for the class first in the local application/libraries folder
        // then in the native system/libraries folder
        foreach (array(APPPATH, BASEPATH) as $path)
        {
            if (file_exists($path.$directory.'/'.$class.'.php'))
            {
                $name = $prefix.$class;

                if (class_exists($name) === FALSE)
                {
                    require($path.$directory.'/'.$class.'.php');
                }

                break;
            }
        }

        // Is the request a class extension?  If so we load it too
        if (file_exists(APPPATH.$directory.'/'.config_item('subclass_prefix').$class.'.php'))
        {
            $name = config_item('subclass_prefix').$class;

            if (class_exists($name) === FALSE)
            {
                require(APPPATH.$directory.'/'.config_item('subclass_prefix').$class.'.php');
            }
        }

        // Did we find the class?
        if ($name === FALSE)
        {
            // Note: We use exit() rather then show_error() in order to avoid a
            // self-referencing loop with the Excptions class
            exit('Unable to locate the specified class: '.$class.'.php');
        }

        // Keep track of what we just loaded
        is_loaded($class);

        $_classes[$class] = new $name();
        return $_classes[$class];
    }
4

2 に答える 2

7

キーはstaticキーワード before$_classes = array();です。これにより、$_classes配列は関数への複数の呼び出しの間に値を保持します。基本的に、インスタンス化されたクラスのローカル キャッシュとして使用します。この目的では、文字列は機能しません。

マニュアルの static キーワードの詳細を参照してください。

戻ってきた参照については、php4 の荷物だと思います。CI は 2.x まで php4 でサポートされていました。このブログ投稿は、 php4から php5 への変更点を確認するのに役立つ場合があります。

于 2012-08-18T11:44:59.597 に答える
1

通常の (参照ではない) 変数を渡すと、それを渡すたびに前のインスタンスが上書きされ、最後のインスタンスまたは最新のインスタンスが引き継がれるため、機能しているように見えます。したがって、新しいクラス インスタンスを作成するたびに。しかし、それは2つの理由で無駄です...

  1. 以前のインスタンス変数を設定解除せずに新しいインスタンス変数を作成します (最終的には PHP がそれらをガベージ コレクションします)。そのため、悪意のあるコードによって読み取られ、貴重なサーバー スペースで数バイトが浪費されるリスクを回避できます。為に。

  2. インスタンスは状態を意味します。「入力」の状態、「セキュリティ」の状態、「構成」の状態など。新しい変数を作成すると、それらの状態のコピーが作成されます。たまたま間違いを犯した場合、1 つの「入力」インスタンスに保持されている現在の状態は、現在または最新の状態を反映するように変更されない場合があります。もう一方が変更されたとします。両方を異なる機会に使用すると、次のステップで競合や災害につながる可能性があります.

于 2016-04-26T15:45:40.360 に答える