ポリモーフィズムとは何ですか? ポリモーフィズムとは文字通り複数の状態を意味します。オブジェクト指向言語では、インターフェイスの複数の異なる実装をポリモーフィズムと呼びます。 Charlie Calverts のポリモーフィズムの説明を引用します。 ポリモーフィズムは、親オブジェクトを 1 つ以上の子オブジェクトと等しくなるように設定できる手法です。代入後、親オブジェクトは現在の
に基づくことができます。ポリモーフィズムとは何ですか?
ポリモーフィズムは文字通り「複数の状態」を意味します。オブジェクト指向言語では、インターフェイスの複数の異なる実装をポリモーフィズムと呼びます。 Charlie Calverts のポリモーフィズムの説明を引用します。ポリモーフィズムは、親オブジェクトを 1 つ以上の子オブジェクトと等しくなるように設定できる技術で、代入後、現在の値に基づいて親オブジェクトをその子オブジェクトに割り当てることができます。 . 機能はさまざまな方法で動作します (「Insider Delphi 4 プログラミング テクノロジー」より)。簡単に言うと、それは 1 つの文です: サブクラス型のポインターを親クラス型のポインターに割り当てることが許可されています (はい、この文章は Baidu 百科事典から引用しています)。それでは、ポリモーフィズムの役割は何であり、その実際の開発価値は何でしょうか?実際のアプリケーション開発において、オブジェクト指向ポリモーフィズムを使用する主な目的は、異なるサブクラス オブジェクトを 1 つの親クラスとして扱うことができ、異なるサブクラス オブジェクト間の差異をシールドして汎用オブジェクトを記述して、一般的なプログラミングを実現できることです。変化するニーズに適応します。
以下は、PHP でのポリモーフィズムの 2 つの実装です
オーバーロードはクラスポリモーフィズムの実装です。関数のオーバーロードとは、識別子が複数の関数名として使用され、同じ名前の関数が関数のパラメータ数やパラメータの型によって区別できるため、呼び出し時に混乱が生じないことを意味します。つまり、呼び出されたとき、メソッド名は同じでも、異なるパラメータに従って対応する関数を自動的に呼び出すことができます。
リーリーPHP がメソッドのオーバーロードを直接サポートしている場合。そして、上記の例を実行すると、パラメータが渡された場合と渡されなかった場合で異なる値が返されます。ただし、php は のオーバーロードを直接サポートしていないため、上記のように直接定義するとエラーが報告されます。どのようなエラーが報告されるのでしょうか?次のエラーが報告されます。
これは、関数 A を繰り返し定義することができず、エラーを報告する行数がちょうど次の行であることを意味します。
リーリー
つまり、php はリロードを直接サポートしていません。共著者は長い間、php はサポートしていないと言い続けてきました。 。心配しないでください。私が言ったのは、これは直接サポートされていないため、php に間接的にサポートさせることができるということです。このとき、オーバーロードをサポートする関数が使用されます。それは__call()です。 __call() メソッドは 2 つのパラメータを取る必要があります。最初のパラメータには呼び出されるメソッドの名前が含まれ、2 番目のパラメータにはメソッドに渡されるパラメータの配列が含まれます。このメソッドを使用すると、関数のオーバーロードと同様の関数を実現できます。以下のコードを見てください。
リーリーメソッドを定義するとき、オブジェクトが display() メソッドに渡されると、displayObject() メソッドが呼び出され、配列が渡されると、displayArray() メソッドが呼び出されます。 else が渡される コンテンツの場合、displayScalar() メソッドが呼び出されます。 。 。以下を呼び出すと、最初に配列が渡され、次に displayArray() が呼び出されることがわかります。 2 番目に渡されたものはオブジェクトでも配列でもありません。他のコンテンツに属しており、displayScalar() メソッドが呼び出されます。このように、__call() メソッドを使用して、他の言語と同様のメソッドのオーバーロードを実装します。
いわゆる上書きとは、本質的には書き換えです。つまり、サブクラスが親クラスからいくつかのメソッドを継承し、そのサブクラスが同じメソッドを内部で定義している場合、新しく定義されたメソッドは親クラスから継承されたメソッドをオーバーライドし、サブクラスは内部で定義されたメソッドのみを呼び出すことができます。
以下の要件があります:
1. 親クラスとサブクラスにまったく同じパラメーターと名前を持つメソッドがある場合、サブクラスのメソッドは親クラスのメソッドをオーバーライドします。
2. メソッド カバレッジを実装する場合、アクセス修飾子は異なっていてもかまいませんが、サブクラスのアクセス スコープは親クラスのアクセス スコープ以上である必要があります。
3. パラメータは名前と同じである必要があります。サブクラスが親クラスと同じ名前である必要はありません。
以下にこれらの点について説明します:
第一点,必须参数一致,才会实现方法覆盖。当参数个数不一致,则会报错(这就牵扯到上面说所得方法重载)。当方法名字不一致,就不会覆盖,只是子类新定义的方法。;
第二点,这是php这些语言设计时的规定吧。我是这么理解的是访问高一层的东西比较容易,如果再去访问底层的东西权限肯定要高一些。
看代码:
class<span> people{ PRotected function<span> sing(){ echo "人唱歌"<span>; } } class woman extends<span> people{ public function<span> sing(){ echo "女人唱歌"<span>; } } $woman1=new<span> woman(); $woman1->sing();</span></span></span></span></span></span></span>
这样很正常的可以输出“女人唱歌”。但当把woman里的sing()方法改为proctcted,父元素改成public()时,即将父类的访问权限设置的大于子类后,就会报下面的错误。
第三点,是要求参数和名字一样,具体就是要求参数的个数与父类相同,而并不是参数名称一致。即传递的参数名字可以为任意,只要保证传递的个数相同即可。
上面简介了PHP语言中多态的两个实现。
嗯,差不多就是这样。。