2013年3月20日水曜日

PHP クラス定義 ~静的メンバ(static)~

クラス定義

スタティックメンバのサンプルとしてシングルトンパターンのクラスを定義しました。
シングルトンパターンとはクラスのインスタンスが1つしか生成されないことを保証するパターンです。
コンストラクタをprivateにし、外部からインスタンス化できないようにします。
自身のインスタンスを保持するstatic変数とその変数のゲッターをstaticで定義します。
<?php
class User {

    //スタティック変数
    private static $instance;
    
    //スタティックアクセサメソッド
    public static function get_instance() {
        if (is_null(self::$instance)) {
            self::$instance = new User();
        }
        return self::$instance;
    }
    
    
    //スタティックメソッド
    public static function createDefaultuser() {
        $defUser = self::get_instance();
        $defUser->lastName = "山本";
        $defUser->firstName = "一郎";
    }
    
    public static function changeUser(){
        $defUser = User::get_instance();
        $defUser->lastName = "山本";
        $defUser->firstName = "二郎";
    }

    
    //インスタンス変数
    private $lastName;
    private $firstName;
    
    //アクセサメソッド
    public function get_lastName() { return $this->lastName; }
    public function set_lastName($lastName) { $this->lastName = $lastName; }

    public function get_firstName() { return $this->firstName; }
    public function set_firstName($firstName) { $this->firstName = $firstName; }
    
    //コンストラクタ
    private function __construct( $lastName='名無しの', $firstName='ゴンベイ') {
        $this->lastName = $lastName;
        $this->firstName = $firstName;
    }
    
    //インスタンスメソッド
    public function showName(){
        print("私の名前は「" .$this->createName() ."」です。>/br<");
    }
    
    private function createName(){
        return " $this->lastName   $this->firstName";
    }
}
?>
クラスを使用するサンプル
<?php
User::get_instance()->showName();

User::createDefaultUser();
$user = User::get_instance();
$user->showName();

$user::changeUser();
$user->showName();
?>
実行結果


スタティック変数

初期化はリテラルあるいは定数でのみ可能です。 式で初期化することはできません。
つまり、スタティック変数を整数値や配列で初期化することはできますが、 他の変数の値や関数の返り値、オブジェクトなどで初期化することはできません。
private static $val = new Hoge(); はエラーになります。
インスタンス変数にオブジェクトを持たせたい場合、コンストラクタで初期化すればよいですが、
PHPではスタティックなコンストラクタはサポートされていないので、スタティック変数にオブジェクトを持たせたい場合は工夫が必要です。
う~ん。ちょっと不便だ。


クラス内から自クラスに定義されているスタティックメンバにアクセスする

クラス内からクラスに定義されているスタティックなメンバにアクセスするためには「クラス名::スタティックメンバ名」または「self::スタティックメンバ名」とします。
スタティック変数にアクセスするには「User::$instance」または「self::$instance」とします。(スタティック変数に「$」はいります。)
アクセッサやスタティックメソッドにアクセスするのも同様に「User::get_instance()」または「self::get_instance()」とします。


クラス外からクラスに定義されているスタティックメンバにアクセスする

クラス外からクラスに定義されているスタティックなメンバにアクセスするためには「クラス名::スタティックメンバ名」とします。
Userクラスに定義されたスタティックメソッド「createDefaultuser()」にアクセスするには
User::createDefaultuser()
とします。
インスタンス経由でもスタティックなメンバにアクセスできます。
$user = new User();
$user::changeUser();
$user->showName();

0 件のコメント: