Call Time Pass リファレンスとは何ですか? それは何をするためのものか?
5 に答える
呼び出し時間参照を使用させないことの問題は、php の組み込み関数の宣言を変更できないことです。組み込み関数で多くの呼び出し時間参照を使用してきました。これらの関数が何をするかを正確に知っています。いたずらが起こらないことを知っています。機能を使用する必要があり、これらの関数を書き直すことはできません。また、常に参照渡しする必要があるとは限りません。たとえば、特定の状況で必要です。
$rows[] = array_map('array_shift', &$data);
array_map
foreach ステートメントを実行する代わりに、 with および array shift をコールバックとして実行することで、時間を節約し、行をコーディングしarray_shift
ます。参照された値を取得し、参照によって取得されない別の関数でそれをスローすると、参照は1つのレベルでのみ機能するため、参照が失われます.phpにこの参照ではなく実際のポインターがあればいいのに)したがって、渡す必要があります呼び出し時の参照による配列。
もう一つの例
new ArrayObject(&$_POST, ArrayObject::ARRAY_AS_PROPS)
私my $_POST
は配列オブジェクトとして欲しいのですが、何かを設定解除した場合、実際の でそれが起こるようにしたいので、 and$_POST
で行うことができます。この場合、自分が何をしているのかを知っています。それを行う代わりに、参照によって配列を取得する独自のオブジェクトを作成する必要があり、それで時間を失いました....$_SESSION
$_GET
要点は、そこにあるどの言語でも、そもそもポインターを受け取るように設計されていない関数にポインターを渡すことを許可しているということです。おそらくそれは悪い習慣ですが、それを決めるのは私次第ですよね?
この機能は廃止されるべきではありません。
Call Time Pass By Reference という意味だと思います。
PHP では、&
オペレーターは変数の参照を取得します (これについては、stackoverflow に多くの情報があります)。
呼び出し時の参照渡しは、参照を取らない関数への引数として参照を渡す場所です
function foo($myParam){
}
//Call Time Pass By Reference
foo(&$myArg);
PHP 5.3 では廃止され、値で渡されるため、警告が表示されます。それを行う正しい方法は、参照を取るように関数 foo を変更することです
function foo(&$myParam){
}
foo($myArg); //myArg is passed by reference
呼び出し時の参照渡しを実行する機能は、ini 設定によって制御されます。
allow_call_time_pass_reference
最近のリリースでは、これはデフォルトでオフになっています。
それが悪い理由は、関数 (およびリーダー) が、どのパラメーターが参照であり、どのパラメーターが参照でないかを認識していないためです。コードをたどるのがずっと難しくなります。
PHP のマニュアルでは次のように説明されています。
現在、参照は次のような関数宣言で宣言されています。
function foo (&$bar) {
// changing $bar changes the original variable
}
ただし、この構文では、関数を呼び出すときに参照によって変数を渡すこともできます。
foo(&$bar);
スタイルが悪く、エラーが発生しやすいと見なされるため、これは非推奨です。(関数が知らない場合、それがコピーまたは元の変数に作用する場合、何らかの問題が発生していると考えることができます。)
後者は、関数呼び出し時に参照が渡されるため、呼び出し時参照渡しと呼ばれます。(ふむ……トートロジー部の第一ルールは、トートロジー部の第一ルールだ。)
PHPでは、値を関数に渡すと、関数が使用するためにコピーされるため、関数の外では値はそのままです。これを値渡しと呼びます。関数内の値を変更する場合は、参照渡しを行います (値自体ではなく、値へのポインターを渡します)。I PHP これは&
文字を使用して行われます。
$a = 1;
function b($a) {
$a + 1;
echo $a;
}
echo $a; // print 1
echo b($a); // print 2
echo $a; // $a is still 1
echo b(& $a); // print 2
echo $a; // $a is now 2
参照を渡したい場合、PHP でそれを行うには 2 つの方法があり、そのうちの 1 つ (call-time) は非推奨です。
呼び出し時の参照渡し:
b(& $a);
代わりにすべきことは、関数宣言を変更して&
そこに追加することです。
// declare reference parameter
function b(& $a) {
...
}
b($a); // pass by reference