ポリモーフィズムとは何ですか?
ポリモーフィズムは文字通り「複数の状態」を意味します。オブジェクト指向言語では、インターフェイスの複数の異なる実装をポリモーフィズムと呼びます。 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. パラメータは名前と同じである必要があります。サブクラスが親クラスと同じ名前である必要はありません。
これらの点について以下に説明します:
最初のポイントは、メソッド カバレッジを達成するにはパラメータが一貫している必要があるということです。パラメータの数が一致しない場合、エラーが報告されます (これには、上記のメソッドのオーバーロードが含まれます)。メソッド名が一致しない場合、上書きされるのはサブクラスの新しく定義されたメソッドのみです。 ;
2番目のポイント、これはおそらくphpのような言語の設計ルールです。私が理解しているのは、より高いレベルにあるものにアクセスする方が簡単であるということです。より低いレベルにあるものにアクセスしたい場合は、より高い権限が必要です。
コードを見てください:
リーリー
これは「女性の歌」をアウトプットする通常の方法です。しかし、女性の sing() メソッドが proccted に変更され、親要素が public() に変更された場合、つまり、親クラスのアクセス許可がサブクラスのアクセス許可よりも大きく設定された後、次のエラーが発生します。報告される。
3 番目のポイントは、パラメーターと名前が同じである必要があるということです。具体的には、パラメーターの 番号 は親クラスと同じである必要がありますが、パラメーター 名前 は同じである必要があります。つまり、渡されるパラメータの名前は、渡される数値が同じであれば任意です。
上記では、PHP 言語でのポリモーフィズムの 2 つの実装を紹介しました。
まあ、それだけです。 。