#このチュートリアルの動作環境: 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()); //显示员工工作
油漆工正在刷漆 打字员正在打字
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());//显示经理的工作
油漆工正在刷漆! 打字员正在打字! 经理正在开会!
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 サイトの他の関連記事を参照してください。