PHPでは、関数のパラメーターの数は動的であり、さまざまな数のパラメーターをさまざまな方法で渡すことができます。ただし、関数を呼び出すと、渡されたパラメーターの数が関数の期待を満たさない場合、「境界のないパラメーター」エラーにつながり、プログラムの安定性と動作効率に影響を与える可能性があります。この問題を回避するために、 func_num_args()関数を使用して、パラメーターの数のセキュリティチェックを実行できます。
func_num_args()は、現在の関数呼び出しで渡されるパラメーターの数を取得する内蔵PHP関数です。関数定義中にいくつのパラメーターが宣言されていても、 FUNC_NUM_ARGS()は実際のパスパラメーターの数を返します。
関数プロトタイプ:
<span><span><span class="hljs-keyword">int</span></span><span> </span><span><span class="hljs-title function_ invoke__">func_num_args</span></span><span>();
</span></span>
戻り値は、現在の関数に渡された実際のパラメーターの数を表す整数です。
加算の合計を計算する単純な関数があり、関数が2つのパラメーターをとると予想されるとします。
<span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">add</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$a</span></span></span><span>, </span><span><span class="hljs-variable">$b</span></span><span>) {
</span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-variable">$a</span></span><span> + </span><span><span class="hljs-variable">$b</span></span><span>;
}
</span></span>
コール中に2つ以上のパラメーターが渡される場合、パラメーターエラーが発生する場合があります。これを避けるために、 func_num_args()を使用して確認できます。
<span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">safe_add</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$a</span></span></span><span> = </span><span><span class="hljs-literal">null</span></span><span>, </span><span><span class="hljs-variable">$b</span></span><span> = </span><span><span class="hljs-literal">null</span></span><span>) {
</span><span><span class="hljs-comment">// 現在の関数で渡されるパラメーターの数を取得します</span></span><span>
</span><span><span class="hljs-variable">$num_args</span></span><span> = </span><span><span class="hljs-title function_ invoke__">func_num_args</span></span><span>();
</span><span><span class="hljs-comment">// 十分なパラメーターが渡されたかどうかを判断します</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$num_args</span></span><span> < </span><span><span class="hljs-number">2</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"間違い:少なくとも2つのパラメーターが必要です!"</span></span><span>;
</span><span><span class="hljs-keyword">return</span></span><span>;
}
</span><span><span class="hljs-comment">// 追加を実行します</span></span><span>
</span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-variable">$a</span></span><span> + </span><span><span class="hljs-variable">$b</span></span><span>;
}
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-title function_ invoke__">safe_add</span></span><span>(</span><span><span class="hljs-number">5</span></span><span>, </span><span><span class="hljs-number">3</span></span><span>); </span><span><span class="hljs-comment">// 出力 8</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-title function_ invoke__">safe_add</span></span><span>(</span><span><span class="hljs-number">5</span></span><span>); </span><span><span class="hljs-comment">// 出力 間違い:少なくとも2つのパラメーターが必要です!</span></span><span>
</span></span>
この例では、 SAFE_ADD関数は最初にFUNC_NUM_ARGS()を介して着信パラメーターの数をチェックし、2つ未満のパラメーターがある場合、エラーメッセージは出力です。
PHPを使用すると、関数が可変数のパラメーターを受信し、 func_get_args()を使用してすべての着信パラメーターを取得できます。 func_num_args()を組み合わせて、これらのパラメーターをより柔軟に処理して、パラメーターが交差する状況を回避できます。
たとえば、任意の数のパラメーターを取得し、すべてのパラメーターの合計を返す追加関数を書き込むことができます。
<span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">sum</span></span><span>(</span><span><span class="hljs-params"></span></span><span>) {
</span><span><span class="hljs-variable">$num_args</span></span><span> = </span><span><span class="hljs-title function_ invoke__">func_num_args</span></span><span>(); </span><span><span class="hljs-comment">// 合格したパラメーターの数を取得します</span></span><span>
</span><span><span class="hljs-variable">$args</span></span><span> = </span><span><span class="hljs-title function_ invoke__">func_get_args</span></span><span>(); </span><span><span class="hljs-comment">// 渡されたすべてのパラメーターを取得します</span></span><span>
</span><span><span class="hljs-variable">$total</span></span><span> = </span><span><span class="hljs-number">0</span></span><span>;
</span><span><span class="hljs-comment">// すべてのパラメーターと合計を繰り返します</span></span><span>
</span><span><span class="hljs-keyword">for</span></span><span> (</span><span><span class="hljs-variable">$i</span></span><span> = </span><span><span class="hljs-number">0</span></span><span>; </span><span><span class="hljs-variable">$i</span></span><span> < </span><span><span class="hljs-variable">$num_args</span></span><span>; </span><span><span class="hljs-variable">$i</span></span><span>++) {
</span><span><span class="hljs-variable">$total</span></span><span> += </span><span><span class="hljs-variable">$args</span></span><span>[</span><span><span class="hljs-variable">$i</span></span><span>];
}
</span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-variable">$total</span></span><span>;
}
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-title function_ invoke__">sum</span></span><span>(</span><span><span class="hljs-number">1</span></span><span>, </span><span><span class="hljs-number">2</span></span><span>, </span><span><span class="hljs-number">3</span></span><span>); </span><span><span class="hljs-comment">// 出力 6</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-title function_ invoke__">sum</span></span><span>(</span><span><span class="hljs-number">1</span></span><span>, </span><span><span class="hljs-number">2</span></span><span>, </span><span><span class="hljs-number">3</span></span><span>, </span><span><span class="hljs-number">4</span></span><span>, </span><span><span class="hljs-number">5</span></span><span>); </span><span><span class="hljs-comment">// 出力 15</span></span><span>
</span></span>
上記のコードでは、合計関数は任意の数のパラメーターを受け入れることができます。まず、 func_num_args()を使用してパラメーターの数を取得し、 func_get_args()を使用してすべてのパラメーターを取得し、最終的に合計します。
実際の開発では、プログラマーはしばしばパラメーターの数のチェックを無視し、関数を実行するときに「境界外のパラメーター」のエラーをもたらします。一般的なエラーシナリオは次のとおりです。
必要なパラメーターが欠落しています。関数が特定の数のパラメーターを予想する場合、呼び出されたときに十分なパラメーターが渡されない場合、予測不可能な動作またはランタイムエラーが発生する可能性があります。
冗長パラメーターの渡し:関数が冗長パラメーターを処理する準備ができていない場合、エラーやパフォーマンスの問題を引き起こす可能性があります。
func_num_args()を使用すると、関数内でセキュリティチェックを実行して、これらのエラーを回避できます。たとえば、関数が3つのパラメーターを受信する必要があるが、2つまたは4つで渡される必要があると仮定します。プログラムは、直接実行し続けるのではなく、すぐにフィードバックエラーをする必要があります。
func_num_args()関数を使用して、PHPで関数に渡されたパラメーターの数を効果的にチェックして、範囲外のパラメーターによって引き起こされるエラーを回避できます。このようにして、コードの堅牢性を改善し、機能が実行時に異なる数のパラメーターを正しく処理できるようにすることができます。さらに、 func_get_args()と組み合わせることで、可変パラメーターを簡単に処理でき、プログラムの柔軟なスケーラビリティを提供できます。
PHP機能を作成する場合、適切なパラメーター数量チェック習慣を開発することは、「パラメーターの国境」エラーを回避するためのシンプルで効果的な方法です。