ホームページ php教程 php手册 探讨PHP5多态性的具体实现方式

探讨PHP5多态性的具体实现方式

Jun 13, 2016 am 11:05 AM
php5 特定の 存在する ポリモーフィズム 成し遂げる 話し合う サポート 新しいバージョン 方法

PHP5作为一个新版本,实现了对迟绑定的支持,不过在实际应用中,迟绑定功能还存在一些问题,比如你使用的是更旧版本的PHP,那么你可能发现其中缺乏对于迟绑定的支持。我们今天为大家讲的就是关于一、 PHP 5和多态性

本文想讨论面向对象编程中最为重要的部分之一--多态性的设计。为了说明问题,我使用了PHP 5。在你继续阅读之前,请首先明确本文并不是完全有关于PHP的。尽管这种语言在以前的两个主要版本中在快速开发方面已经取得很大的进步,但是,在其与更为成熟的语言如C++或者Java相匹敌之前,它对于对象的支持还要经历一段历程。

如果你是一位面向对象编程的入门者,那么本文可能不适合你,因为PHP5多态性这部分知识比较特别:一旦理解了它,你将永远不会忘记。如果你想简单了解一点对象编程和设计知识,并且当某人说"某个对象是多态的"时,还不十分清楚这是什么意思的话,那么本文正适合你。

到本文最后,你应该知道什么是多态性以及如何把它应用到面向对象的设计中,并且你会了解PHP 5中对象编程的优点与不足。

二、什么是多态性?

多态性,其来自于dictionary.com的定义是"以不同形式,阶段或者类型出现在独立的组织中或者同种组织中,而不存在根本区别。"由该定义,我们可以认为,多态性是一种通过多种状态或阶段来描述相同对象的编程方式。其实,它的真正意义在于:实际开发中,我们只需要关注一个接口或基类的编程,而不必担心一个对象所属于的具体类(class)。

如果你熟悉设计模式,即使只是有个初步了解,那么你也会了解这个概念。事实上,PHP5多态性可能是基于模式设计编程中的最伟大的工具。它允许我们以一种逻辑的方式来组织相类似的对象从而实现在具体编码时不必担心对象的具体类型;而且,我们只需要对一个所期望的接口或基类编程即可。一个应用程序越抽象,则它就显得越灵活--而多态性是对行为加以抽象的最好的方式之一。

例如,让我们考虑一个叫Person的类。我们可以用称为David,Charles和Alejandro的类来子类化Person。Person有一个抽象方法AcceptFeedback(),所有的子类都要实现这个方法。这意味着,任何使用基类Person的子类的代码都能调用方法AcceptFeedback()。你不必检查该对象是一个David还是一个Alejandro,仅知道它是一个Person就够了。结果是,你的代码只需关注"最小公分母"-Person类即可。

在这个示例中的Person类也可以被创建为一个接口。当然,与上面相比存在一些区别,主要在于:一个接口并没有给出任何行为,而仅确定了一组规则。一个Person接口要求的是"你必须支持AddFeedback()方法",而一个Person类可以提供一些AddFeedback()方法的缺省代码-你对之的理解可以是"如果你不选择支持AddFeedback(),那么你应该提供一种缺省实现。"至于如何选择接口或基类则并非本文的主题;但是,一般说来,你需要通过基类来实现一个缺省的方法。如果你能够简单地勾勒出你的类所要实现的一组期望的功能,那么你也可以使用一个接口。

三、应用PHP5多态性设计

我们将继续使用Person基类的例子,现在让我们分析一个非多态性的实现。下列示例中使用了不同类型的Person对象--这是一种非常不理想的编程方式。注意,实际的Person类被省略。目前为止,我们仅关心代码调用的问题。

