PHP デザイン パターン シリーズ -- オブザーバー パターン (オブザーバー)
1. パターン定義
オブザーバー パターンは、パブリッシュ/サブスクライブ パターンと呼ばれることもあります。このパターンは、オブジェクトのパブリッシュ/サブスクライブ機能を実装するために使用されます。サブジェクト オブジェクトの状態が変化すると、オブザーバー オブジェクトが関連付けられます。通知を受信し、それに応じて動作します。
システムを相互に連携するクラスに分割すると、関連するオブジェクト間の一貫性を維持する必要があるという悪い副作用が生じます。一貫性を維持するためにさまざまな種類のアプリケーションを密結合することは望ましくありません。これにより、メンテナンス、拡張、再利用に不便が生じます。オブザーバーは、この種の結合関係を解決します。
メッセージ キュー システムとイベントはすべてオブザーバー パターンを使用します。
PHP は、オブザーバー パターンに対して SplSubject と SplObserver という 2 つのインターフェイスを定義します。 SplSubject はサブジェクト オブジェクトの抽象化として見ることができ、SplObserver はオブザーバー オブジェクトの抽象化として見ることができます。オブザーバー パターンを実装するには、サブジェクト オブジェクトに SplSubject を実装させ、オブザーバー オブジェクトに SplObserver を実装させるだけで済みます。対応するメソッド。
2. UML クラス図
3. サンプルコード
User.php
<?phpnamespace DesignPatterns\Behavioral\Observer;/** * 观察者模式 : 被观察对象 (主体对象) * * 主体对象维护观察者列表并发送通知 * */class User implements \SplSubject{ /** * user data * * @var array */ protected $data = array(); /** * observers * * @var \SplObjectStorage */ protected $observers; public function __construct() { $this->observers = new \SplObjectStorage(); } /** * 附加观察者 * * @param \SplObserver $observer * * @return void */ public function attach(\SplObserver $observer) { $this->observers->attach($observer); } /** * 取消观察者 * * @param \SplObserver $observer * * @return void */ public function detach(\SplObserver $observer) { $this->observers->detach($observer); } /** * 通知观察者方法 * * @return void */ public function notify() { /** @var \SplObserver $observer */ foreach ($this->observers as $observer) { $observer->update($this); } } /** * * @param string $name * @param mixed $value * * @return void */ public function __set($name, $value) { $this->data[$name] = $value; // 通知观察者用户被改变 $this->notify(); }}
UserObserver.php
<?phpnamespace DesignPatterns\Behavioral\Observer;/** * UserObserver 类(观察者对象) */class UserObserver implements \SplObserver{ /** * 观察者要实现的唯一方法 * 也是被 Subject 调用的方法 * * @param \SplSubject $subject */ public function update(\SplSubject $subject) { echo get_class($subject) . ' has been updated'; }}
4. テストコード
Tests/ObserverTest.php
<?phpnamespace DesignPatterns\Behavioral\Observer\Tests;use DesignPatterns\Behavioral\Observer\UserObserver;use DesignPatterns\Behavioral\Observer\User;/** * ObserverTest 测试观察者模式 */class ObserverTest extends \PHPUnit_Framework_TestCase{ protected $observer; protected function setUp() { $this->observer = new UserObserver(); } /** * 测试通知 */ public function testNotify() { $this->expectOutputString('DesignPatterns\Behavioral\Observer\User has been updated'); $subject = new User(); $subject->attach($this->observer); $subject->property = 123; } /** * 测试订阅 */ public function testAttachDetach() { $subject = new User(); $reflection = new \ReflectionProperty($subject, 'observers'); $reflection->setAccessible(true); /** @var \SplObjectStorage $observers */ $observers = $reflection->getValue($subject); $this->assertInstanceOf('SplObjectStorage', $observers); $this->assertFalse($observers->contains($this->observer)); $subject->attach($this->observer); $this->assertTrue($observers->contains($this->observer)); $subject->detach($this->observer); $this->assertFalse($observers->contains($this->observer)); } /** * 测试 update() 调用 */ public function testUpdateCalling() { $subject = new User(); $observer = $this->getMock('SplObserver'); $subject->attach($observer); $observer->expects($this->once()) ->method('update') ->with($subject); $subject->notify(); }}
5. まとめ
オブザーバーパターン主体と具体的な観察者を切り離し、双方が具体的なものではなく抽象的なものに依存するようにします。そのため、それぞれの側での変更がもう一方の側の変更に影響を与えません。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

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

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

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

ホットトピック









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

PHP開発における固体原理の適用には、次のものが含まれます。1。単一責任原則(SRP):各クラスは1つの機能のみを担当します。 2。オープンおよびクローズ原理(OCP):変更は、変更ではなく拡張によって達成されます。 3。Lischの代替原則(LSP):サブクラスは、プログラムの精度に影響を与えることなく、基本クラスを置き換えることができます。 4。インターフェイス分離原理(ISP):依存関係や未使用の方法を避けるために、細粒インターフェイスを使用します。 5。依存関係の反転原理(DIP):高レベルのモジュールと低レベルのモジュールは抽象化に依存し、依存関係噴射を通じて実装されます。

記事では、PHP 5.3で導入されたPHPの後期静的結合(LSB)について説明し、より柔軟な継承を求める静的メソッドコールのランタイム解像度を可能にします。 LSBの実用的なアプリケーションと潜在的なパフォーマ

システムが再起動した後、UnixSocketの権限を自動的に設定する方法。システムが再起動するたびに、UnixSocketの許可を変更するために次のコマンドを実行する必要があります:sudo ...

PHP開発でPHPのCurlライブラリを使用してJSONデータを送信すると、外部APIと対話する必要があることがよくあります。一般的な方法の1つは、Curlライブラリを使用して投稿を送信することです。

記事では、入力検証、認証、定期的な更新など、脆弱性から保護するためのフレームワークの重要なセキュリティ機能について説明します。

この記事では、フレームワークにカスタム機能を追加し、アーキテクチャの理解、拡張ポイントの識別、統合とデバッグのベストプラクティスに焦点を当てています。
