1. スコープの問題を解決します
前のセクションでは、PHP の関数のスコープについて説明しました。クラスだけでは問題を説明できない場合は、この記事のスコープの例の方がわかりやすいかもしれません。
では、PHP 関数で外部変数にアクセスするにはどうすればよいでしょうか?
PHP にはグローバル スコープと呼ばれる概念があります。つまり、関数を使用しない場合 (将来クラスの概念が登場する予定です)、作成した変数にはページ上のどこからでもアクセスできます。では、関数本体の問題をどのように解決すればよいでしょうか?
グローバルキーワードを使用できます:
<span style="COLOR: blue"><?</SPAN><SPAN style="COLOR: maroon">php </SPAN>$<SPAN style="COLOR: red">name</SPAN><SPAN style="COLOR: blue">="kym"</SPAN>; <SPAN style="COLOR: red">function Test</SPAN>() { <SPAN style="COLOR: red">global </SPAN>$<SPAN style="COLOR: red">name</SPAN>; <SPAN style="COLOR: red">echo</SPAN>($<SPAN style="COLOR: red">name</SPAN>); } <SPAN style="COLOR: red">Test</SPAN>(); <SPAN style="COLOR: blue">?> </span>
この場合、$name 変数を再作成することなく、グローバル変数 $name への参照を取得するのと同じです。
PHP マニュアルには次のような言葉があります: グローバル変数を使用することは、$GLOBALS 変数に変数への参照を作成することと同じです。次に、このセマンティクスを模倣して、次のようなコードを書くことができます:
<span style="COLOR: blue"><?</SPAN><SPAN style="COLOR: maroon">php </SPAN>$<SPAN style="COLOR: red">name</SPAN><SPAN style="COLOR: blue">="kym"</SPAN>; <SPAN style="COLOR: red">function Test</SPAN>() { $<SPAN style="COLOR: red">temp</SPAN><SPAN style="COLOR: blue">=&$GLOBALS["</SPAN><SPAN style="COLOR: red">name</SPAN><SPAN style="COLOR: blue">"]; echo($temp); } Test(); ?> </span>
実際、これら 2 つは同等のコードです。このように変数を使用するのは面倒に思えますが、実際にはこれにより多くの副作用が回避されます。たとえば、Java と C# はオブジェクト指向言語ですが、PHP ではすべてが 1 つのページ、または複数のページに収まります。この方法を使用すると、関数の副作用 (偶発的な変更) が発生しやすくなります。
2. デフォルトパラメータ
この概念を初めて聞いたのはおそらく C++ でした。C# を学んだ後は、この概念に触れたことはありませんでしたが、今でもこの機能がとても気に入っています。
これにより、関数に対して面倒なオーバーロードされた関数を大量に記述する必要がなくなります。
最も単純な例を書いてください:
<span style="COLOR: blue"><?</SPAN><SPAN style="COLOR: maroon">php </SPAN><SPAN style="COLOR: red">function Test</SPAN>($<SPAN style="COLOR: red">name</SPAN><SPAN style="COLOR: blue">="kym"</SPAN>) { <SPAN style="COLOR: red">echo</SPAN>($<SPAN style="COLOR: red">name</SPAN>); } <SPAN style="COLOR: red">Test</SPAN>(); <SPAN style="COLOR: red">Test</SPAN>(<SPAN style="COLOR: blue">"others"</SPAN>); <SPAN style="COLOR: blue">?> </span>
オーバーロードされた関数を記述する必要はもうありませんか?
ただし、ここで注意すべきことが 2 つあります:
A. パラメータのデフォルト値を設定する場合、最も単純な定数のみを設定でき、複雑な式を含めることはできません。
B. デフォルト値が必要なパラメータは最後に配置する必要があります。これは、C# の変数パラメーターに似ています。
3. 可変パラメータ
C# には、変数パラメーターと呼ばれる概念があります。簡単な例を書いてみましょう:
<span style="COLOR: blue">protected void </span>LinkButton1_Click(<span style="COLOR: blue">object </span>sender, <span style="COLOR: #2b91af">EventArgs </span>e) { Response.Write(GetSum(1, 2, 3, 4, 5)); } <span style="COLOR: blue">public int </span>GetSum(<span style="COLOR: blue">params int</span>[] elements) { <span style="COLOR: blue">int </span>sum = 0; <span style="COLOR: blue">for </span>(<span style="COLOR: blue">int </span>i = 0; i < elements.Length; i++) { sum += elements[i]; } <SPAN style="COLOR: blue">return </SPAN>sum; }
例を書く前に、まず変数パラメーターに関連する 3 つの関数を紹介します。
func_get_args() は関数のすべてのパラメータの配列を返します
func_get_arg() はパラメータから特定の引数を返します
func_num_args() はパラメータの数を返します。
それでは、C# バージョンに対応する PHP バージョンを書きましょう。
りー
4. 変数関数
なぜこの名前に変換する必要があるのかわかりません。実際には変数の名前に基づいて対応する関数を呼び出します。
以下に示すように、は JS のこの eval に非常によく似ています:
<SPAN style="COLOR: blue"><?</SPAN><SPAN style="COLOR: maroon">php </SPAN><SPAN style="COLOR: red">function GetSum</SPAN>() { <SPAN style="COLOR: red">if</SPAN>(<SPAN style="COLOR: red">func_num_args</SPAN>()<SPAN style="COLOR: blue">=</SPAN>=0) { <SPAN style="COLOR: red">return </SPAN>0; } $<SPAN style="COLOR: red">sum</SPAN><SPAN style="COLOR: blue">=0; </SPAN><SPAN style="COLOR: red">for</SPAN>($<SPAN style="COLOR: red">i</SPAN><SPAN style="COLOR: blue">=0;$i<</SPAN><SPAN style="COLOR: maroon">func_num_args</SPAN>();$<SPAN style="COLOR: red">i</SPAN>++) { $<SPAN style="COLOR: red">sum</SPAN>+<SPAN style="COLOR: blue">=func_get_arg($i); </SPAN>} <SPAN style="COLOR: red">return </SPAN>$<SPAN style="COLOR: red">sum</SPAN>; } <SPAN style="COLOR: red">echo</SPAN>(<SPAN style="COLOR: red">GetSum</SPAN>(1,2,3,4)); ?<SPAN style="COLOR: blue">>
これは、関数名を渡して、対応する関数を実行します。 PHP でも、実際には同じであり、より単純です。
りー 。