トップページ >  PHP >  クラス
初版2013/05/22: 最終更新日2013/05/22
クラス
目次
クラス
クラスをインスタンス化する
クラスのコンストラクタ
クラスの継承
クラスのアクセス権
クラス
PHPのクラスは基本的にはJavaと同じですが、簡単に作成可能です。
以下、sampleクラスです。

<?php
    class sample{
        var $msg = "サンプルです";

        function msg(){
            echo $this->msg;
        }
    }
?>

PHPのクラスはいくつか決まりごとがあります。

・class クラス名{}で宣言する
・メンバ変数はvarを使用する
・メンバ関数はfunctionを使用する
・メンバ変数をメンバ関数から使用する場合は$this->変数名でアクセスする

などがあります。

クラスをインスタンス化する
クラスをインスタンス化するにはnewを使用します。
上記のクラスをインスタンス化し、メンバ関数を実行するソースです。

<?php
    class sample{
        var $msg = "サンプルです";

        function msg(){
            echo $this->msg;
        }
    }

    $a = new sample();
    echo $a->msg;
    $a->msg();
?>

以下、実行結果です。

サンプルですサンプルです

クラスをインスタンス化するのに変数を使用してインスタンス化することができます。
たとえば、以下のように変数にクラス名を文字列で代入してnewすることが可能です。

<?php
    class sample01{
        var $msg = "サンプルです";

        function msg(){
            echo $this->msg;
        }
    }
    // クラス名を変数に入れて、new演算子を使用する
    $class_name = "sample01";
    $a = new $class_name();
    echo $a->msg;
    $a->msg();
?>

以下、実行結果です。

サンプルですサンプルです

クラスのコンストラクタ
PHPのバージョンによってコンストラクタとして認められなかったりしますが、コンストラクタの記述方法はクラス名と同じメンバ関数がコンストラクタとなります。
以下、サンプルです。

<?php
    class sample1{
        var $msg = "サンプルです";
        // コンストラクタ
        function sample1(){
            echo $this->msg;
        }
    }

    $b = new sample1();
?>

サンプルを実行すると、インスタンス化されているだけですがコンストラクタが実行されるため、以下のように標準出力されています。



もう一つの記述方法は、コンストラクタ名を__constructとします。
以下、ソースです。

<?php
    class sample2{
        var $msg = "サンプルです";
        // コンストラクタ
        function __construct(){
            echo $this->msg;
        }
    }

    $b = new sample1();
?>

この記述方法でもインスタンス化時にコンストラクタが実行されているのがわかります。
ちなみに、クラスを継承している場合、親クラスのコンストラクタを呼び出すには、コンストラクタ内にparent::__construct();と記述します。(引数なしのコンストラクタの場合)
以下、実行例です。



クラスの継承
クラスを継承するにはextendsキーワードを使用します。
以下、クラス継承の例です。

<?php
    class sample3{
        var $msg = "親でーす";
        var $msg1 = "親でーす";
        // コンストラクタ
        function __construct(){
            echo $this->msg;
            echo $this->msg1;
        }
    }

    class sample4 extends sample3{
        var $msg = "子でーす";
        // コンストラクタ
        function __construct(){
            echo $this->msg;
            echo parent::__construct();//親クラスのコンストラクタ呼び出し
        }
    }

    $b = new sample4();
?>

以下、実行例です。子クラスと親クラスで、同一名の変数が存在する場合、子クラスの変数が出力されるようです。

子でーす子でーす親でーす

子クラスにコンストラクタが存在せず、親クラスにコンストラクタがある場合の動作です。以下、ソースです。

<?php
    class sample5{
        var $msg = "親でーす";
        var $msg1 = "親でーす";
        // コンストラクタ
        function __construct(){
            echo $this->msg;
            echo $this->msg1;
        }
    }

    class sample6 extends sample5{
        var $msg = "子でーす";
    }

    $b = new sample6();
?>

以下、実行例です。子クラスと親クラスで、同一名の変数が存在する場合、子クラスの変数が出力されるのは変わりませんが、子クラスのコンストラクタが存在しない場合、自動的に親クラスのコンストラクタが実行されるのがわかります。

子でーす親でーす

クラスのアクセス権
今までメンバ変数にはvarを使用しました。これはpublicと同じ意味を持ちます。
親クラスのメンバ変数をprivateなアクセス権に変えてみます。以下、ソースです。

<?php
    class sample7{
        private $msg = "親でーす";
        protected $msg1 = "親でーす";
        // コンストラクタ
        function __construct(){
            echo $this->msg;
            echo $this->msg1;
        }
    }

    class sample8 extends sample7{
        var $msg = "子でーす";
        var $msg1 = "子でーす";
    }

    $b = new sample8();
?>

親クラスのメンバ変数$msgをprivateにすると親クラスの$msgが出力されます。
protectedにすると、そのクラス自身と継承したクラス、親クラスからのみアクセスできます。以下、実行結果です。

親でーす子でーす