亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

目次
pimpleでサービスを定義する方法は?
サービスキーを使用して配列表記を使用して、Pimpleのサービスにアクセスできます。たとえば、次のようなメール送信者サービスにアクセスできます:
デフォルトでは、Pimpleはサービスにアクセスするたびにサービスの新しいインスタンスを返します。サービスを共有し、毎回同じインスタンスを返したい場合は、
はい、
ホームページ バックエンド開発 PHPチュートリアル PHPマスター|にきびによる依存噴射

PHPマスター|にきびによる依存噴射

Feb 24, 2025 am 08:57 AM

PHP Master | Dependency Injection with Pimple

コアポイント

  • 依存関係注射はアプリケーション開発の重要な概念であり、依存関係をハードコードではなくモジュールに注入することにより、より効率的で保守可能なコードを記述できます。
  • Pimpleは、PHPの閉鎖を使用して依存関係を管理しやすい方法で定義する?yún)g純な依存噴射コンテナです。
  • 依存関係を注入するための2つの主な手法は、コンストラクターベースの依存関係注入とセッターベースの注入であり、それぞれに獨(dú)自の利點(diǎn)と短所があります。
  • Pimpleは、依存関係を定義し、重複を回避し、アプリケーションでサービスを管理および集中させるのを容易にするコンテナとして機(jī)能することにより、ソフトウェア開発の乾燥した原理をサポートします。
  • Pimpleは、共有オブジェクトを使用して同じインスタンスを返す機(jī)能や、元の実裝に影響を與えることなく既存の閉鎖を動的に変更する機(jī)能などの高度な機(jī)能も提供します。

アプリケーション開発では、將來のプロジェクトでコードを再利用するスタンドアロンモジュールを作成しようとします。ただし、有用な機(jī)能を提供する完全に獨(dú)立したモジュールを作成することは困難です。これは、コードがモジュールにハードコードせずに適切に機(jī)能するために必要な依存関係を注入できるため、依存関係の注入が役立つ場所です。 Pimpleは、PHPの閉鎖を利??用して管理可能な方法で依存関係を定義する?yún)g純な依存噴射コンテナです。この記事では、ハードコーディングされた依存関係の問題、依存関係の噴射がこれらの問題をどのように解決するか、およびPimpleを使用して依存関係の噴射を容易にするコードを使用する方法を調(diào)査します。

特定の依存関係の問題

アプリケーションを作成するときは、多くのPHPクラスを使用します。クラスは、予想される機(jī)能を提供するために他の1つ以上のクラスのメソッドを呼び出す必要がある場合があるため、最初のクラスは他のクラスに依存すると言います。たとえば、

<?php
class A
{
    public function a1() {
        $b = new B();
        $b->b1();
    }
}

クラスAはクラスBに依存しますクラスBが利用できない場合、上記のコードは機(jī)能しません。さらに、クラス內(nèi)のオブジェクトの作成をハードコードするたびに、クラスに特定の依存関係があります。特定の依存関係は、テスト可能なコードを作成する障壁です。より良いアプローチは、クラスBのオブジェクトをクラスAに提供することです。これらのオブジェクトは、Aのコンストラクターまたはセッターメソッドで提供できます。さらに議論する前に、より現(xiàn)実的なシナリオを見てみましょう。

ソーシャルネットワークサイトでのコンテンツの共有は最近では非常に一般的であり、ほとんどのWebサイトはソーシャルプロファイルフィードがウェブサイトに直接表示されます。 Twitter、Facebook、Googleなどのソーシャルサイトからフィードを生成するSocialFeedsというクラスがあるとします。これらの各サービスを処理するための個(gè)別のクラスを作成します。ここでは、Twitterと対話するクラスTwitterServiceを見ていきます。 SocialFeedsクラスはTwitterServiceを使用してTwitterフィードを要求します。 TwitterServiceはデータベースと対話して、APIにアクセスする特定のユーザートークンを取得します。トークンはOAuthクラスに渡され、提供されたトークンを使用してフィードを取得し、SocialFeedsクラスに返します。

