国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

ホームページ バックエンド開発 PHPチュートリアル PHP OOP 部分構(gòu)成と継承および依存関係の注入

PHP OOP 部分構(gòu)成と継承および依存関係の注入

Jan 05, 2025 am 12:14 AM

PHP OOP Part-Composition vs Inheritance and Dependency Injection

このシリーズでは、PHP オブジェクト指向プログラミング (OOP) の基礎(chǔ)について説明します。コンテンツは連続したパートに編成され、それぞれが特定のトピックに焦點(diǎn)を當(dāng)てます。初心者または OOP の概念に慣れていない場(chǎng)合、このシリーズは段階的にガイドできるように設(shè)計(jì)されています。 このパートでは、PHP における合成と継承および依存関係の挿入について説明します。一緒に PHP OOP を?qū)Wぶ旅を始めましょう!

構(gòu)成と継承

オブジェクト指向プログラミングにおける親クラスと子クラスの関係についてはすでに學(xué)習(xí)しており、子クラスが親クラスを継承し、そこからすべてにアクセスできることがわかりました。これは継承として知られています。

一方、コンポジションとは、親クラスを継承するのではなく、子クラスのプロパティ値として割り當(dāng)てることを指します。これにより、親クラスからすべてにアクセスできます。これは合成として知られています。

以下は、構(gòu)成と継承を説明する例です。

コード例

class Link
{
   public string $name;
   public string $type;

   public function create($name, $type)
   {
      $this->name = $name;
      $this->type = $type;
   }

   public function show()
   {
      echo "name: $this->name, type: $this->type";
   }
}


// Inheritance example
class ShoLink extends Link
{
   // other functionalities
}


// Composition example
class User
{
   public Link $link;

   public function __construct()
   {
      $this->link = new Link();
   }
   // other functionalities
}

$user = new User();
$user->link->create("Jamir", "Short");

最初の例では、ShoLink クラスが Link クラスを継承していることがわかります。一方、2 番目の例では、User クラスは Link クラスを継承しません。代わりに、Link クラスのインスタンスをそのプロパティの 1 つに割り當(dāng)てます。その結(jié)果、両方の子クラスの Link クラスからすべてにアクセスできるようになります。

ここで、継承を使用してすべてにアクセスできるのであれば、なぜ合成を使用する必要があるのでしょうか?という疑問が生じるかもしれません。結(jié)局のところ、合成では、追加のプロパティを宣言し、構(gòu)築を通じてその値を設(shè)定する必要があります。これは余分な作業(yè)のように思えますが、合成を使用する利點(diǎn)は何でしょうか?

そうですね、継承により、親クラス內(nèi)のすべてのものに子クラスからアクセスできるようになることがわかりました。したがって、親クラスの特定のメソッドを使用したくない場(chǎng)合でも、親クラスの一部のプロパティやメソッドが子クラスで必要ない場(chǎng)合でも、それらがパブリック メンバーまたは保護(hù)されたメンバーであれば、子クラスでアクセスできるようになります。 .

この問題を解決するには、合成を使用します。合成を使用すると、親クラスの必要な部分のみを子クラスでアクセスできるようにすることができます。別の例でこれをさらに明確にしてみましょう。

Link クラスをよく見ると、show メソッドがあることがわかります。このメソッドを使用すると、ShoLink クラスで作成されたリンクを直接表示できます。

しかし、User クラスでユーザー用に作成されたリンクを誰も直接表示できないようにしたい場(chǎng)合はどうすればよいでしょうか?代わりに、ユーザーのリンクをプロフィールの橫に表示することもできます。

これが、User クラスで Link クラスを継承する代わりに、合成を通じてアクセスしている理由です。その結(jié)果、誰も User クラスを介してユーザーのリンクを直接表示することはできませんが、ShoLink クラスのリンクを直接表示することはできます。

継承より合成を優(yōu)先する