<ol class="dp-xml">
<li class="alt"><span><span><?php   </span></span></li>
<li class="">
<span> $</span><span class="attribute"><font color="#ff0000">name</font></span><span> = $_SESSION['name'];   </span>
</li>
<li class="alt">
<span> $</span><span class="attribute"><font color="#ff0000">myPerson</font></span><span> = Person::GetPerson($name);   </span>
</li>
<li class=""><span> switch (get_class($myPerson)){   </span></li>
<li class="alt"><span>case 'David' :   </span></li>
<li class=""><span> $myPerson->AddFeedback('Great Article!','Some Reader', date('Y-m-d'));   </span></li>
<li class="alt"><span> break;   </span></li>
<li class=""><span>case 'Charles':   </span></li>
<li class="alt"><span> $myPerson->feedback[] = array('Some Reader', 'Great Editing!');   </span></li>
<li class=""><span> break;   </span></li>
<li class="alt"><span>case 'Alejandro' :   </span></li>
<li class=""><span> $myPerson->Feedback->Append('Awesome JavaScript!');   </span></li>
<li class="alt"><span> break;   </span></li>
<li class=""><span>default :   </span></li>
<li class="alt"><span> $myPerson->AddFeedback('Yay!');   </span></li>
<li class=""><span> }   </span></li>
<li class="alt"><span>?> </span></li>
</ol>
ログイン後にコピー

这个示例展示了行为不同的对象,还有一个switch语句用于区分不同的Person类对象,从而执行其各自相应的正确操作。注意,这里针对不同条件的回馈注释是不同的。在实际应用程序开发中可能不会出现这种情形;我仅为了简单地说明类实现中存在的区别。

下面的一个示例使用了PHP5多态性。

<ol class="dp-xml">
<li class="alt"><span><span><?php   </span></span></li>
<li class="">
<span> $</span><span class="attribute"><font color="#ff0000">name</font></span><span> = $_SESSION['name'];   </span>
</li>
<li class="alt">
<span> $</span><span class="attribute"><font color="#ff0000">myPerson</font></span><span> = Person::GetPerson($name);   </span>
</li>
<li class=""><span> $myPerson->AddFeedback('Great Article!', 'SomeReader', date('Y-m-d'));   </span></li>
<li class="alt"><span>?> </span></li>
</ol>
ログイン後にコピー

注意,这里没有switch语句,而最重要的是,缺乏有关Person::GetPerson()会返回什么类型的对象。而另一个Person::AddFeedback()是一个多态方法。行为完全是由具体类进行封装的。请记住,在此无论我们使用的是David,Charles还是Alejandro,调用代码从不必了解具体类的功能,而仅知道基类就可以了。

尽管我的示例并不完美,但是,从调用代码的角度,它已经展示了PHP5多态性的基本用法。现在我们需要分析这些类的内部实现。从一个基类进行派生的一个最伟大的地方在于,该派生类能够存取父类的行为,这种情况常常是缺省的实现,但是也可能出现在类继承链中用于创建更为复杂的行为。下面是这种情况的一个简单展示。

<ol class="dp-xml">
<li class="alt"><span><span><?php   </span></span></li>
<li class=""><span>class Person{   </span></li>
<li class="alt"><span> function AddFeedback($comment, $sender, $date){   </span></li>
<li class=""><span>//把回馈添加到数据库   </span></li>
<li class="alt"><span> }   </span></li>
<li class=""><span>}   </span></li>
<li class="alt"><span>class David extends Person{   </span></li>
<li class=""><span> function AddFeedback($comment, $sender){   </span></li>
<li class="alt"><span>parent::AddFeedback($comment, $sender,   </span></li>
<li class=""><span>date('Y-m-d'));   </span></li>
<li class="alt"><span> }   </span></li>
<li class=""><span>}   </span></li>
<li class="alt"><span>?> </span></li>
</ol>
ログイン後にコピー

在此,David类中的AddFeedback方法实现中首先调用了Person::AddFeedback方法。你可能注意到,它模仿了C++,Java或C#中的方法重载。请记住,这仅是一个简单化的示例,并且你编写的PHP5多态性实际代码完全依赖于你的实际工程。


このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Huawei 携帯電話にデュアル WeChat ログインを実装するにはどうすればよいですか? Huawei 携帯電話にデュアル WeChat ログインを実装するにはどうすればよいですか? Mar 24, 2024 am 11:27 AM

Huawei 携帯電話にデュアル WeChat ログインを実装するにはどうすればよいですか?ソーシャルメディアの台頭により、WeChatは人々の日常生活に欠かせないコミュニケーションツールの1つになりました。ただし、多くの人は、同じ携帯電話で同時に複数の WeChat アカウントにログインするという問題に遭遇する可能性があります。 Huawei 社の携帯電話ユーザーにとって、WeChat の二重ログインを実現することは難しくありませんが、この記事では Huawei 社の携帯電話で WeChat の二重ログインを実現する方法を紹介します。まず第一に、ファーウェイの携帯電話に付属するEMUIシステムは、デュアルアプリケーションを開くという非常に便利な機能を提供します。アプリケーションのデュアルオープン機能により、ユーザーは同時に

PHP プログラミング ガイド: フィボナッチ数列を実装する方法 PHP プログラミング ガイド: フィボナッチ数列を実装する方法 Mar 20, 2024 pm 04:54 PM

プログラミング言語 PHP は、さまざまなプログラミング ロジックやアルゴリズムをサポートできる、Web 開発用の強力なツールです。その中でも、フィボナッチ数列の実装は、一般的で古典的なプログラミングの問題です。この記事では、PHP プログラミング言語を使用してフィボナッチ数列を実装する方法を、具体的なコード例を添付して紹介します。フィボナッチ数列は、次のように定義される数学的数列です。数列の最初と 2 番目の要素は 1 で、3 番目の要素以降、各要素の値は前の 2 つの要素の合計に等しくなります。シーケンスの最初のいくつかの要素

宝の地図は「ゼロ時代」に登場します。一緒に宝を探してメーデーを祝いましょう! 宝の地図は「ゼロ時代」に登場します。一緒に宝を探してメーデーを祝いましょう! May 03, 2024 pm 12:43 PM

「ゼロエイジ」の伝説によれば、その昔、パン神という守銭奴が生前に大量の財宝を集めていたが、彼の死後、それらの宝物も消滅し、パン神が巨大な建造物を建てたという噂だけが残った。迷路霊廟の中に宝物が隠されていましたが、残念ながらまだ誰も見つけていません。命を賭してのみ、この比類のない宝を見つけることができます。このゲームに賭けてみませんか? 宝箱を見つければ、装備開発の小道具や謎の銀貨のパッケージが手に入るかもしれません。それで、宝の地図はどこで入手できますか?デイリービジネスミッションから入手できます。 宝の地図にはアイスランドの宝の地図、荒野の宝の地図、熱帯雨林の宝の地図の3種類があります。 宝の地図にマークされている宝の場所を見つけると、宝を掘り出すことができます。また、宝物を掘っていると、さまざまなイベントがランダムに発生します。宝物を守っている BOSS に警告が発せられ、BOSS が死亡する可能性があります。

C++ 仮想関数テーブルとポリモーフィック実装、メモリの無駄を避ける方法 C++ 仮想関数テーブルとポリモーフィック実装、メモリの無駄を避ける方法 May 31, 2024 pm 07:03 PM

仮想基本クラスは、追加の vtable を作成せずに複数の基本クラスからの継承を許可することで、vtable のメモリ オーバーヘッドを最適化します。最適化されたコードでは、形状基本クラスに仮想関数テーブルがなくなり、円クラスと長方形クラスが同じ仮想関数テーブルを共有するため、メモリ消費量が削減されます。

Huawei携帯電話にWeChatクローン機能を実装する方法 Huawei携帯電話にWeChatクローン機能を実装する方法 Mar 24, 2024 pm 06:03 PM