<?php
class A
{
    public function a1() {
        $b = new B();
        $b->b1();
    }
}
<?php
class SocialFeeds
{
    public function getSocialFeeds() {
        $twService = new TwitterService();
        echo $twService->getTweets();
    }
}
<?php
class TwitterService
{
    public function getTweets() {
        $db = new DB();
        $query = "Query to get user token from database";
        $token = $db->getQueryResults($query);

        $oauth = new OAuth();
        return $oauth->requestTwitterFeed($token);
    }
}
<?php
class OAuth
{
    public function requestTwitterFeed($token) {
        // Retrieve and return twitter feed using the token         
    }
}

SocialFeedsがTwitterserviceに依存していることは明らかです。しかし、TwitterServiceはDBとOAUTHに依存するため、ソーシャルフィードは間接的にDBとOAUTHに依存します。では、何が問題なのでしょうか? SocialFeedsは3つのクラスの具體的な実裝に依存しているため、他のクラスの実際の実裝なしにソーシャルフィードを個(gè)別にテストすることは不可能です。または、別のデータベースまたは別のOAUTHプロバイダーを使用すると仮定します。この場合、コード全體の既存のクラスを新しいクラスに置き換える必要があります。

特定の依存関係を修正

これらの依存関係の解決策は単純です。つまり、具體的な実裝を使用せずに必要に応じてオブジェクトを動的に提供します。依存関係を注入できる手法には、コンストラクターベースの依存関係注入とセッターベースのインジェクションの2種類があります。

コンストラクターベースの注入

コンストラクターベースの依存関係注入を使用して、依存関係オブジェクトは外部から作成され、クラスのコンストラクターにパラメーターとして渡されます。これらのオブジェクトをクラス変數(shù)に割り當(dāng)て、クラス內(nèi)のどこでも使用できます。 SocialFeedsクラスのコンストラクターベースの注入は次のとおりです。

<?php
class DB
{
    public function getQueryResults($query) {
        // Get results from database and return token
    }
}
TwitterServiceのインスタンスは、コンストラクターのオブジェクトとして渡されます。 SocialFeedsは依然としてTwitterServiceに依存していますが、今ではTwitterサービスプロバイダーのさまざまなバージョン、さらにはテスト目的のためにオブジェクトを模倣することさえできます。 TwitterServiceに関しては、DBおよびOAUTHクラスも同様の方法で定義されます。

<?php
class SocialFeeds
{
    public $twService;

    public function __construct($twService) {
        $this->twService = $twService;
    }

    public function getSocialFeeds() {
        echo $this->twService->getTweets();
    }
}

販売者ベースの注入

セッターベースのインジェクションを使用して、オブジェクトはコンストラクターの代わりにセッターメソッドによって提供されます。以下は、SocialFeedsクラスのセッターベースの依存関係インジェクションの実裝です。

初期化コードにはDBが含まれ、OAuthは次のようになりました。
<?php
$db = new DB();
$oauth = new OAuth();
$twService = new TwitterService($db, $oauth);
$socialFeeds = new SocialFeeds($twService);
$socialFeeds->getSocialFeeds();

コンストラクターとセッター噴射
<?php
class SocialFeeds
{
    public $twService;

    public function getSocialFeeds() {
        echo $this->twService->getTweets();
    }

    public function setTwitterService($twService) {
        $this->twService = $twService;
    }
}

選択裝置ベースのインジェクションまたはセッターベースの注入はあなた次第です。コンストラクターベースの注入は、クラスをインスタンス化するためにすべての依存関係が必要な場合に適しています。セッターベースの注入は、毎回依存関係が必要ない場合に適しています。

プロ

コンストラクター - クラスのコンストラクターを見て、クラスのすべての依存関係を識別してください

    Setor -新しい依存関係を追加することは、新しいセッターメソッドを追加するのと同じくらい簡単で、既存のコードを壊さない
  • 短所

  • コンストラクター - 新しい依存関係を追加すると、コンストラクター全體に既存のコードを追加する必要があります。
  • setor-どこにも指定されていないため、必要な依存関係を手動で検索する必要があります