これで、合成について、また特定の問題を解決するために継承の代わりにそれを使用する場(chǎng)合についてある程度理解できました。 OOP には「継承よりも合成を優(yōu)先する」という原則があり、これは継承よりも合成を優(yōu)先することを意味します。言い換えれば、親クラスからすべてにアクセスする必要がない子クラスの場(chǎng)合は、常に継承よりも合成を優(yōu)先する必要があります。

ここで、疑問が生じます。いつ合成を使用し、いつ継承を使用するかをどのように決定するのでしょうか?

この場(chǎng)合、次の 2 種類の関係に基づいて決定する必要があります。

  1. は -> です。関係。関係が「である」場(chǎng)合は、継承を使用する必要があります。
  2. には -> があります。関係。関係が「ある」場(chǎng)合は、合成を使用する必要があります。

コード例

class Link
{
   public string $name;
   public string $type;

   public function create($name, $type)
   {
      $this->name = $name;
      $this->type = $type;
   }

   public function show()
   {
      echo "name: $this->name, type: $this->type";
   }
}


// Inheritance example
class ShoLink extends Link
{
   // other functionalities
}


// Composition example
class User
{
   public Link $link;

   public function __construct()
   {
      $this->link = new Link();
   }
   // other functionalities
}

$user = new User();
$user->link->create("Jamir", "Short");

上記の ShoLink クラスの例を見ると、ShoLink クラスが Link クラスから継承していることがわかります。したがって、それらの間の関係を定義するとしたら、ShoLink は本質(zhì)的にリンクの一種であるため、その関係は ShoLink はリンクであるということになります。

コード例

// Inheritance example
class ShoLink extends Link
{
   // other functionalities
}

ここで、上記の User クラスの例を見ると、User クラスが Link クラスとの合成を使用していることがわかります。したがって、これらの間の関係を定義するとしたら、ユーザーはリンクではないため、その関係は「ユーザーはリンクを持っている」ということになりますが、ユーザーはリンクを持つことも、リンクを所有することもできます。

それぞれをいつ使用するか、さまざまな狀況でどれを優(yōu)先するかなど、構(gòu)成と継承についてより明確に理解できたと思います。

依存関係の注入

依存関係の注入を理解する前に、まず依存関係とは何かを理解する必要があります。依存関係とは、子クラスが継承または合成によって別のクラスのメンバーを使用することです。その場(chǎng)合、親クラスは子クラスの依存関係になります。

上記の例では、継承の代わりに合成を使用する場(chǎng)合、子クラスでプロパティを宣言し、コンストラクターを介して親クラスのインスタンスをそのプロパティに割り當(dāng)てる必要があることがわかりました。したがって、User クラスを使用する場(chǎng)合は、User クラスが Link クラスに依存しているため、そのコンストラクターで Link クラスをインスタンス化する必要があります。言い換えれば、Link クラスは User クラスの依存関係です。ここでの問題は、Link クラスのインスタンス化プロセスが User クラス內(nèi)で密接に結(jié)合されていることです。

問題は、Link クラスのインスタンス化が制限されており、User クラスに固有であることです。 Link クラスの代わりに他のクラスを外部から User クラスに渡したい場(chǎng)合、コンストラクターで Link クラスのインスタンスを明示的に作成し、それを Link プロパティに割り當(dāng)てるため、それはできません。これは密結(jié)合依存関係と呼ばれ、この依存関係を外部から変更できないことを意味します。

しかし、コンストラクター內(nèi)で Link クラスを自分たちでインスタンス化せず、代わりにユーザーに任せる場(chǎng)合、つまりユーザーが User クラスを使用するときに、Link クラスの依存関係を User クラスに渡すことになる場(chǎng)合、問題は次のようになります。解決しました。

以下のコード例を見てみましょう。

コード例

class Link
{
   public string $name;
   public string $type;

   public function create($name, $type)
   {
      $this->name = $name;
      $this->type = $type;
   }

   public function show()
   {
      echo "name: $this->name, type: $this->type";
   }
}


// Inheritance example
class ShoLink extends Link
{
   // other functionalities
}


// Composition example
class User
{
   public Link $link;

   public function __construct()
   {
      $this->link = new Link();
   }
   // other functionalities
}

