目次
1. パターン定義
2. UML クラス図
3. サンプルコード
Service.php
<?phpnamespace DesignPatterns\Behavioral\NullObject;/** * Service 是使用 logger 的模拟服务 */class Service{    /**     * @var LoggerInterface     */    protected $logger;    /**     * 我们在构造函数中注入logger     *     * @param LoggerInterface $log     */    public function __construct(LoggerInterface $log)    {        $this->logger = $log;    }    /**     * do something ...     */    public function doSomething()    {        // 在空对象模式中不再需要这样判断 "if (!is_null($this->logger))..."        $this->logger->log('We are in ' . __METHOD__);        // something to do...    }}
ログイン後にコピー
" >
<?phpnamespace DesignPatterns\Behavioral\NullObject;/** * Service 是使用 logger 的模拟服务 */class Service{    /**     * @var LoggerInterface     */    protected $logger;    /**     * 我们在构造函数中注入logger     *     * @param LoggerInterface $log     */    public function __construct(LoggerInterface $log)    {        $this->logger = $log;    }    /**     * do something ...     */    public function doSomething()    {        // 在空对象模式中不再需要这样判断 "if (!is_null($this->logger))..."        $this->logger->log('We are in ' . __METHOD__);        // something to do...    }}
ログイン後にコピー
<?phpnamespace DesignPatterns\Behavioral\NullObject;/** * LoggerInterface 是 logger 接口 * * 核心特性: NullLogger必须和其它Logger一样实现这个接口 */interface LoggerInterface{    /**     * @param string $str     *     * @return mixed     */    public function log($str);}
ログイン後にコピー
" >
<?phpnamespace DesignPatterns\Behavioral\NullObject;/** * LoggerInterface 是 logger 接口 * * 核心特性: NullLogger必须和其它Logger一样实现这个接口 */interface LoggerInterface{    /**     * @param string $str     *     * @return mixed     */    public function log($str);}
ログイン後にコピー
<?phpnamespace DesignPatterns\Behavioral\NullObject;/** * PrintLogger是用于打印Logger实体到标准输出的Logger */class PrintLogger implements LoggerInterface{    /**     * @param string $str     */    public function log($str)    {        echo $str;    }}
ログイン後にコピー
4. テストコード

テスト/LoggerTest .php

rree " >
<?phpnamespace DesignPatterns\Behavioral\NullObject;/** * PrintLogger是用于打印Logger实体到标准输出的Logger */class PrintLogger implements LoggerInterface{    /**     * @param string $str     */    public function log($str)    {        echo $str;    }}
ログイン後にコピー
4. テストコード

テスト/LoggerTest .php

rree

ホームページ バックエンド開発 PHPチュートリアル PHP デザイン パターン シリーズ -- Null オブジェクト パターン

PHP デザイン パターン シリーズ -- Null オブジェクト パターン

Jun 23, 2016 pm 01:19 PM

1. パターン定義

Null オブジェクト パターンは、GoF の書籍「デザイン パターン」で言及されている 23 の古典的なデザイン パターンの 1 つではありませんが、無視できないほど頻繁に現れるパターンです。このパターンには次の利点があります:

  • クライアント コードの簡素化
  • null ポインター例外のリスクの軽減
  • 条件付き制御ステートメントが減ってテスト ケースが削減される

Null Object パターンでは、以前はオブジェクトまたは null を返していたメソッドが Object を返すようになりました。たとえば、オブジェクトを返すメソッドを呼び出す前に、次のように記述する必要があります。

if (!is_null($obj)) {     $obj-&gt;callSomething(); }
ログイン後にコピー

これは、オブジェクトが空であっても、空のオブジェクトは返されるため、次のように返されたオブジェクトのメソッドを直接呼び出すことができます:

$obj-&gt;callSomething();
ログイン後にコピー

これにより、クライアント側のチェック コードが不要になります。

もちろん、この種の呼び出しを実現するための前提条件は、返されるオブジェクトと空のオブジェクトが同じインターフェイスを実装し、一貫したコード構造を持つ必要があることであることに気づいたかもしれません。

2. UML クラス図

3. サンプルコード

Service.php

LoggerInterface.php

&lt;?phpnamespace DesignPatterns\Behavioral\NullObject;/** * Service 是使用 logger 的模拟服务 */class Service{    /**     * @var LoggerInterface     */    protected $logger;    /**     * 我们在构造函数中注入logger     *     * @param LoggerInterface $log     */    public function __construct(LoggerInterface $log)    {        $this-&gt;logger = $log;    }    /**     * do something ...     */    public function doSomething()    {        // 在空对象模式中不再需要这样判断 &quot;if (!is_null($this-&gt;logger))...&quot;        $this-&gt;logger-&gt;log('We are in ' . __METHOD__);        // something to do...    }}
ログイン後にコピー

PrintLogger.php

&lt;?phpnamespace DesignPatterns\Behavioral\NullObject;/** * LoggerInterface 是 logger 接口 * * 核心特性: NullLogger必须和其它Logger一样实现这个接口 */interface LoggerInterface{    /**     * @param string $str     *     * @return mixed     */    public function log($str);}
ログイン後にコピー

NullLogger.php

&lt;?phpnamespace DesignPatterns\Behavioral\NullObject;/** * PrintLogger是用于打印Logger实体到标准输出的Logger */class PrintLogger implements LoggerInterface{    /**     * @param string $str     */    public function log($str)    {        echo $str;    }}
ログイン後にコピー
4. テストコード

テスト/LoggerTest .php

rree

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

ホットな記事タグ

メモ帳++7.3.1

メモ帳++7.3.1

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

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

11ベストPHP URLショートナースクリプト(無料およびプレミアム) 11ベストPHP URLショートナースクリプト(無料およびプレミアム) Mar 03, 2025 am 10:49 AM

11ベストPHP URLショートナースクリプト(無料およびプレミアム)

Instagram APIの紹介 Instagram APIの紹介 Mar 02, 2025 am 09:32 AM

Instagram APIの紹介

Laravelでフラッシュセッションデータを使用します Laravelでフラッシュセッションデータを使用します Mar 12, 2025 pm 05:08 PM

Laravelでフラッシュセッションデータを使用します

LaravelのバックエンドでReactアプリを構築する:パート2、React LaravelのバックエンドでReactアプリを構築する:パート2、React Mar 04, 2025 am 09:33 AM

LaravelのバックエンドでReactアプリを構築する:パート2、React

Laravelテストでの簡略化されたHTTP応答のモッキング Laravelテストでの簡略化されたHTTP応答のモッキング Mar 12, 2025 pm 05:09 PM

Laravelテストでの簡略化されたHTTP応答のモッキング

PHPのカール:REST APIでPHPカール拡張機能を使用する方法 PHPのカール:REST APIでPHPカール拡張機能を使用する方法 Mar 14, 2025 am 11:42 AM

PHPのカール:REST APIでPHPカール拡張機能を使用する方法

Codecanyonで12の最高のPHPチャットスクリプト Codecanyonで12の最高のPHPチャットスクリプト Mar 13, 2025 pm 12:08 PM

Codecanyonで12の最高のPHPチャットスクリプト

Laravelの通知 Laravelの通知 Mar 04, 2025 am 09:22 AM

Laravelの通知

See all articles