クラスとオブジェクト
PHP Manual

パターン

パターンは、最善の手順と良い設計を記述するための手段です。 パターンは、一般的なプログラム上の課題に柔軟な解決策を提供します。

Factory

Factory パターンにより、実行時にオブジェクトを初期化できるようになります。 オブジェクトを"製造する"ことに似ているため、これは Factory パターンと呼ばれています。 パラメータ化された Factory が、生成するクラス名を引数として受け取ります。

例1 パラメータ化された Factory メソッド

<?php
class Example
{
    
// パラメータ化された Factory メソッド
    
public static function factory($type)
    {
        if (include_once 
'Drivers/' $type '.php') {
            
$classname 'Driver_' $type;
            return new 
$classname;
        } else {
            throw new 
Exception('Driver not found');
        }
    }
}
?>

このメソドをクラス内で定義することで、実行時に ロードされるドライバを作成できるようになります。 Example クラスが、データベース抽象化クラスで、 MySQL および SQLite ドライバをロードするとすると以下のように行うことができます。

<?php
// MySQL ドライバをロード
$mysql Example::factory('MySQL');

// SQLite ドライバをロード
$sqlite Example::factory('SQLite');
?>

Singleton

Singleton パターンは、クラスのインスタンスが一つだけであることが 必要である場合に適用されます。 この最も一般的な例は、データベースへの接続です。 このパターンを実装することで、プログラマは この単一のインスタンスが他の多くのオブジェクトから容易に アクセスできるようにすることができます。

例2 Singleton 関数

<?php
class Example
{
    
// クラスのインスタンスを保持する
    
private static $instance;

    
// private なコンストラクタ。オブジェクトが直接生成されるのを防ぐ
    
private function __construct()
    {
        echo 
'I am constructed';
    }

    
// singleton メソッド
    
public static function singleton()
    {
        if (!isset(
self::$instance)) {
            
$c __CLASS__;
            
self::$instance = new $c;
        }

        return 
self::$instance;
    }

    
// とあるメソッド
    
public function bark()
    {
        echo 
'Woof!';
    }

    
// ユーザーがインターフェースを複製するのを防ぐ
    
public function __clone()
    {
        
trigger_error('Clone is not allowed.'E_USER_ERROR);
    }

}

?>

このコードにより、Example クラスのインスタンスが一つ 作られ、取得されます。

<?php
// コンストラクタが private であるため、これは失敗します
$test = new Example;

// これにより、クラスの単一のインスタンスを取得します。
$test Example::singleton();
$test->bark();

// これにより、E_USER_ERROR が発生する
$test_clone = clone $test;

?>

クラスとオブジェクト
PHP Manual