依存関係の注入とさまざまな注入技術(shù)を理解した後、今度はにきびとそれがどのように適合するかを見る時(shí)が來ました。

di におけるピンプルの役割

前述のテクニックを使用して依存関係を既に挿入できる場合、なぜニキビが必要なのか疑問に思うかもしれません。この質(zhì)問に答えるには、乾燥した原理を見る必要があります。

自分自身を繰り返さないでください(DRY)は、さまざまな情報(bào)の重複を減らすことを目的としたソフトウェア開発の原則です。これは、多層アーキテクチャで特に役立ちます。乾燥した原則の聲明は、「すべての知識の斷片には、システムに単一の明確な権威ある表現(xiàn)が必要だ」ということです。

コンストラクターベースの注入例を検討してください。 SocialFeedクラスのオブジェクトが必要になるたびに、依存関係をインスタンス化して渡すというセットアッププロセス全體を繰り返す必要があります。 Dryによると、メンテナンスの問題を防ぐために、そのようなコードを避ける必要があります。 Pimpleは、重複を避けるためにそのような依存関係を定義する容器として機(jī)能します。シンプルな例を見て、にきびがどのように機(jī)能するかを見てみましょう。

依存関係を保存するための容器としてpimpleのインスタンスを作成します。 SPL ArrayAccessインターフェイスを?qū)g裝するため、それを使用することは配列の使用に非常に似ています。まず、必要なクラスの名前を保持するキーを定義します。次に、閉鎖を定義して、サービスとして機(jī)能する指定されたクラスのインスタンスを返します。コンテナのインスタンスは$ Cに渡されるため、必要に応じて他の定義されたキーを參照できます。これで、クラスのインスタンスが必要なときはいつでも、キーを參照してオブジェクトを取得できます。 SocialFeedsの例をPimpleに変換しましょう。公式のPimple Webサイトの例は、コンストラクターベースの注入を示しているため、セッターベースの注入を説明します。 Pimpleを使用するには、以前に定義されたセッターメソッドやコードを変更する必要はないことを忘れないでください。ロジックをカプセル化するだけです。
<?php
class A
{
    public function a1() {
        $b = new B();
        $b->b1();
    }
}

DBとOAUTHクラスはどちらも獨(dú)立したモジュールであるため、閉鎖內(nèi)で新しいインスタンスを直接返します。次に、セッターベースのインジェクションを使用して、Twitterserviceクラスに依存関係を追加します。 DBとOAUTHクラスをコンテナに追加したため、$ C ['db']および$ c ['oauth']を使用して、関數(shù)內(nèi)に直接アクセスできます。これで、依存関係はサービスとしてコンテナ內(nèi)にカプセル化されます。別のDBクラスまたは別のOAuthサービスを使用したいときはいつでも、コンテナステートメントのクラスを交換するだけで、すべてが完全に実行されます。 Pimpleを使用すると、1つの場所に新しい依存関係を追加するだけです。
<?php
class SocialFeeds
{
    public function getSocialFeeds() {
        $twService = new TwitterService();
        echo $twService->getTweets();
    }
}

高度なpimple使用

上記のシナリオでは、Pimpleは要求されるたびに各クラスの新しいインスタンスを閉鎖から返します。場合によっては、データベースに接続するなど、毎回新しいインスタンスを初期化せずに同じオブジェクトを使用する必要があります。 Pimpleは、共有オブジェクトを使用して同じインスタンスを返す機(jī)能を提供します。

また、これまでのところ、にきび容器內(nèi)の単一の場所ですべての依存関係を定義しています。ただし、依存関係を持つが元のサービスとはわずかに異なる構(gòu)成を行うサービスが必要な場合を検討してください。たとえば、ORMにアクセスしてTwitterServiceクラスの機(jī)能を?qū)g裝する必要があるとします。既存の閉鎖は、すべての既存の関數(shù)をORMの使用に強(qiáng)制するため、変更することはできません。 Pimpleは、元の実裝に影響を與えることなく、既存の閉鎖を動的に変更するためのextend()メソッドを提供します。次のコードを検討してください:

