PHPオブジェクト指向プログラミング:コンストラクターの正しい使用と継承と組み合わせの区別
1. PHP __constructのコンストラクターを理解します
PHPでは、コンストラクターは新しいオブジェクトが作成されたときに(新しいキーワードを介して)自動的に呼び出される特別な方法です。コンストラクターの主な機能は、オブジェクトのプロパティを初期化し、オブジェクトが使用される前に有効な状態にあることを確認することです。 PHPのコンストラクターの標準名は__construct()です。
元のコード問題分析:提供された元のコードで、患者クラスは患者情報を設定するためのレコードと呼ばれる方法を定義します。
クラス患者{ private $ name; プライベート$ age; プライベート$ジェンダー; パブリック関数レコード($ name、$ age、$ gender){//これは通常の方法です$ this-> name = $ name; $ this-> age = $ age; $ this-> gender = $ gender; } // ...ゲッターメソッド }
ただし、クリニッククラスの割り当て患者の方法では、患者オブジェクトを作成するときに新しい患者($ name、$ age、$ gender)が使用されます。
クラスクリニックは患者を拡張します{ // ... パブリック関数assignPatient($ name、$ age、$ gender){ $ this-> sistention [] = new患者($ name、$ age、$ gender); //コンストラクターにパラメーターを渡そうとします} // ... }
新しい患者($ name、$ age、$ gender)が呼ばれると、PHPはこれらのパラメーターを受け取るために患者クラスのコンストラクターを見つけようとします。 __constructは患者クラスで定義されていないため、これらのパラメーターは実際にはプロパティを初期化する方法に渡されず、新たに作成された患者オブジェクトの名前、$ age、および$ jenderプロパティがnullのままです。
解決策:__constructの名前の名前の名前を患者クラスのレコードメソッドの名前を__constructに変更して、実際のコンストラクターにします。
name = $ name; $ this-> age = $ age; $ this-> gender = $ gender; } パブリック関数getName(){ 返品$ this-> name; } public function getage(){ $ this-> ageを返します。 } パブリック関数getGender(){ $ this-> gender; } }
このように、新しい患者(「パトリックスター」、18、「男性」)が実行されると、__constructメソッドが自動的に呼び出され、$ name、$ age、$ gender属性が正しく初期化されます。
2。継承と構成を区別します
オブジェクト指向設計の2つのコア概念は、継承と構成です。それらを正しく選択することは、堅牢で保守可能なコードを構築するために不可欠です。
継承 - 「IS -A」関係: 1つのクラス(サブクラス)が別のクラス(親クラス)の特別なタイプの場合、継承を使用します。たとえば、犬は動物を伸ばします(犬は動物です)。サブクラスは、親クラスのすべての公共および保護されたプロパティと方法を継承します。
構成 - 「Has -A」関係:クラスに別のクラスのインスタンスがその属性としてインスタンスを含む場合、コンビネーションを使用します。たとえば、車にはエンジンがあります(車にはエンジンがあります)。これは、1つのオブジェクトが他のオブジェクトで構成されていることを意味します。
元のコードの問題の分析:元のコードでは、クリニッククラスが患者クラスを継承します:クラスクリニックは患者を拡張します。ビジネスロジックから、クリニック(クリニック)は患者(患者)ではありません。診療所は、患者ではなく、患者を持っているか管理する必要があります。 「IS-A」関係のこの誤った適用は、クラスデザインの混乱につながります。 $患者の配列は、クリニックのクラスで定義されて患者のオブジェクトを保存します。それ自体は、クリニックと患者の関係が「HAS-A」であることを示しています。
解決策:不適切な継承クリニッククラスの除去患者クラスを継承しないでください。組み合わせを通じて、その中に患者のオブジェクトのコレクションを維持する必要があります。
患者を返します。 } パブリック関数assignPatient($ name、$ age、$ gender){ //コンビネーションを通じて、クリニックは患者オブジェクトを作成および管理します$ this->患者[] = new患者($ name、$ age、$ gender); } パブリック関数deletepatient($ index){ unset($ this-> sistition [$ index]); //空のスペースを避けるために配列を再インドしますが、オプションですが、推奨されます$ this-> sistition = array_values($ this-> sistition); } }
3.完全に修正されたコードの例
上記の2つの修正を組み合わせることで、以下は最適化されたPHPコードです。
name = $ name; $ this-> age = $ age; $ this-> gender = $ gender; } パブリック関数getName(){ 返品$ this-> name; } public function getage(){ $ this-> ageを返します。 } パブリック関数getGender(){ $ this-> gender; } } クラスクリニック{ private $ ections = []; public function getPatients(){ $ this->患者を返します。 } パブリック関数assignPatient($ name、$ age、$ gender){ $ this-> sistention [] = new患者($ name、$ age、$ gender); } パブリック関数deletepatient($ index){ unset($ this-> sistition [$ index]); //アレイを再インドして、継続性を確保し、その後の操作で事故を回避する$ this-> sistrice = array_values($ this-> sistition); } } // $ Clinic = new Clinic(); $ clinic-> assigpatient( "Patrick Star"、18、 "Male"); $ clinic-> assigpatient( "Spongebob Squarepants"、17、 "Male"); $ clinic-> assigpatient( "eugene krab"、28、 "male"); $ Clinic-> DeletePatient(1); //インデックス1で患者を削除する(「スポンジボブスクエアパンツ」) print_r($ clinic-> getPatients()); ?>
コード出力:
配列 ( [0] =>患者オブジェクト ( [名前:患者:プライベート] =>パトリックスター [年齢:患者:プライベート] => 18 [性別:患者:プライベート] =>男性 )) [1] =>患者オブジェクト ( [名前:患者:プライベート] => Eugene Krab [年齢:患者:プライベート] => 28 [性別:患者:プライベート] =>男性 )) ))
出力からわかるように、患者オブジェクトの特性は正しく初期化され、クリニックオブジェクトは患者オブジェクトのコレクションを正しく管理します。 Deletepatient操作の後、配列も再セックスされます。
4.予防策とベストプラクティス
- コンストラクターの役割を説明します。__ constructメソッドを常に使用して、オブジェクトの基本的な状態を初期化します。オブジェクトが作成されている場合は、__constructがこれらのパラメーターを受信して処理できることを確認してください。
- 適切なクラスの関係を選択します。クラスを設計するときは、その関係が「IS-A」(継承)または「HAS-A」(組み合わせ)であるかどうかを慎重に考えてください。クラスの関係が誤っていると、不必要な複雑さ、維持が困難なコード、潜在的な論理エラーが発生する可能性があります。一般に、組み合わせは継承よりも柔軟性があり、より推奨されます。
- プライベート属性へのアクセス:属性がプライベートと宣言された後、クラス内でのみアクセスできます。これらの属性値を外部から取得する必要がある場合は、パブリックゲッターメソッド(getName()など)を提供する必要があります。
- アレイ操作後のReingex:配列から要素を解除する場合、配列のキーが連続しなくなる可能性があります。後続の操作が継続的な数値インデックスに依存している場合、$ this-> sistition = array_values($ this-> sistention);
これらの原則に従うことにより、PHPオブジェクト指向プログラミングで一般的なヌル値出力の問題は効果的に回避でき、より明確で堅牢で保守が簡単なアプリケーションを構築できます。
以上がPHPオブジェクト指向プログラミング:コンストラクターの正しい使用と継承と組み合わせの区別の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undress AI Tool
脱衣画像を無料で

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

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

