PHP デカップリングのトリプル レルムのサンプル コード (サービス コンテナーの簡単な説明)

黄舟
リリース: 2023-03-06 15:46:01
オリジナル
1370 人が閲覧しました

この記事では主に、PHP のデカップリング (サービス コンテナーの簡単な説明) の 3 つの領域の関連知識を紹介します。非常に良い基準値を持っています。以下のエディターで見てみましょう

この記事を読む前に、PHP 構文オブジェクト指向

ソフトウェア プロジェクト全体の開発を完了する過程で、次のことをマスターする必要があります。複数人で協力する必要がある場合もありますが、単独で完成させることもできますが、コードの量が増えると「制御不能」になり、徐々に「醜いインターフェースと汚い実装」になってしまいます。プロジェクトのメンテナンスが持続不可能なほど増加し、リファクタリングまたは再開発のみが行われます。

第 1 レベル

仮説のシナリオ: セッション、データベース、ファイル システムを同時に操作できる処理クラスを作成する必要があります。これを書くかもしれません。

レルムの特徴: 実行可能ですが、結合が激しい


class DB{
 public function DB($arg1,$arg2){
 echo 'constructed!'.PHP_EOL;
 }
}
class FileSystem{
 public function FileSystem($arg1,$arg2){
 echo 'constructed!'.PHP_EOL;
 }
}
class Session{
 public function Session($arg1,$arg2){
 echo 'constructed!'.PHP_EOL;
 }
}
class Writer{
 public function Write(){
 $db=new DB(1,2);
 $filesystem=new FileSystem(3,4);
 $session=new Session(5,6);
 }
}
$writer=new Writer();
$writer->write();
ログイン後にコピー

パブリック関数でオブジェクトを構築する場合、データベースパラメータなどの変更が含まれる場合、変更は非常に困難です 膨大な作業負荷

2. Writer クラスの設計を担当する人は、DB や他のクラスのさまざまな API に精通している必要があります

カップリング?

第 2 レベル (パラメータの依存性) 仮説のシナリオ: 顧客が異なるため、データベース アドレスを頻繁に変更する必要がある場合でも、DB に呼び出されるクラスが多数あることを望みます。データベース アドレスが変更されるため、これらのクラスのコードを変更する必要はありません。

class DB{
 public function DB($arg1,$arg2){
 echo 'constructed!'.PHP_EOL;
 }
}
class FileSystem{
 public function FileSystem($arg1,$arg2){
 echo 'constructed!'.PHP_EOL;
 }
}
class Session{
 public function Session($arg1,$arg2){
 echo 'constructed!'.PHP_EOL;
 }
}
class Writer{
 protected $_db;
 protected $_filesystem;
 protected $_session;
 public function Set($db,$filesystem,$session){
 $this->_db=$db;
 $this->_filesystem=$filesystem;
 $this->_session=$session;
 }
 public function Write(){

 }
}
$db=new DB(1,2);
$filesystem=new FileSystem(3,4);
$session=new Session(5,6);
$writer=new Writer();
$writer->Set($db,$filesystem,$session);
$writer->write();
ログイン後にコピー

DB クラスの構造はクライアントに移動されましたが、変更が含まれると作業負荷は大幅に軽減されますが、新たな問題が発生します。Writer クラスを作成するには、まず Writer クラスを作成する必要があります。 DB クラス、FileSystem クラスなどです。これは、Writer クラスの責任者にとって非常に負担がかかります。作成する前に、他のクラスのドキュメントを 1 つずつ読み込んで作成する必要があります (初期化が必要な場合もあります)。作家

変数

が欲しいのです。


そのため、Writer クラスを作成する人々が、パラメータを入力することなく、より高速なインターフェイスを使用して必要なクラスを作成して呼び出すことができるように、より良い記述方法が存在することを願っています。

第 3 レベル (IOC コンテナ)

最初の 2 つのレベルの後、次の利点を追加したいと考えています:

1. DB クラス、Session クラス、および FileSystem クラス。 $db=new DB(arg1,arg2); のような文を書くなど、毎回面倒な初期化を行う必要はありません。

2. DB および他のタイプのオブジェクトは「グローバル」であり、プログラム全体の実行中にいつでも呼び出すことができることが望まれます。

3. DB やその他の型を呼び出すプログラマは、このクラスの詳細を知る必要はなく、string のエイリアスを使用してそのようなオブジェクトを作成することもできます。

上記の目標を達成できるのは IOC コンテナです。単純に IOC コンテナをグローバル変数と見なし、関連付けられた 配列 を使用して文字列を コンストラクター にバインドできます。

最初にコンテナクラスを実装します

class Container{
 public $bindings;
 public function bind($abstract,$concrete){
 $this->bindings[$abstract]=$concrete;
 }
 public function make($abstract,$parameters=[]){
 return call_user_func_array($this->bindings[$abstract],$parameters);
 }
}
ログイン後にコピー

サービス登録(バインディング)


$container=new Container();
$container->bind('db',function($arg1,$arg2){
 return new DB($arg1,$arg2);
});
$container->bind('session',function($arg1,$arg2){
 return new Session($arg1,$arg2);
});
$container->bind('fs',function($arg1,$arg2){
 return new FileSystem($arg1,$arg2);
});
ログイン後にコピー

コンテナの依存関係


class Writer{
 protected $_db;
 protected $_filesystem;
 protected $_session;
 protected $container;
 public function Writer(Container $container){
 $this->_db=$container->make('db',[1,2]);
 $this->_filesystem=$container->make('session',[3,4]);
 $this->_session=$container->make('fs',[5,6]);
 }
}
$writer=new Writer($container);
ログイン後にコピー

以上がPHP デカップリングのトリプル レルムのサンプル コード (サービス コンテナーの簡単な説明)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!