php function定義時の関数名に&記号を付ける意味
2738 ワード
たくさんの招待状を见て、しかしすべて理解することができなくて、また多くの资料を见て、ついに名が明らかになりました.メモをとる
質問:phpは関数を宣言する時、関数名の前の&記号は何の役に立ちますか?
ずっと納得できなかった.多くの投稿は変数の$a=&$bに似ていると言っていますが、$bは宣言するときに前に&記号をつけていませんか?では、この関数名の前に&を付けると何の役に立ちますか?
多くの人が見ているのはネット上の例ですが、まずネット上の例を使ってみてください.
これは何も見えません.$aは関数testの参照ですか.では続きます
すなわち、$aがtest関数の参照である場合、echo$aは再び関数を呼び出し、$bの値は再び1を加算する.
しかし、$aの値は変化する、すなわち、$aはtest関数が返す値の参照、すなわち$bの参照を保持する.だから$a=&$bに相当する.
そのため、関数の結果への参照を実現するには、次の手順に従います.
1.引用を付与するときはtestの前に&
2.宣言時に関数名を&と付け、関数の実行結果を返す参照を表す
3.同時に関数には戻り値が必要で、くだらない話、戻り値がないのは誰を引用しますか?
曖昧さのない例を挙げます.
function &abc($n){
$arr=array('aaa','bbb','ccc');
return$arr[$n];//配列の2番目の要素を返す
}
$tem=&abc(1);//ここでは配列の2番目の要素の参照しか得られません.2番目の要素のみが返されるためです.
$tem='ddd';//配列の2番目の要素の値を「ddd」に変更
もっと理解しやすいのではないでしょうか.
この特徴は一般的に大きな文字列など、比較的空間を占める値を返すために使われていますが、phpの書き込み時に特徴をコピーするため、このテクニックは一般的にあまり使われていません.
しかし、関数の演算結果を即時に修正する必要がある場合は、このテクニックを使用することができます.
質問:phpは関数を宣言する時、関数名の前の&記号は何の役に立ちますか?
ずっと納得できなかった.多くの投稿は変数の$a=&$bに似ていると言っていますが、$bは宣言するときに前に&記号をつけていませんか?では、この関数名の前に&を付けると何の役に立ちますか?
多くの人が見ているのはネット上の例ですが、まずネット上の例を使ってみてください.
function
&test(){
static
$b
= 0;
//
$b
=
$b
+1;
return
$b
;
}
$a
= test();
// $b :1
$a
= 5;
$a
= test();
// $b :2
$a
= &test();
// $b :3
$a
= 5;
//$b 5
$a
= test();
// $b :6
これは何も見えません.$aは関数testの参照ですか.では続きます
function
&test(){
static
$b
= 0;
//
$b
=
$b
+1;
return
$b
;
}
$a
= test();
// $b :1
$a
= 5;
$a
= test();
// $b :2
$a
= &test();
// $b :3
echo $a; // $b 3
すなわち、$aがtest関数の参照である場合、echo$aは再び関数を呼び出し、$bの値は再び1を加算する.
しかし、$aの値は変化する、すなわち、$aはtest関数が返す値の参照、すなわち$bの参照を保持する.だから$a=&$bに相当する.
そのため、関数の結果への参照を実現するには、次の手順に従います.
1.引用を付与するときはtestの前に&
2.宣言時に関数名を&と付け、関数の実行結果を返す参照を表す
3.同時に関数には戻り値が必要で、くだらない話、戻り値がないのは誰を引用しますか?
曖昧さのない例を挙げます.
function &abc($n){
$arr=array('aaa','bbb','ccc');
return$arr[$n];//配列の2番目の要素を返す
}
$tem=&abc(1);//ここでは配列の2番目の要素の参照しか得られません.2番目の要素のみが返されるためです.
$tem='ddd';//配列の2番目の要素の値を「ddd」に変更
もっと理解しやすいのではないでしょうか.
この特徴は一般的に大きな文字列など、比較的空間を占める値を返すために使われていますが、phpの書き込み時に特徴をコピーするため、このテクニックは一般的にあまり使われていません.
しかし、関数の演算結果を即時に修正する必要がある場合は、このテクニックを使用することができます.