1

CodeIgniter のshow_error関数から次のコードを取得します。

$_error =& load_class('Exceptions', 'core');

関数のドキュメントにはload_class、シングルトンとして機能すると書かれています。関数は基本的に、指定されたパラメーターを受け取り、適切なパスでクラスを検索します。次に、ファイルが存在する場合はそれを含めます。関数は次のように宣言されます。

function &load_class(...)

なぜ & があり、その目的は何ですか? $_errorそのように関数を定義した結果、そのように宣言されていますか?

4

2 に答える 2

1

そのように宣言して使用する意味はありませんload_class。のソース コードから、load_class()ロードされたオブジェクトをクラス名をキーとして配列にキャッシュすることがわかります。キャッシュにない場合は、指定された名前のオブジェクトを読み込み、そのオブジェクト参照を配列に格納します。どちらの場合も、配列の要素を (参照によって) 返します。

参照によって戻ると、呼び出し元は配列の要素への参照を持つことができます。これによりできることは次のとおりです。

  1. 私たちが持っている外部参照から、その配列要素(つまり、そのキーに関連付けられた値)へのその後の変更を参照してください。ただし、load_class関数はキーに関連付けられた値を設定後に変更しないため、これは当てはまりません。
  2. load_class関数が認識しなくても、外部コードで配列内の要素を変更できるようにします。しかし、これは非常に怪しげなやり方であり、外部からキャッシュをいじることになるでしょう。

したがって、参照によって返す正当な理由はありません。私の推測では、オブジェクトが値だったときの PHP 4 の残り物であり、「オブジェクト値」を代入または返すと、それがコピーされます。PHP 5 では、オブジェクトは値ではありません。それらはオブジェクト参照を介してのみ操作でき、オブジェクト参照を値で割り当てたり返したりしても、それが指しているオブジェクトがコピーされることはありません。

于 2012-12-06T05:22:45.630 に答える
0

関数がrefrenceを返すようにマークされているにもかかわらず、PHPのドキュメントは、なぜ使用する必要があるのか​​ を説明しているようです=&function &load_class

参照を返す

参照による戻りは、関数を使用して、参照をバインドする必要がある変数を見つけたい場合に便利です。パフォーマンスを向上させるために参照渡しを使用しないでください。エンジンはこれを自動的に最適化します。正当な技術的理由がある場合にのみ、参照を返します。参照を返すには、次の構文を使用します。

 <?php class foo {
     public $value = 42;

     public function &getValue() {
         return $this->value;
     } 
  }



$obj = new foo; 
$myValue = &$obj->getValue(); // $myValue is a reference to $obj->value, which is 42.
$obj->value = 2; 
echo $myValue;
// prints the new value of $obj->value, i.e. 2. ?> 

この例では、

getValue 関数によって返されるオブジェクトのプロパティは、参照構文を使用しない場合と同様に、コピーではなく設定されます。 注: パラメーターの受け渡しとは異なり、ここでは & を両方の場所で使用する必要があります。これは、コピーではなく参照によって返すことを示し、通常の代入ではなく参照バインディングを $myValue に対して行う必要があることを示します。

一般的にどのリファレンスがドキュメントで説明されているかを尋ねている場合。

于 2012-12-05T16:31:34.980 に答える