Huawei 携帯電話に WeChat クローン機能を実装する方法 ソーシャル ソフトウェアの人気と人々のプライバシーとセキュリティの重視に伴い、WeChat クローン機能は徐々に人々の注目を集めるようになりました。 WeChat クローン機能を使用すると、ユーザーは同じ携帯電話で複数の WeChat アカウントに同時にログインできるため、管理と使用が容易になります。 Huawei携帯電話にWeChatクローン機能を実装するのは難しくなく、次の手順に従うだけです。ステップ 1: 携帯電話システムのバージョンと WeChat のバージョンが要件を満たしていることを確認する まず、Huawei 携帯電話システムのバージョンと WeChat アプリが最新バージョンに更新されていることを確認します。

Golang がゲーム開発の可能性を可能にする方法をマスターする Golang がゲーム開発の可能性を可能にする方法をマスターする Mar 16, 2024 pm 12:57 PM

今日のソフトウェア開発分野では、効率的で簡潔かつ同時実行性の高いプログラミング言語として、Golang (Go 言語) が開発者にますます好まれています。豊富な標準ライブラリと効率的な同時実行機能により、ゲーム開発の分野で注目を集めています。この記事では、ゲーム開発に Golang を使用する方法を検討し、具体的なコード例を通じてその強力な可能性を示します。 1. ゲーム開発における Golang の利点 Golang は静的型付け言語として、大規模なゲーム システムの構築に使用されます。

『陰陽師』新バージョン「福の神パレード」登場&バージョンイベント「福の神パレード」開催! 『陰陽師』新バージョン「福の神パレード」登場&バージョンイベント「福の神パレード」開催! Mar 30, 2024 pm 02:56 PM

『陰陽師』新バージョン「福の神パレード」が4月3日より配信開始、バージョンイベント「福の神パレード」もスタート! 襲来する海の怪物を討伐し、世界への旅に出ましょう。一緒に運を集めよう 【バージョンイベント「福の神の注ぎ」】 開催時間 4月3日メンテナンス後~4月9日23:59 【遊び方紹介】 イベント内容:海の怪物退治、逸話遠方からの帰還、おみくじの収集、福の神からのギフトカード、お店訪問について ゲームプレイを待っている間、レベル 15 以上の陰陽師は、中庭にある朝の光の恵比寿、または画面右上の小さな紙屋をクリックしてください。中庭でアクティビティに参加できます。・クラーケンを倒す ・「たいや焼き」または「スタミナ」を消費してイベント報酬を獲得します。戎陳慧も一緒に参戦! 挑戦に成功すると「福の泡」や「福神の絆」などの報酬がもらえます。クラーケン退治のレベル数が上がると、以下のアイテムを獲得できます。

テクノロジーと魔法が融合する新時代「ゼロエラ」が幕を開ける! テクノロジーと魔法が融合する新時代「ゼロエラ」が幕を開ける! Jun 02, 2024 am 09:45 AM

『Zero Era』は、Hip Hop Tribe Platformを代表とする、終末世界の再構築をテーマに、魔法とテクノロジーが共存する不思議な新世界を表現する2.5D未来ファンタジー多人数参加型オンラインゲームです。テクノロジー、自動創造的なスキルなどの革新的なゲームプレイは、無限の変化と想像力に満ちたスチームパンク文化を十分に発揮します。装備品はキャラクターを守り、冒険中に受けるダメージを軽減するだけでなく、人の潜在能力を限界まで高め、冒険者が並外れた力を発揮することもできます。冒険者にとって、特別な装備を持つことはアイデンティティと経験の象徴ですらあります。装備は、コモン (白)、グッド (緑)、エクセレント (青)、レア (紫)、ヒロイック (ピンク)、レジェンド (オレンジ) の 6 つの品質レベルに分かれています。普通(

See all articles