ホームページ バックエンド開発 PHPチュートリアル 依存関係注入がどのように分離を実現するかを深く理解する

依存関係注入がどのように分離を実現するかを深く理解する

May 20, 2020 am 10:05 AM
ioc php

依存関係注入がどのように分離を実現するかを深く理解する

第 1 章: シャオ ミンと携帯電話

むかしむかし、シャオ ミンという名前の男がいました。

シャオミンには喫煙と飲酒という 3 つの大きな趣味があります... ああ、ごめんなさい、間違ったセットに行ってしまいました。それは、Zhihu を閲覧すること、King Pesticide をプレイすること、WeChat の赤い封筒を手に入れることであるはずです。

依存関係注入がどのように分離を実現するかを深く理解する

Xiao Ming の 3 つの主要な趣味

単純な疑似コードを使用して、そんなシャオミン

class Ming extends Person
{
    private $_name;
    private $_age;
    function read()
    {
        //逛知乎
    }
    function  play()
    {
        //玩农药
    }
    function  grab()
    {
        //抢红包
    }
}
ログイン後にコピー

しかし、人間であるシャオミンは、上記の機能を自分で実現することはできません。携帯電話に頼らざるを得ません。それで、iPhone6を購入しました。次に、iPhone6を1台作りましょう。

class iPhone6 extends Iphone
{
    function read($user="某人")
    {
        echo $user."打开了知乎然后编了一个故事 \n";
    }
    function play($user="某人")
    {
        echo $user."打开了王者农药并送起了人头 \n";
    }
    function grab($user="某人")
    {
        echo $user."开始抢红包却只抢不发 \n";
    }
}
ログイン後にコピー

シャオミンは新しい携帯電話をとても大切にしていて、毎日しっかりと手に持って管理しているので、シャオミンはこんな感じになります

class Ming extends Person
{
    private $_name;
    private $_age;
    public function  __construct()
    {
        $this->_name = '小明';
        $this->_age = 26;
    }
    function read()
    {
        //……  省略若干代码
        (new iPhone6())->read($this->_name); //逛知乎
    }
    function  play()
    {
        //……  省略若干代码
        (new iPhone6())->play($this->_name);//玩农药
    }
    function  grab()
    {
        //……  省略若干代码
        (new iPhone6())->grab($this->_name);//抢红包
    }
}
ログイン後にコピー

今日は土曜日なので、シャオミンは行かなくても大丈夫です仕事に行くため、彼は立ち上がって、Zhihuを閲覧し、King Pesticideをプレイし、赤い封筒を手に取りました。

$ming = new Ming();  //小明起床
$ming->read();
$ming->play();
$ming->grab();
ログイン後にコピー

現時点では、コマンド ラインで次のような出力が表示されます。

Xiao Ming は Zhihu を開いてストーリーを作成しました

Xiao Ming は King Pesticide を開いて、送信しました 殺されました

シャオミンは赤い封筒を掴み始めましたが、掴むことしかできませんでしたが、渡すことはできませんでした

この日、シャオミンは充実した人生を送っていました。世界で一番幸せな人。

第 2 章: シャオ ミンの喜びと悲しみ

シャオ ミンと彼の携帯電話はかつて一緒に素晴らしい時間を過ごしました。自由時間があるとき、シャオ ミンは携帯電話を使ってハグしました。電話をしたり、Zhihuを閲覧したり、Weiboを閲覧したり、ゲームをしたりする彼は、彼女はまったく必要なく、携帯電話がそばにあれば満足できると感じていました。

しかし、システムのアップデートが何度も繰り返されることで彼の夢は完全に打ち砕かれ、携帯電話の動作はますます遅くなり、バッテリーの寿命はますます短くなり、ある日、冷たい風の中、彼の携帯電話が壊れてしまうと誰が想像したでしょうか。ついに寒さに耐えられなくなり、振り返らずに電源を切りました。

シャオミンはとても悲しく、携帯電話を変えなければならないことに気づきました。

より良いユーザー エクスペリエンスを得るために、Xiao Ming は歯を食いしばって iPhone を購入しました彼が遭遇した問題の 1 つは、オリジナルの iPhone 6 に依存しすぎており、両者が深く結びついていたことでした。携帯電話を変更するには、ナイフを使って変身し、体内のすべての方法を取り除く必要があります。すべての iPhone6 は iPhoneX に置き換えられました。

長い変換プロセス

長い変換プロセスを経て、Xiao Ming は最終的にコード内のすべての iPhone6 を iPhoneX に置き換えました。とても大変ですが、シャオミンは幸せだと感じています。