Stock Market GPT
AIを活用した投資調査により賢明な意思決定を実現

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

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

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

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

usefilter_var()tovalidateemailsyntaxandcheckdnsrr()toverifydomainmxrecords.example:$ email = "user@example.com"; if($ email、filter_validate_email)

useunserialize(serialize($ obj))fordeepcopying whenalldataisserializable;それ以外の場合は、__clone()tomaniallyduplicatededededededavoidsharedReferenceを実装します。

usearray_merge()tocombinearrays、urblitingduplicatestringkeysandreindexingnumerickeys; forsimplerconcatenation、inthphp5.6、usethesplatoperator [... $ array1、... $ array2]。

NamesSpacesInphporganizeCodeandPreventnamingConflictsByGroupingClasses、インターフェイス、関数、およびコンテンダントアンダースピフィクティフィクティフィクティフィクティフィクショナル

the__call()メソッドは、customhandlingbyacceptingthemetodnameandarguments、ashownwhencollingdsslikesayhello()

toupdateadatabaserecordinphp、firstconnectusingpdoormysqli、thenuseprepreadedStatementStoeaseaseesecuresQlupDateQuery.example:$ pdo = newpdo( "mysql:host = localhost; dbname = your_database"、$ username、$ username、$ sibsfar

usepathinfo($ filename、pathinfo_extension)togetthefileextension; itreliailailavaliavelyhandlesmultipledotsendedgecases、returningtheextension(例えば、 "pdf")oranemptystringifnoneexists。

この記事では、MySQLで条件付き集計を実行するためにケースステートメントを使用して特定のフィールドの条件付き合計とカウントを実現する方法について説明します。実用的なサブスクリプションシステムケースを通じて、レコードステータス(「終了」や「キャンセル」など)に基づいてイベントの合計期間と数を動的に計算する方法を示し、それにより、複雑な条件集計のニーズを満たすことができない従来の合計関数の制限を克服します。チュートリアルでは、左の結合の可能性のあるヌル値を扱う際の合体の重要性を詳細に機能させて、sum機能のケースステートメントの適用を分析します。
