ホームページ > php教程 > php手册 > PHP は func_get_arg、func_get_args、func_num_args を使用して擬似オーバーロードを実装します

PHP は func_get_arg、func_get_args、func_num_args を使用して擬似オーバーロードを実装します

WBOY
リリース: 2016-06-21 08:46:47
オリジナル
1394 人が閲覧しました

インターネットで時々PHPの擬似リロードの問題を見かけ、興味を持って勉強しました。以下の著者は、PHP が func_get_arg、func_get_args、および func_num_args を使用して関数の疑似オーバーロードを実装する方法について説明します。

まず、メソッドのオーバーロードの利点について説明します。

メソッドのオーバーロードを実装するために、異なるパラメーターの型やパラメーターの数に対して複数の関数を作成する必要はありません。複数の関数は同じ名前を使用しますが、呼び出し時にパラメーターのリスト、つまりパラメーターの数または (および) データ型が異なる場合があります。メソッド名は同じでも、対応する関数はそれに応じて自動的に呼び出されます。パラメータリスト。 Microsoft によって作成された .net 基本クラス ライブラリをリフレクターを使用してチェックすると、多くのメソッドのオーバーロードが使用されていることがわかります。そのため、それを呼び出すときに、それほど多くのメソッド名を覚える必要はありませんが、メソッド 関数はさまざまなパラメータを直接渡すことができ、コンパイラはどのメソッドを呼び出したかを明確に認識します。

しかし、PHP には関数のオーバーロードの概念がないため、多くの場合、PHP が提供する関連する問題を解決するために、関数の後に N 個のパラメーターを定義する必要さえあります。 func_get_arg、func_get_args、func_num_args のように、関連する問題を直接解決できます。具体的なコード例は次のとおりです:

<?php
function  testOne($a) {
echo ('一个参数就这样 ');
}
function testTwo($a, $b) {
	echo ('两个参数的就这样 ');
}
function testThree($a, $b, $c) {
	echo ('呵呵,这是三个参数的 ');
}
function test() {
	$argNum = func_num_args();
	// 这一段其实可以用 $_arg = func_get_args() 来获得所有的参数,只是要用数组而已,不方便我下面的表达,呵呵
	for ($i = 0; $i < $argNum; $i++) {
		$_arg_{$i} = func_get_arg($i);
	}
	switch ($argNum) {
		case 1 :
			testOne($_arg_1);
		break ;
		case 2 :
			testTwo($_arg_1, $_arg_2);
		break ;
		case 3 :
			testThree($_arg_1, $_arg_2, $_arg_3);
		break ;
		default :
			echo (' 这是没有参数的情况 ');
		break ;
	}
}
/**
 * 例子的实现
 */
test();
echo ('<br>');
test(1);
echo ('<br>');
test(1, 2);
echo ('<br>');
test(1, 2, 3);
// 这些只是在函数中的运用,其实最主要的还是在类中的运用
// 如果这些用到类里面我就不需要担心构造函数是否有几个参数了,不是吗?
// 类里面的运用只举一个简单的例子
class test{
	var $a = 0;
	var $b = 0;
	function test() {
		$argNum = func_num_args();
		$_arg = func_get_args();
		switch ($argNum) {
			case 1 :
				$this->test1($_arg[0]);
			break ;
			case 2 :
				$this->test2($_arg[0], $_arg[1]);
			break;
			default :
				$this->a = 0;
				$this->b = 1;
			break;
		}
	}
	function test1($a) {
		$this->a = $a;
	}
	function test2($a, $b) {
		$this->a = $a;
		$this->b = $b ;
	}
}
ログイン後にコピー

興味のある記事

  • PHP は session_set_save_handler() 関数を使用してセッションを MySQL データベースに保存します
  • PHP は Curl 関数を使用してマルチスレッドを実装する Web ページをクロールしてファイルをダウンロードする
  • PHP は array_flip を使用して配列のキーと値の交換を実装し、配列内の重複する値を削除します
  • in_array() foreach を使用する場合のパフォーマンスの比較についてarray_search() を使用して、配列に次の内容が含まれているかどうかを確認します
  • PHP がフィルター関数を使用して電子メール、URL、および IP アドレスを確認する方法
  • PHP 関数のmemory_get_usage を使用して、現在の PHP メモリ消費量を取得し、プログラムのパフォーマンス
  • php が配列内の特定の数値を検索する 値が存在するかどうか (in_array()、array_search()、array_key_exists())
  • file_get_contents とcurl のパフォーマンス効率の比較PHP



関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のおすすめ
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート