ホームページ  >  記事  >  バックエンド開発  >  PHP オブジェクト指向メソッドのオーバーロードの 2 つのバージョンの比較_PHP チュートリアル

PHP オブジェクト指向メソッドのオーバーロードの 2 つのバージョンの比較_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-21 15:50:05801ブラウズ

複数の関数は同じ名前を使用しますが、呼び出し時にパラメーターのリスト、つまりパラメーターの数または (および) データ型が異なる場合があります。メソッド名は同じでも、対応する関数はそれに応じて自動的に呼び出されます。パラメータリスト。

PHP4 はいくつかの単純なオブジェクト指向関数のみを実装していますが、PHP5 のオブジェクトのサポートは将来的にはさらに強力になるでしょう。

ポリモーフィック実装の場合、PHP4 はオーバーライドのみをサポートしますが、オーバーロードはサポートしません。ただし、いくつかのトリックを使用して、オーバーロードの実装を「シミュレート」することができます。

PHP5 は上書きとオーバーロードをサポートできますが、オーバーロードの具体的な実装は他の言語とは依然として大きく異なります。

1. PHP4 での「オーバーロード」のシミュレーション

次のコードを試してください:

//パラメータの数に応じて異なるメソッドの実行を選択します (PHP4 (ポリモーフィック 1) 種類の「オーバーロード」のシミュレーション)

クラス Myclass
{
function Myclass()
{
$method = "メソッド" . func_num_args();
$this->$method()
}
関数メソッド1($x)
echo "method1";
}

function method2($x, $y)
{
echo 'method2';
}
}

//このクラスを使用すると、ユーザーにとって有益です。
$obj1 = new Myclass('A'); //method1 が呼び出されます
$obj2 = new Myclass('B','C'); //method2 が呼び出されます

;コンストラクターで func_num_args() 関数を使用してパラメーターの数を取得し、メソッド 1 またはメソッド 2 メソッドを自動的に実行することで、関数 func_get_arg(i) と func_get_args() を組み合わせて上記の例

2 を改善できます。 PHP5. オーバーロードの使用

まず、次の例を見てください:




コードをコピーします

コードは次のとおりです: class Myclass
{
public $attriable; = "これは 1";
public $two = "これは 2"; $this->attriable = $this->one;
}

関数 one($one, $two)
{
$this->one=$one;
$this->two=$two; ;
$this->attriable = $this->two;

関数 display()
{
echo $this->attriable
}

$one = "これは私のクラスです" ;
$two = "私は最高です"
$myclass->one($one);
$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 オーバーローダー
{
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;

public function __call($method, $p)
{
print("$method()
n の呼び出し")
//print("引数: " );
//print_r($args);
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);
echo " }

public function displayArray($p)
{
echo ("渡したものは配列で、内容は次のとおりです:
");
print_r($p);
echo "
";
}

public function displayScalar($p)
{
echo ("渡したものは次の内容を持つ別の変数です:
" . $p);
";
}
}

$o = new Overloader();

//__set() を呼び出して、存在しないプロパティ変数に値を割り当てます
$o->dynaProp = "動的コンテンツ";

//__get() を呼び出す
print($o->dynaProp . "
n");

//__call() を呼び出す
//$o->dynaMethod("Leon" , "Zeev");

$o ->display(array(1,2,3));



; 、display()メソッドが呼び出されます。これはパラメータに従って決定できます。型と番号はクラス内の対応するコードセグメントを呼び出し、それによってオブジェクトメソッドのオーバーロードを実現します。



http://www.bkjia.com/PHPjc/319404.html

www.bkjia.com
tru​​e

http://www.bkjia.com/PHPjc/319404.html技術記事複数の関数は同じ名前を使用しますが、呼び出し時にパラメーターのリスト、つまりパラメーターの数または (および) データ型が異なる場合があります。メソッド名は同じでも、対応するメソッドはメソッドに従って自動的に呼び出されます。パラメータリスト...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。