ホームページ  >  記事  >  バックエンド開発  >  PHP デカップリングの 3 つの領域を深く掘り下げる (サービス コンテナーについての簡単な説明)

PHP デカップリングの 3 つの領域を深く掘り下げる (サービス コンテナーについての簡単な説明)

迷茫
迷茫オリジナル
2017-03-26 10:28:341841ブラウズ

この記事を読む前に、次のことをマスターする必要があります: 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();

書くことの欠点:

1. データベースパラメータの変更が含まれると、修正が大変になります

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 やその他の型を呼び出すプログラマは、このクラスについて詳しく知る必要はなく、文字列エイリアスを使用してそのようなオブジェクトを作成することもできます。

上記の目標を達成できるのは 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 デカップリングの 3 つの領域を深く掘り下げる (サービス コンテナーについての簡単な説明)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。