そこでシャオミンさんは喜んで携帯電話を職場に持って行きましたが、帰り道に泥棒に盗まれてしまいました。緊急事態に備えて、シャオミンさんは廃棄されたばかりの iPhone 6 を再利用するしかありませんでしたが、長い変革のプロセスを考えると、言葉では言い表せないほど悔しくなり、携帯電話に依存しすぎていると感じました。携帯電話に何か問題が起こるたびに、彼は感じていたのですか? 彼は自分自身を変えなければなりません。これは単なる過剰結合ではなく、単に本末転倒です。彼は空に向かって叫びました、私はそれをしたくないですもう携帯電話を制御できません。

空の創造主、つまりプログラマーである私が彼の叫び声を聞きました。私は彼に言いました、もう携帯電話を制御する必要はありません、管理は私に任せてください、私に制御を与えてください. .これを制御の反転といいます。

第 3 章: 創造者の知恵

シャオ ミンは私の言葉を聞きました。彼は嬉しかったですが、少し怖がっていました。彼はひざまずき、何度かひれ伏しました。 「あなたが伝説の創造主、バグメック神であることが判明しました。携帯電話の制御を私の手からあなたに渡すという、制御反転の 4 つの言葉を言ったと聞きましたが、これは「それはあなたの考えにすぎません。単なる考えです。制御の逆転を達成し、携帯電話を使い続けることができるようにするには、どのような方法を使用できますか?」 その後、私は 4 つの大きな言葉を投げかけました。「依存関係の注入!」

次に、偉大な私がシャオ ミンに次のような非人道的な変更を加え始めました。

class Ming extends Person
{
    private $_name;
    private $_age;
    private $_phone; //将手机作为自己的成员变量
    public function  __construct($phone)
    {
        $this->_name = '小明';
        $this->_age = 26;
        $this->_phone = $phone;
        echo "小明起床了 \n";
    }
    function read()
    {
        //……  省略若干代码
        $this->_phone->read($this->_name); //逛知乎
    }
    function  play()
    {
        //……  省略若干代码
        $this->_phone->play($this->_name);//玩农药
    }
    function  grab()
    {
        //……  省略若干代码
        $this->_phone->grab($this->_name);//抢红包
    }
}
ログイン後にコピー

次は、ある日シャオ ミンを実行するシミュレーションをしてみましょう。

$phone = new IphoneX(); //创建一个iphoneX的实例
if($phone->isBroken()){//如果iphone不可用,则使用旧版手机
    $phone = new Iphone6();
}
$ming = new Ming($phone);//小明不用关心是什么手机,他只要玩就行了。
$ming->read();
$ming->play();
$ming->grab();
ログイン後にコピー

まず、iPhone が携帯電話かどうかを確認してみましょう体内に直接注射されるため、どの携帯電話を持っているかを気にする必要はなく、ただ直接使用するだけで済みます。

これは依存性注入です。

第 4 章: シャオ ミンの洞察

シャオ ミンの生活はよりシンプルになり始め、節約できたすべての時間をメモを書くことに費やしました。これをノートに書きましょう

私は以前、支配欲が強く携帯電話に頼りすぎていたため、携帯電話と自分との連動性が高く、携帯電話に少しでも問題がある限り、これは本当に時間の無駄です。間違いを犯しやすいのです。私が創造主に制御を委ねて以来、創造主は毎日私を起こす前にすでに携帯電話を選んでいますので、私はそれがどんな携帯電話であるかは気にせず、いつものようにそれで遊ぶだけで済みます。携帯電話に問題があっても、創造主が直接解決してくれるので、自分で改造する必要はありません。私は今、携帯電話を7台購入し、創造主に渡しています。毎日1台ずつ変えています。とても幸せです!

私はまた、次の洞察を得ました。クラス A の関数実装がクラス B の助けを必要とする場合、クラス B はクラス A の依存関係であると言われます。クラスがクラス A 内でインスタンス化される場合、Bの場合、2 つの間に高度な結合が存在します。クラス B に問題が発生すると、クラス A も変換する必要があります。そのような状況が多く、各クラス間に多くの依存関係がある場合は、次のような問題が発生します。一度の攻撃で全身が影響を受けると、プログラムの維持が非常に困難になり、問題が発生しやすくなります。この問題を解決するには、クラスBからクラスAの制御を取り出して第三者に引き渡す必要があり、第三者に制御を逆転させることを制御の反転(IOC Inversion Of Control)といいます。制御の反転は問題を解決できるアイデアと考えられる結果であり、依存関係の注入 (Dependency Injection) はその最も代表的な実装方法です。サードパーティ (これを IOC コンテナと呼びます) が依存関係を制御し、コンストラクター、属性、またはファクトリー パターンなどのメソッドを通じて依存関係をクラス A に注入することで、クラス A とクラス B を大幅に分離します。