<?php
class A
{
    public function a1() {
        $b = new B();
        $b->b1();
    }
}

ここで、特別な場合にTweet_Serviceのさまざまな拡張バージョンを使用できます。最初のパラメーターはサービスの名前で、2番目のパラメーターはオブジェクトインスタンスとコンテナにアクセスできる関數(shù)です。実際、extend()は、さまざまな狀況に合わせて依存関係を動的に追加する強(qiáng)力な方法ですが、重複コードの量を増やすため、拡張バージョンのサービスを最小限に制限してください。

<?php
class SocialFeeds
{
    public function getSocialFeeds() {
        $twService = new TwitterService();
        echo $twService->getTweets();
    }
}

概要

依存関係の管理は、Webアプリケーション開発における最も重要で困難なタスクの1つです。コンストラクターとセッターメソッドの依存関係注入を使用して、それらを効果的に管理できます。ただし、依存関係の注入自體にもいくつかの問題があり、Pimpleはこれらの問題を解決し、軽量の容器を提供してオブジェクトの依存関係を乾燥方法で作成および保存することで解決します。以下のコメントで、プロジェクトの依存関係の管理と依存関係の挿入容器としてのPimpleについての考えを自由に共有してください。

における依存性注入についてのFAQ(FAQ)

にきびとは何ですか?なぜPHPで使用されているのですか?

Pimpleは、アプリケーションのサービスを管理および集中化できる?yún)g純なPHP依存噴射コンテナです。 PHPで使用されているため、コードの柔軟性が高まり、再利用可能で、テストが容易になります。 Pimpleを使用することにより、オブジェクトを1つの場所にインスタンス化し、アプリケーションのさまざまな部分に注入して、グローバル狀態(tài)の必要性を減らし、コードを維持とテストしやすくすることができます。

にきびはどのように機(jī)能しますか?

Pimpleは、コンテナにサービス定義を保存することで機(jī)能します。これらの定義は呼び出され(関數(shù)または方法)、??サービスのインスタンスを返します。コンテナからサービスにアクセスすると、Pimpleはサービス定義を?qū)g行してサービスオブジェクトを作成します。これにより、アプリケーション全體で集中的にサービスを管理し、サービスを共有できます。

pimpleをインストールする方法は?

Pimpleは、Composer(PHPの依存関係管理ツール)を使用してインストールできます。 Composerをシステムにグローバルにインストールしてから、コマンドを?qū)g行してプロジェクトにPimpleを?qū)毪扦蓼埂?

pimpleでサービスを定義する方法は?

Pimpleでは、コンテナ內(nèi)のキーに呼び出し可能なオブジェクトを割り當(dāng)てることにより、サービスを定義できます。呼び出し可能なオブジェクトは、サービスのインスタンスを返す必要があります。たとえば、このようなメール送信者クラスのサービスを定義できます。

$container['mailer'] = function ($c) { return new Mailer($c['smtp']); }; この例では、メール送信者サービスは、SMTPサービスが依存関係として挿入されるメーラークラスの新しいインスタンスとして定義されます。

pimpleでサービスにアクセスする方法は?

サービスキーを使用して配列表記を使用して、Pimpleのサービスにアクセスできます。たとえば、次のようなメール送信者サービスにアクセスできます:

。サービスにアクセスすると、Pimpleはサービス定義を?qū)g行し、サービスオブジェクトを返します。

$mailer = $container['mailer'];にきびでサービスを共有する方法は?

デフォルトでは、Pimpleはサービスにアクセスするたびにサービスの新しいインスタンスを返します。サービスを共有し、毎回同じインスタンスを返したい場合は、

メソッドを使用できます。たとえば、このようなメール送信者サービスを共有できます:

