2013年3月20日水曜日

PHP クラス定義 ~基本~

クラス定義

クラスは基本的に1クラス1ファイルで定義し、ファイル名は「クラス名.class.php」とするのが一般的です。
以下に定義したUserクラスの場合、ファイル名は「User.class.php」となります。
クラス名はPascal形式(大文字で始め単語の区切りも大文字にする)です。

<?php
class User {

    //インスタンス変数
    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; }
    
    //コンストラクタ
    public 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
print('■User1</br>');
$user1 = new User();
$user1->showName();

print('■User2</br>');
$user2 = new User();
$user2->set_lastName('田中');
$user2->set_firstName('太郎');
$user2->showName();

print('■User3</br>');
$user3 = new User('山田','花子');
$user3->showName();
$user3->showFirstName();

?>
実行結果


アクセス修飾子

PHPで利用可能な修飾子は以下の3つ
  • public ・・・ どこからでもアクセス可能
  • protected ・・・ 現在のクラスとサブクラスでのみアクセス可能
  • private ・・・ 現在のクラス内部でのみアクセス可能
アクセス修飾子を省略した場合、publicとなる。


インスタンス変数

変数と同じく、変数の頭に「$」をつけ、camel形式(小文字ではじめ単語の区切りは大文字)で定義します。
初期化はリテラルあるいは定数でのみ可能です。 式で初期化することはできません。
つまり、インスタンス変数を整数値や配列で初期化することはできますが、 他の変数の値や関数の返り値、オブジェクトなどで初期化することはできません。
private $val = new Hoge(); はエラーになります。
インスタンス変数にインスタンスオブジェクトなどを持たせたい場合、コンストラクタで初期化することになります。


アクセサメソッド

セッターは「set_インスタンス変数名」、ゲッターは「get_インスタンス変数名」と命名します。


コンストラクタ

PHP4はクラス名と同名のメソッドをコンストラクタとしていました。
PHP5からは「__construct」とう名称でコンストラクタを定義するようにします。
もし「クラス名と同名のコンストラクタ」と「__construct」が存在する場合は「__construct」が優先されます。
コンストラクタは引数を指定することができますが、PHPではオーバーロード(同名のメソッドで引数が違うメソッドを複数定義すること)ができません。


デストラクタ

PHP5から使用でき「__destruct」という名称で定義します。


インスタンスメソッド

camel形式(小文字ではじめ単語の区切りを大文字にする)で定義します。


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

クラス内から自クラスに定義されているインスタンス変数やアクセッサ、インスタンスメソッドにアクセスするためには「$this」キーワードを使用します。
インスタンス変数にアクセスするには「$this->firstName」とします。(インスタンス変数に「$」はいりません。)
アクセッサやインスタンスメソッドにアクセスするのも同様に「$this->get_firstNmae()」とします。

※余談ですが・・・
文字列型の変数を扱う場合、値をダブルクォテーションで囲むと文字列に含まれる変数を展開してくれますが
$str = "私の名前は「$this->lastNmae $this->firstName」です。"
とすればインスタンス変数は展開されます。
でも
$str = "私の名前は「$this->get_lastNmae() $this->get_firstName()」です。"
としても、メソッドやアクセッサは展開されません。
あたりまえですけど、ちょっとできるかな~と思ってしまいました。


クラスをインスタンス化し使用する

クラスをインスタンス化するには
$変数名 = new クラス名([引数1,引数2,・・・]);
とします。

インスタンス化したメソッドなどにアクセスするには
[戻り値 = ] $変数名->メソッド名([引数1,引数2,・・・]);
とします。

0 件のコメント: