ホームページ  >  記事  >  php教程  >  PHP オブジェクト指向メソッドのオーバーロードの 2 つのバージョンの比較

PHP オブジェクト指向メソッドのオーバーロードの 2 つのバージョンの比較

WBOY
WBOYオリジナル
2016-06-13 12:27:12822ブラウズ

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

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

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

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

1、PHP4 でオーバーロードを「シミュレート」します

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

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

class Myclass
{
function Myclass()
{
$method = "method" . func_num_args () ;
$this->$method();
}

関数メソッド 1($x)
{
echo "メソッド 1";

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

// クラス内での追加処理により、このクラスを使用すると、ユーザーに対して透過的:
$obj1 = new Myclass('A'); //method1 が呼び出されます。
$obj2 = new Myclass('B','C'); //method2 が呼び出されます。 🎜>?>

上記のコードでは、コンストラクターで 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->one;
}

関数 one($one, $two)
{
$this- >one=$one;
$this->two=$two;
$this->attriable = $this->}
function display()
{
echo $this->attriable;
}
}

$one = "これは私のクラスです"
$two = "私は最高です";
$myclass = new myclass();
$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 の値を未定義のメソッドに返します。



コードをコピー

コードは次のとおりです:


クラス オーバーローダー
{
private $properties = array();

function __get($property_name)
{
if(isset($this->properties[$property_name]))
{
return($this->properties [$プロパティ名]);
}
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);
エコー "


";
}

public function displayArray($p)
{
echo ("你传入的是个数组,内容如下:
");
print_r($p);
エコー "
";
}

public function displayScalar($p)
{
echo ("你传入的是个单独变量,内容如下:
" . $p);
エコー "
";
}
}

$o = 新しいオーバーローダー();

//调用 __set() 存在しないプロパティ变量赋值
$o->dynaProp = "動的コンテンツ";

//调用 __get()
print($o->dynaProp . "
n");

//调用 __call()
//$o->dynaMethod("Leon", "Zeev");

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


上記のコードでは、display() メソッドが使用され、パラメータの型と数に応じて、クラス内の対応するコードセグメントを制御し、オブジェクト メソッドの再読み込みを実現できます。 🎜>
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。