$user = new User();
$user->link->create("Jamir", "Short");

この例では、User クラスのコンストラクターで Link クラスをインスタンス化する代わりに、Link クラスの依存関係を外部から User クラスに渡していることがわかります。ユーザーを介して依存関係を User クラスに渡すこのプロセスは、依存関係の注入と呼ばれます。言い換えれば、Link クラスの依存関係を外部から注入またはプッシュしています。これは疎結(jié)合依存関係として知られており、この依存関係を外部から簡(jiǎn)単に変更できることを意味します。

Link クラスにも獨(dú)自の依存関係がある場(chǎng)合、User クラスを介して外部からその依存関係を注入することもできます。次に、Link クラスのインスタンスを User クラスに注入するだけです。その結(jié)果、ユーザーが外部から処理するため、User クラス內(nèi)の Link クラスの依存関係について心配する必要がなくなります。

以下のコード例を見てみましょう。

コード例

// Inheritance example
class ShoLink extends Link
{
   // other functionalities
}

このようにすると、外部から必要なだけ依存関係を注入でき、より柔軟になります。今日はここまでです。次のレッスンで話します。

GitHub や Linkedin で私とつながることができます。

以上がPHP OOP 部分構(gòu)成と継承および依存関係の注入の詳細(xì)內(nèi)容です。詳細(xì)については、PHP 中國(guó)語 Web サイトの他の関連記事を參照してください。

このウェブサイトの聲明
この記事の內(nèi)容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰屬します。このサイトは、それに相當(dāng)する法的責(zé)任を負(fù)いません。盜作または侵害の疑いのあるコンテンツを見つけた場(chǎng)合は、admin@php.cn までご連絡(luò)ください。

ホットAIツール

Undress AI Tool

Undress AI Tool

脫衣畫像を無料で

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

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

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

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

SublimeText3 中國(guó)語版

SublimeText3 中國(guó)語版

中國(guó)語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強(qiáng)力な PHP 統(tǒng)合開発環(huán)境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

PHPベースのAPIをバージョン化するためのベストプラクティスは何ですか? PHPベースのAPIをバージョン化するためのベストプラクティスは何ですか? Jun 14, 2025 am 12:27 AM

Toversionaphp Basedificefectivivivity、useurl Basedversioning forclarity-andeaseaseasedease、depateversionedcodetoavoidconflicts、deprecateoldversions withclearcommunication、andconsider-customheadersally whendary.starttheversionionintheurl(e.g。、/api/v

PHPに認(rèn)証と承認(rèn)を?qū)g裝するにはどうすればよいですか? PHPに認(rèn)証と承認(rèn)を?qū)g裝するにはどうすればよいですか? Jun 20, 2025 am 01:03 AM

tosecurelyhandLeauthenticationAndauthorizationInizationInization、followTheSteps:1.LwayShashPasswordswithPassword_hash()andverifyusingpassword_verify()、usepreparedStatementStatementStatementStatementStatementStain、andstoreUserdatain $ _SessionAfterlogin.2.implementRementRementRementRementRementRementRementRole

PHPにおける手続き型とオブジェクト指向のプログラミングパラダイムの違いは何ですか? PHPにおける手続き型とオブジェクト指向のプログラミングパラダイムの違いは何ですか? Jun 14, 2025 am 12:25 AM

ProceduralAndObject-OrientedProgramming(OOP)InphpdifferSifically-datability、andDatahandling.1.proceduralprogramsessusessuseSideSized funized、surtableforsmallscript.2.ooporganizescodeIntoclassesandobjects、ModelingReal-worden

PHPの弱い參照(WeakMap)とは何ですか? PHPの弱い參照(WeakMap)とは何ですか? Jun 14, 2025 am 12:25 AM

phpdoesnothaveabuiltinweakmapbutofferswutreferenceforsimilarfunctionality.1.weakreferenceallowsholdingReferences withoutpreventinggarbagecollectrection.2.itisusfulfurcaching、eventlisteners、およびmetadatawithectingovecting objectinimulatea

