#このチュートリアルの動作環境: Windows7 システム、PHP8 バージョン、DELL G3 コンピューターPHP では、ポリモーフィズムは、同じ操作が異なるクラスのインスタンスに適用された場合に異なる実行結果を生成することを意味します。つまり、異なる種類のオブジェクトが同じメッセージを受信すると異なる結果が得られ、異なる種類のオブジェクトが同じメッセージを受信すると異なる結果が得られます。この現象はポリモーフィズムと呼ばれます。ポリモーフィズムにより、各オブジェクトがそれ自体に適した方法で共通のメッセージに応答できるようになり、ソフトウェアの柔軟性と再利用性が向上します。
1. ポリモーフィズムとは
ポリモーフィズムとは文字通り「複数の形状」を意味します。これは、「1 つの外部インターフェイスと複数の内部実装メソッド」という複数の表現形式として理解できます。オブジェクト指向理論におけるポリモーフィズムの一般的な定義は、「同じ操作が異なるクラスのインスタンスに適用されると、異なる実行結果が生成される」というものです。つまり、異なるタイプのオブジェクトが同じメッセージを受信すると、異なる結果が得られます。 実際のアプリケーション開発において、オブジェクト指向ポリモーフィズムを使用する主な目的は、異なるサブクラス オブジェクトを 1 つの親クラスとして扱うことができ、異なるサブクラス オブジェクト間に存在する差異をシールドできることです。コードを作成し、変化するニーズに適応する共通のプログラミングを作成します。2. ポリモーフィックなアプリケーション設計
実際のアプリケーション開発では、通常、将来的にプロジェクトを簡単に拡張およびアップグレードできるようにするために、再利用可能なアプリケーションを実装する必要があります。継承によるモジュールのアップグレードを容易にします。再利用可能なモジュールを設計する場合、フロー制御ステートメントの使用を可能な限り減らす必要があります。この時点で、ポリモーフィズムを使用してこのタイプの設計を実装できます。 [例] は、さまざまな種類の処理を実装するためのフロー制御ステートメントの一般的な使用法を示しています。コードを以下に示します。class painter{ //定义油漆工类 public function paintbrush(){ //定义油漆工动作 echo "油漆工正在刷漆!\n"; } } class typist{ //定义打字员类 public function typed(){ //定义打字员工作 echo "打字员正在打字!\n"; } } function printworking($obj){ //定义处理类 if(objinstanceofpainter)//若对象是油漆工类,则显示油漆工动作$obj−>paintbrush();elseif(obj instanceof typist){ //若对象是打字员类,则显示打字员动作 $obj->typed(); }else{ //若非以上类,则显示出错信息 echo "Error: 对象错误!"; } } printworking(new painter()); //显示员工工作 printworking(new typist()); //显示员工工作分析: 上記のプログラムでは、最初に 2 つの従業員クラス (ペインター クラスとタイピスト クラス) を定義します。次に、定義した従業員であるかどうかを判定し、従業員の勤務状況を出力する処理機能を定義します。結果を以下に示します。
油漆工正在刷漆 打字员正在打字上記のプログラムから、複数の従業員の勤務状況を表示したい場合は、最初に従業員クラスを定義し、その従業員クラスで従業員の作業を定義してから、次を使用する必要があることが簡単にわかります。 printworking() 関数 elseif ステートメントを追加して、オブジェクトがどの従業員クラスのインスタンスであるかを確認します。これは実際のアプリケーションでは非常に望ましくないことです。このときポリモーフィズムを利用すれば、この問題は簡単に解決できる。 最初に従業員の親クラスを作成できます。すべての従業員クラスは従業員の親クラスを継承し、親クラスのすべてのメソッドと属性を継承します。次に、従業員クラスに「である」関係を作成して、従業員が法的な従業員であるかどうかを判断します。 [例] 上記の例をポリモーフィズムを使用して書き換えます。コードを以下に示します。
class employee{//定义员工父类 protected function working(){//定义员工工作,需要在子类的实现 echo "本方法需要在子类中重载!"; } } class painter extends employee{//定义油漆工类 public function working(){//实现继承的工作方法 echo "油漆工正在刷漆!\n"; } } class typist extends employee{//定义打字员类 public function working(){ echo "打字员正在打字!\n"; } } class manager extends employee{//定义经理类 public function working(){ echo "经理正在开会!"; } } function printworking($obj){//定义处理方法 if($obj instanceof employee){//若是员工对象,则显示其工作状态 $obj->working(); }else{//否则显示错误信息 echo "Error: 对象错误!"; } } printworking(new painter());//显示油漆工的工作 printworking(new typist());//显示打字员的工作 printworking(new manager());//显示经理的工作分析: 上記のプログラムでは、まず従業員の基本クラスを定義し、従業員の勤務状況を取得するメソッドを定義します。次に、従業員基本クラスから継承する 3 つの従業員クラス (Painter、Typist、および Manager) を定義します。次に、従業員の勤務状況を表示するメソッドを定義します。そして、このメソッドで「is-one」関係を作成し、それが法的な従業員であるかどうかを判断します。結果を以下に示します。
油漆工正在刷漆! 打字员正在打字! 经理正在开会!上記の例から、追加される従業員クラスの数に関係なく、実装する必要があるのは従業員クラスと従業員の親クラスから継承されたメソッドのみであることがわかります。従業員の勤務状況を表示するprinting()メソッドを変更する必要はありません。
PHP ポリモーフィズムを実装する 2 つの方法
PHP5 では、変数の型は定義されておらず、変数は任意の型の数値を指すことができます。 、文字列、オブジェクト、リソースなど。 PHP5 のポリモーフィズムは変数であるとは言えません。 PHP5ではメソッドパラメータの型ヒント位置にポリモーフィズムが適用されているとしか言えません。 クラスのサブクラス オブジェクトは、現在の型を型ヒントとして使用するという型要件を満たすことができます。 このインターフェイスを実装するすべてのクラスは、インターフェイスの型を型ヒントとして使用してメソッド パラメーターの要件を満たすことができます。 簡単に言うと、クラスはその親クラスと実装されたインターフェイスの ID を持ちます。インターフェイスを実装してポリモーフィズムを実現する
<?php interface User{ // User接口 public function getName(); public function setName($_name); } class NormalUser implements User { // 实现接口的类. private $name; public function getName(){ return $this->name; } public function setName($_name){ $this->name = $_name; } } class UserAdmin{ //操作. public static function ChangeUserName(User $_user,$_userName){ $_user->setName($_userName); } } $normalUser = new NormalUser(); UserAdmin::ChangeUserName($normalUser,"Tom");//这里传入的是 NormalUser的实例. echo $normalUser->getName(); ?>
インターフェイスと合成を使用して多重継承をシミュレートする
合成を通じて多重継承をシミュレートします。 PHP では多重継承はサポートされていません。複数のクラスのメソッドを使用してコードを再利用したい場合、何か方法はありますか?那就是组合。在一个类中去将另外一个类设置成属性。
下面的例子,模拟了多重继承。
接口实例
写一个概念性的例子。 我们设计一个在线销售系统,用户部分设计如下: 将用户分为,NormalUser, VipUser, InnerUser 三种。要求根据用户的不同折扣计算用户购买产品的价格。并要求为以后扩展和维护预留空间。
<?php interface User { public function getName(); public function setName($_name); public function getDiscount(); } abstract class AbstractUser implements User { private $name = ""; protected $discount = 0; protected $grade = ""; function construct($_name) { $this->setName($_name); } function getName() { return $this->name; } function setName($_name) { $this->name = $_name; } function getDiscount() { return $this->discount; } function getGrade() { return $this->grade; } } class NormalUser extends AbstractUser { protected $discount = 1.0; protected $grade = "Normal"; } class VipUser extends AbstractUser { protected $discount = 0.8; protected $grade = "VipUser"; } class InnerUser extends AbstractUser { protected $discount = 0.7; protected $grade = "InnerUser"; } interface Product { function getProductName(); function getProductPrice(); } interface Book extends Product { function getAuthor(); } class BookOnline implements Book { private $productName; protected $productPrice; protected $Author; function construct($_bookName) { $this->productName = $_bookName; } function getProductName() { return $this->productName; } function getProductPrice() { $this->productPrice = 100; return $this->productPrice; } public function getAuthor() { $this->Author = "chenfei"; return $this->Author; } } class Productsettle { public static function finalPrice(User $_user, Product $_product, $number) { $price = $_user->getDiscount() * $_product->getProductPrice() * $number; return $price; } } $number = 10; $book = new BookOnline(" 设计模式 "); $user = new NormalUser("tom"); $price = Productsettle::finalPrice($user, $book, $number); $str = "您好,尊敬的" . $user->getName() . "<br />"; $str .= "您的级别是" . $user->getGrade() . "<br />"; $str .= "您的折扣是" . $user->getDiscount() . "<br />"; $str .= "您的价格是" . $price; echo $str; ?>
推荐学习:《PHP视频教程》
以上がPHP におけるポリモーフィズムとは何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。