推奨チュートリアル: 「PHP チュートリアル

以上が依存関係注入がどのように分離を実現するかを深く理解するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、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衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

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

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Dec 24, 2024 pm 04:42 PM

PHP 8.4 では、いくつかの新機能、セキュリティの改善、パフォーマンスの改善が行われ、かなりの量の機能の非推奨と削除が行われています。 このガイドでは、Ubuntu、Debian、またはその派生版に PHP 8.4 をインストールする方法、または PHP 8.4 にアップグレードする方法について説明します。

PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 Dec 20, 2024 am 11:31 AM

Visual Studio Code (VS Code とも呼ばれる) は、すべての主要なオペレーティング システムで利用できる無料のソース コード エディター (統合開発環境 (IDE)) です。 多くのプログラミング言語の拡張機能の大規模なコレクションを備えた VS Code は、

PHPでHTML/XMLを解析および処理するにはどうすればよいですか? PHPでHTML/XMLを解析および処理するにはどうすればよいですか? Feb 07, 2025 am 11:57 AM

このチュートリアルでは、PHPを使用してXMLドキュメントを効率的に処理する方法を示しています。 XML(拡張可能なマークアップ言語)は、人間の読みやすさとマシン解析の両方に合わせて設計された多用途のテキストベースのマークアップ言語です。一般的にデータストレージに使用されます

JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 Apr 05, 2025 am 12:04 AM

JWTは、JSONに基づくオープン標準であり、主にアイデンティティ認証と情報交換のために、当事者間で情報を安全に送信するために使用されます。 1。JWTは、ヘッダー、ペイロード、署名の3つの部分で構成されています。 2。JWTの実用的な原則には、JWTの生成、JWTの検証、ペイロードの解析という3つのステップが含まれます。 3. PHPでの認証にJWTを使用する場合、JWTを生成および検証でき、ユーザーの役割と許可情報を高度な使用に含めることができます。 4.一般的なエラーには、署名検証障害、トークンの有効期限、およびペイロードが大きくなります。デバッグスキルには、デバッグツールの使用とロギングが含まれます。 5.パフォーマンスの最適化とベストプラクティスには、適切な署名アルゴリズムの使用、有効期間を合理的に設定することが含まれます。

母音を文字列にカウントするPHPプログラム 母音を文字列にカウントするPHPプログラム Feb 07, 2025 pm 12:12 PM

文字列は、文字、数字、シンボルを含む一連の文字です。このチュートリアルでは、さまざまな方法を使用してPHPの特定の文字列内の母音の数を計算する方法を学びます。英語の母音は、a、e、i、o、u、そしてそれらは大文字または小文字である可能性があります。 母音とは何ですか? 母音は、特定の発音を表すアルファベットのある文字です。大文字と小文字など、英語には5つの母音があります。 a、e、i、o、u 例1 入力:string = "tutorialspoint" 出力:6 説明する 文字列「TutorialSpoint」の母音は、u、o、i、a、o、iです。合計で6元があります

今まで知らなかったことを後悔している 7 つの PHP 関数 今まで知らなかったことを後悔している 7 つの PHP 関数 Nov 13, 2024 am 09:42 AM

あなたが経験豊富な PHP 開発者であれば、すでにそこにいて、すでにそれを行っていると感じているかもしれません。あなたは、運用を達成するために、かなりの数のアプリケーションを開発し、数百万行のコードをデバッグし、大量のスクリプトを微調整してきました。

PHPでの後期静的結合を説明します(静的::)。 PHPでの後期静的結合を説明します(静的::)。 Apr 03, 2025 am 12:04 AM

静的結合(静的::) PHPで後期静的結合(LSB)を実装し、クラスを定義するのではなく、静的コンテキストで呼び出しクラスを参照できるようにします。 1)解析プロセスは実行時に実行されます。2)継承関係のコールクラスを検索します。3)パフォーマンスオーバーヘッドをもたらす可能性があります。

PHPマジックメソッド(__construct、__destruct、__call、__get、__setなど)とは何ですか? PHPマジックメソッド(__construct、__destruct、__call、__get、__setなど)とは何ですか? Apr 03, 2025 am 12:03 AM

PHPの魔法の方法は何ですか? PHPの魔法の方法には次のものが含まれます。1。\ _ \ _コンストラクト、オブジェクトの初期化に使用されます。 2。\ _ \ _リソースのクリーンアップに使用される破壊。 3。\ _ \ _呼び出し、存在しないメソッド呼び出しを処理します。 4。\ _ \ _ get、dynamic属性アクセスを実装します。 5。\ _ \ _セット、動的属性設定を実装します。これらの方法は、特定の状況で自動的に呼び出され、コードの柔軟性と効率を向上させます。

See all articles