PHPでファイルアップロードを安全に処理するにはどうすればよいですか? PHPでファイルアップロードを安全に処理するにはどうすればよいですか? Jun 19, 2025 am 01:05 AM

PHPでファイルアップロードを安全に処理するために、コアはファイルタイプを確認(rèn)し、ファイルの名前を変更し、権限を制限することです。 1。Finfo_File()を使用して実際のMIMEタイプを確認(rèn)し、Image/JPEGなどの特定のタイプのみが許可されます。 2。uniqid()を使用してランダムファイル名を生成し、非webルートディレクトリに保存します。 3. PHP.iniおよびHTMLフォームを介してファイルサイズを制限し、ディレクトリ権限を0755に設(shè)定します。 4. Clamavを使用してマルウェアをスキャンしてセキュリティを強(qiáng)化します。これらの手順は、セキュリティの脆弱性を効果的に防止し、ファイルのアップロードプロセスが安全で信頼性が高いことを確認(rèn)します。

PHPの==(ゆるい比較)と===(厳密な比較)の違いは何ですか? PHPの==(ゆるい比較)と===(厳密な比較)の違いは何ですか? Jun 19, 2025 am 01:07 AM

PHPでは、==と==の主な違いは、タイプチェックの厳格さです。 ==タイプ変換は比較の前に実行されます。たとえば、5 == "5"はtrueを返します。===リクエストは、trueが返される前に値とタイプが同じであることを要求します。たとえば、5 === "5"はfalseを返します。使用シナリオでは、===はより安全で、最初に使用する必要があります。==は、タイプ変換が必要な場(chǎng)合にのみ使用されます。

PHPのNOSQLデータベース(Mongodb、Redisなど)とどのように対話できますか? PHPのNOSQLデータベース(Mongodb、Redisなど)とどのように対話できますか? Jun 19, 2025 am 01:07 AM

はい、PHPは、特定の拡張機(jī)能またはライブラリを使用して、MongoDBやRedisなどのNOSQLデータベースと対話できます。まず、MongoDBPHPドライバー(PECLまたはComposerを介してインストール)を使用して、クライアントインスタンスを作成し、データベースとコレクションを操作し、挿入、クエリ、集約、その他の操作をサポートします。第二に、PredisライブラリまたはPhpredis拡張機(jī)能を使用してRedisに接続し、キー価値設(shè)定と取得を?qū)g行し、高性能シナリオにPhpredisを推奨しますが、Predisは迅速な展開に便利です。どちらも生産環(huán)境に適しており、十分に文書化されています。

PHP(、 - 、 *、 /、%)で算術(shù)操作を?qū)g行するにはどうすればよいですか? PHP(、 - 、 *、 /、%)で算術(shù)操作を?qū)g行するにはどうすればよいですか? Jun 19, 2025 pm 05:13 PM

PHPで基本的な數(shù)學(xué)操作を使用する方法は次のとおりです。1。追加標(biāo)識(shí)は、整數(shù)と浮動(dòng)小數(shù)點(diǎn)數(shù)をサポートし、変數(shù)にも使用できます。文字列番號(hào)は自動(dòng)的に変換されますが、依存関係には推奨されません。 2。減算標(biāo)識(shí)の使用 - 標(biāo)識(shí)、変數(shù)は同じであり、タイプ変換も適用されます。 3.乗算サインは、數(shù)字や類似の文字列に適した標(biāo)識(shí)を使用します。 4.分割はゼロで割らないようにする必要がある分割 /標(biāo)識(shí)を使用し、結(jié)果は浮動(dòng)小數(shù)點(diǎn)數(shù)である可能性があることに注意してください。 5.モジュラス標(biāo)識(shí)を採取することは、奇妙な數(shù)と偶數(shù)を判斷するために使用でき、負(fù)の數(shù)を処理する場(chǎng)合、殘りの兆候は配當(dāng)と一致しています。これらの演算子を正しく使用するための鍵は、データ型が明確であり、境界の狀況がうまく処理されるようにすることです。

See all articles