share() $container['mailer'] = $container->share(function ($c) { return new Mailer($c['smtp']); });サービスをPimpleで拡張できますか?

はい、

メソッドを使用して、Pimpleでサービスを拡張できます。これにより、サービスを定義した後に変更することができます。たとえば、このようなメール送信者サービスを拡張して、構(gòu)成を追加できます。

extend()

この例では、メソッドは、パラメーターとして

サービスを使用してメール送信者サービスで呼び出されます。 $container['mailer'] = $container->extend('mailer', function ($mailer, $c) { $mailer->setFrom($c['email.from']); return $mailer; });

にきびのパラメーターを保護(hù)する方法は?

setFrom() in pimpleでは、email.fromメソッドを使用してパラメーターを保護(hù)できます(サービスのパラメーターと見なされるべきではありません)。これにより、サービスをサービスの定義として扱うことなく、コンテナに値を保存できます。たとえば、次のような構(gòu)成値を保護(hù)できます:

プロジェクトでPimpleを使用する方法は?

protect()PimpleContainerクラスの新しいインスタンスを作成し、そこでサービスを定義することにより、プロジェクトでPimpleを使用できます。その後、アプリケーションで必要なコンテナからサービスにアクセスできます。これにより、中央集中型の方法でサービスを管理し、アプリケーションのさまざまな部分に注入できます。 $container['config.value'] = $container->protect(function () { return 'value'; });

にきびを使用することの利點(diǎn)は何ですか?

Pimpleは、PHP開発に多くの利點(diǎn)を提供します。集中型の方法でサービスを管理できるため、コードがより柔軟になります。コードは、アプリケーション全體でサービスを共有できるため、再利用を容易にします。テストのためにモックサービスを注入できるため、コードがテストを容易にします。 Pimpleを使用することにより、コードの品質(zhì)を向上させ、維持とテストを容易にすることができます。

以上がPHPマスター|にきびによる依存噴射の詳細(xì)內(nèi)容です。詳細(xì)については、PHP 中國語 Web サイトの他の関連記事を參照してください。

このウェブサイトの聲明
この記事の內(nèi)容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰屬します。このサイトは、それに相當(dāng)する法的責(zé)任を負(fù)いません。盜作または侵害の疑いのあるコンテンツを見つけた場合は、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 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

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

SublimeText3 中國語版

SublimeText3 中國語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

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

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

PHP変數(shù)スコープは説明されています PHP変數(shù)スコープは説明されています Jul 17, 2025 am 04:16 AM

PHP変數(shù)スコープの一般的な問題とソリューションには次のものが含まれます。1。グローバル変數(shù)は関數(shù)內(nèi)でアクセスできず、グローバルキーワードまたはパラメーターを使用して渡す必要があります。 2。靜的変數(shù)は靜的で宣言され、1回のみ初期化され、値は複數(shù)の呼び出し間で維持されます。 3. $ _GETや$ _POSTなどのハイパーグローバル変數(shù)は、任意の範(fàn)囲で直接使用できますが、安全なフィルタリングに注意を払う必要があります。 4.匿名関數(shù)は、使用キーワードを使用して親スコープ変數(shù)を?qū)毪工氡匾ⅳ?、外部変?shù)を変更する場合は、參照を渡す必要があります。これらのルールを習(xí)得すると、エラーを回避し、コードの安定性が向上するのに役立ちます。

ファイルアップロードをPHPで安全に処理する方法は? ファイルアップロードをPHPで安全に処理する方法は? Jul 08, 2025 am 02:37 AM

PHPファイルのアップロードを安全に処理するには、ソースとタイプを確認(rèn)し、ファイル名とパスを制御し、サーバー制限を設(shè)定し、メディアファイルを2回プロセスする必要があります。 1.トークンを介してCSRFを防ぐためにアップロードソースを確認(rèn)し、ホワイトリストコントロールを使用してFINFO_FILEを介して実際のMIMEタイプを検出します。 2。ファイルをランダムな文字列に変更し、検出タイプに従って非WEBディレクトリに保存する拡張機(jī)能を決定します。 3。PHP構(gòu)成は、アップロードサイズを制限し、一時(shí)的なディレクトリnginx/apacheはアップロードディレクトリへのアクセスを禁止します。 4. GDライブラリは寫真を再利用して、潛在的な悪意のあるデータをクリアします。

