複数の関数は同じ名前を使用しますが、パラメータリスト、つまりパラメータの数または(および)データ型が異なる場合があります。メソッド名は同じでも、それに応じて対応する関数を自動的に呼び出すことができます。パラメータリストに追加します。
PHP4 はいくつかの単純なオブジェクト指向関数のみを実装していますが、PHP5 ではオブジェクトのサポートがさらに強力になります。
ポリモーフィック実装の場合、PHP4 はオーバーライドのみをサポートしますが、オーバーロードはサポートしません。ただし、いくつかのトリックを使用して、オーバーロードの実装を「シミュレート」することができます。
PHP5 は上書きとオーバーロードをサポートできますが、オーバーロードの具体的な実装は他の言語とは依然として大きく異なります。
1. PHP4 でのオーバーロードの「シミュレーション」
次のコードを試してください:
//パラメータの数に応じて異なるメソッドの実行を選択します (PHP4 での「オーバーロード」 (ポリモーフィズムの一種) をシミュレートします)
クラス Myclass
{
function Myclass()
{
$method = "メソッド" . func_num_args();
$this->$method()
{
}
function method2($x, $y)
{
}
}
//このクラスの使用は、次のクラスでの追加の処理を通じてユーザーに透過的です:
$ obj1 = new Myclass('A'); //method1 が呼び出されます
?>
上記のコードでは、コンストラクターで func_num_args() 関数を使用してパラメーターの数を取得すると、関数 func_get_arg(i) と func_get_args() を組み合わせて上記の例を改良し、PHP5 で使用できます。オーバーロード
次のようにコードをコピーします:
class Myclass {public $attriable;
public $one = "this is one"; "これは 2 つです";
function __construct()
{
}
function one($one)
$this->one=$one;
$this->attriable = $this-> 1;
}
関数 one($one, $two)
{
$this->one=$one;
$this->attriable = $this- > one . $this->two;
}
関数 display()
{
}
$one = "これは私のクラスです"; "私は最高です";
$myclass = new myclass();
$myclass->one($one, $ two) ;
$myclass->display();
//この例のアプローチは PHP では正しくありません。
C++、Java、および C# でオーバーロードを使用したことのある人は、上記のオーバーロード実装用の PHP コードを記述することに慣れています。しかし、これは PHP5 では当てはまりません。 PHP5 は前述の言語を模倣したものではありませんが、メソッドのオーバーロードを実装するための独自のメソッド セットを備えています (それが良いか悪いかはここでは議論しません)。 PHP5 のクラスは PHP4 のクラスよりもはるかに強力ですが、「オーバーロード」の問題は期待したほど「改善」されていません。 「オーバーロード」は、C++、Java、C# などの「強く」型付けされた言語のさまざまなパラメーター型を通じて実現できます。 Javaのように「固定パラメータ」を渡す言語では、パラメータの数だけ渡すこともできますが、PHPは弱い型付け言語なので、上記のような「オーバーロード」は起こりません。
PHP5 では、いくつかの特別なメソッド __get、__set、__call を通じてオーバーロードを実行できます。 Zend エンジンがメンバーにアクセスしようとして見つからなかった場合、PHP はこれらのメソッドを呼び出します。
次の例では、属性変数配列へのすべてのアクセスが __get と __set に置き換えられます。必要に応じて、任意のタイプのフィルタリングを実装することもできます。たとえば、スクリプトでプロパティ値の設定を無効にしたり、特定のプレフィックスで開始したり、特定の種類の値を含めたりすることができます。 __call メソッドは、未定義のメソッドを呼び出す方法を示しています。未定義のメソッドを呼び出すと、メソッド名とメソッドが受け取ったパラメータが __call メソッドに渡され、PHP は __call の値を未定義のメソッドに返します。
コードは次のとおりです:
class Overloader
{
private $properties = array();
function __get($property_name)
{if(isset($this->properties[ $property_name] ))
{return($this->properties[$property_name]);
}
else
{
return(NULL)
}
function __set($property_name, $value)
{
$ this->properties[$property_name] = $value;
パブリック関数 __call($method, $p)
{
print("$method()
n の呼び出し");
//print("引数: ");
if($method == 'display')
{
if(is_object($p[0]))
$this->displayObject($p[0]);
else
if(is_array($p[ 0]))
$this->displayArray($p[0]);
else
$this->displayScalar($p[0]);
}
public function displayObject($p)
echo ("渡されたものは次のとおりです:
");
print_r($p);
}
public function displayArray( $p)
{
print_r($p);
}
public function displayScalar($p)
{
echo ("渡した内容は次の内容を持つ別の変数です:
" . $p);
}
;
$o = new Overloader();
//存在しない属性変数に値を割り当てるには __set() を呼び出します
$o->dynaProp = "Dynamic Content";
//__get() を呼び出します
print($o->dynaProp . "< ;br>n");
//__call() を呼び出す
$o- >display(array(1,2, 3));
?>
さらに関連コンテンツが必要な場合は、PHP 中国語 Web サイト (www.php.cn) にご注意ください。