この記事では主に、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();
書くことの欠点:
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 クラスを作成するには、まず、 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 の 5 つの レルム を見て、それぞれの給与
PHP デカップリングのトリプル レルム の分析 (サービス コンテナーについての簡単な説明)
以上がPHP デカップリングの 3 つの領域の詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。