PHPでコードをコメントします PHPでコードをコメントします Jul 18, 2025 am 04:57 AM

PHPコメントコードには3つの一般的な方法があります。1。//#を使用して1行のコードをブロックすると、//を使用することをお勧めします。 2。使用/.../複數(shù)の行でコードブロックをラップするには、ネストすることはできませんが交差することができます。 3. / if(){}を使用するなどの組み合わせスキルコメントロジックブロックを制御するか、エディターショートカットキーで効率を改善するには、シンボルを閉じることに注意を払い、使用時(shí)にネストを避ける必要があります。

発電機(jī)はPHPでどのように機(jī)能しますか? 発電機(jī)はPHPでどのように機(jī)能しますか? Jul 11, 2025 am 03:12 AM

ageneratorinphpisamemory-efficientwaytoateate-overdeatatasetasetasetasetsinging valueseintimeintimeturningthemallatonce.1.generatorsususedeywordproducevaluesedemand、memoryusage.2を還元すること。2

PHPコメントを書くためのヒント PHPコメントを書くためのヒント Jul 18, 2025 am 04:51 AM

PHPコメントを書くための鍵は、目的と仕様を明確にすることです。コメントは、「何が行われたのか」ではなく「なぜ」を説明する必要があり、冗長性や単純さを避けてください。 1.読みやすさとツールの互換性を向上させるために、クラスおよびメソッドの説明にdocblock(/*/)などの統(tǒng)合形式を使用します。 2。JSジャンプを手動で出力する必要がある理由など、ロジックの背後にある理由を強(qiáng)調(diào)します。 3.複雑なコードの前に概要説明を追加し、手順でプロセスを説明し、全體的なアイデアを理解するのに役立ちます。 4. TodoとFixmeを合理的に使用して、To Doアイテムと問題をマークして、その後の追跡とコラボレーションを促進(jìn)します。優(yōu)れた注釈は、通信コストを削減し、コードメンテナンスの効率を向上させることができます。

クイックPHPインストールチュートリアル クイックPHPインストールチュートリアル Jul 18, 2025 am 04:52 AM

to installphpquickly、usexampponwindowsorhomebrewonmacos.1.onwindows、downloadandinstallxampp、selectcomponents、startapache、andplacefilesinhtdocs.2

PHPのインデックスごとに文字列內(nèi)の文字にアクセスする方法 PHPのインデックスごとに文字列內(nèi)の文字にアクセスする方法 Jul 12, 2025 am 03:15 AM

PHPでは、四角い括弧または巻き毛裝具を使用して文字列固有のインデックス文字を取得できますが、正方形のブラケットをお勧めします。インデックスは0から始まり、範(fàn)囲外のアクセスはnull値を返し、値を割り當(dāng)てることができません。 MB_SUBSTRは、マルチバイト文字を処理するために必要です。例:$ str = "hello"; echo $ str [0];出力h; MB_Substr($ str、1,1)などの漢字は、正しい結(jié)果を得る必要があります。実際のアプリケーションでは、ループする前に文字列の長さをチェックする必要があり、ダイナミック文字列を有効性のために検証する必要があり、多言語プロジェクトはマルチバイトセキュリティ関數(shù)を均一に使用することをお勧めします。

PHPの學(xué)習(xí):初心者向けガイド PHPの學(xué)習(xí):初心者向けガイド Jul 18, 2025 am 04:54 AM

tolearnphpefctivially、startbysettingupalocalserverenvironmentusingtoolslikexamppandacodeeditorlikevscode.1)instalxamppforapa Che、mysql、andphp.2)useocodeeditorforsyntaxsupport.3)testyoursetup withasimplephpfile.next、Learnpbasicsincludingvariables、ech

See all articles