Class(PHP)

更新日2008-11-20 (木) 13:35:01

PHP5でのClassについてはクラスとはあるオブジェクトをクラスとして定義しますが、この定義されたクラスには値として定義できるプロパティと実行できるメソッドが定義できる。プロパティはメンバー変数、メソッドはメンバー関数とも言う。

オブジェクトのプロパティ、メソッドへのアクセス

オブジェクト変数->プロパティ=値
戻り値=オブジェクト変数->メソッド(引数)

このクラスはそのままでは使用しないで、クラスのコピーを作成して使用する。 クラスのコピーすることを「インスタンスの作成」といい、できた具体的なモノを「オブジェクト」という。

オブジェクトの作成

$ism = new ismClass();

オブジェクト(変数)は$ism、コピー元のクラスはismClassを指定

簡単クラス

クラス名: ismClass
プロパティ: call
メソッド: goism

プロパティは varキーワードで指定する。

<?php
// クラスを定義
class ismClass{

// プロパティを指定
   var $call = "JE2ISM";

// メソッドを指定
   function goism($name){
       $ret = "私は" . $name . "です \n";
       return $ret;
   }
}

//オブジェクトの作成
$ism = new ismClass();

//プロパティの表示
echo  $ism->call . "\n";

//メソッドの実行
$data = $ism->goism("okada");
echo $data;

?>

プロパティ、メソッドのスコープ範囲

プロパティ、メソッドは同一クラスからしか参照できないものや、外部から参照できるものがある

public : クラスの内外に限らず、どこからでも参照/変更が可能
private : そのクラスのメソッドの中からのみ参照/変更が可能
protected : そのクラスとそのクラスを継承したクラスのメソッドの中で参照/変更が可能。また継承したクラスの中ではアクセス指定を上書きすることができる

プロパティやメソッドで上記を指定しないときはpublicとして取り扱う。
また、プロパティはPHP5ではvarを使用しないで上記どれかを使用することが推奨されているようだ。

<?php
// Classを定義しオブジェクトを作成したとき、コンストラクタが実行される例

class IsmClass{

// privateがついているので内部からしかCallできない
    private function pMethod($name){
        $ret = sprintf("%s さんダミーだよ \n", $name);
        printf("%s わいわい \n", $name);
        return $ret;
    }

    public function ismMethod($name){
// 内部のメソッドを指定するのは $this->をつけて指定
        printf("%s", $this->pMethod($name));
    }
}


$objCls = new IsmClass();
$objCls->ismMethod("JE2ISM");


?>

以下のようにprivateを指定すると

$objCls->pMethod("JE2ISM");

以下のようなエラーが生じる

PHP Fatal error:  Call to private method IsmClass::pMethod() from context ''  
in /home/okada/public_html/smarty_test/class_test/cls_private.php on line 23

コンストラクタ

コンストラクタとはクラスをインスタンス化する場合に最初に実行されるメソッドで、リソースの初期化などに使用される。PHP4ではクラス名とメソッド名を同じする。(e.g. IsmClass なら メソッド名も IsmClass)しかし、PHP5からは__constructという統一名に変更になった。クラス名と同じでも動作はするようだ。

<?php
// Classを定義しオブジェクトを作成したとき、コンストラクタが実行される例

class IsmClass{
    public function __construct($data){
//    public function IsmClass($data){
        print("IsmClass というクラスのオブジェクトが作成されました \n");
        printf("%s というデータが作成時渡されました\n", $data);
    }
    public function ism(){
        print("ダミーだよ \n");
    }

}

$objCls = new IsmClass("岡田です");

?>

クラスの継承

既存のクラスを「親クラス」「スーパークラス」「基底クラス」といい継承によりできたクラスを「子クラス」「サブクラス」「派生クラス」という。

親クラス:ismClass
子クラス:ism_sub_Class

<?php

class ismClass{
//子クラスからのみ呼び出しが可能。もし、ism2()側にもつけると子クラス経由で呼び出されるがエラーになる。
    protected function ism(){
        print("ismClass::ismが呼び出された \n");
    }

    function ism2(){
        print("ismClass::ism2が呼び出された \n");
    }

}

class ism_sub_Class extends ismClass{
// 親クラスの書き換え
    function ism(){
        print("ism_sub_Class::ismが呼び出された \n");
    }
// 子クラスで定義
    function ism3(){
        print("ism_sub_Class::ism3が呼び出された \n");
    }

$obj = new ism_sub_Class();
$obj->ism();
$obj->ism2();
$obj->ism3();

?>

オーバライド禁止(final)

親クラスのメソッドを子クラスで書き換えができなくなるようにするには 以下のように「final]を追加する

   final function ism(){
       print("ismClass::ismが呼び出された \n");
   }

子クラスで、書き換えると以下のようなエラーが出る

PHP Fatal error:  Cannot override final method ismClass::ism()  
in /home/okada/public_html/smarty_test/class_test/cls_extends2.php on line 24

静的クラス

クラス状態に影響をおよぼさないクラス(プロパティも変更しない)であればオブジェクトを生成しないで呼び出せる。静的メソッドいう
呼び出しは

クラス名::メソッド(引数)
<?php
// 静的クラス定義

class IsmClass{
    public static function ism($data){
        print("IsmClass という静的クラス\n");
        printf("%s というデータが渡されました\n", $data);
    }

}

IsmClass::ism("岡田です");

?>

インターフェイス

interfaceとはメソッドの宣言を集めたもの。メソッドの内容はないのでこれだけでは利用できない。 詳しい利用方法はゆっくり考える

class クラス名 implements インターフェイス名

でクラス化して使用する

<?php

interface MyInterface {
  public function test();
}

class Impl implements MyInterface {
  public function test() {
    print "hogehoge\n";
  }
}

$i = new Impl();
$i->test();
?> 

__setと__getについて

PHP5につては、宣言されていないプロパティは自動生成される
以下の例はプロパティbは宣言されていないが、代入と同時に生成されるため結果は

123
456

となる

<?php
  class Hoge {
    public $a;
  }
  $obj = new Hoge;
  $obj->a = "123 \n";
  print $obj->a;
  $obj->b = "456 \n";
  print $obj->b;
?>

このように定義されていない値を指定した場合に値を代入したとき呼び出される関数が__setで、定義されていない値を呼び出したとき呼び出される関数が__getである

<?php
  class Hoge {
    public $a;
    function __set($name, $value) {
       $this->a = $value;
       print $name . "\n";
    }

    function __get($name){
       print "未定義プロパティ名は" . $name . "\n";
    }
  }

  $obj = new Hoge;
  $obj->b = "123 \n";
  print $obj->a;
  $obj->b = "456 \n";
  print $obj->a;
  print $obj->b;
?>

結果

123
b
456
未定義プロパティ名はb

子クラスのコンストラクトで親クラスのコンストラクトを指定する

PHP5ではコンストラクトを__construct()で指定するが子クラスのコンストラクトから親クラスのコンストラクトで指定されている__construct()で呼び出すと定義してないようなエラーが出るがクラス名と同じ関数で指定した場合はうまくいくようだ

親クラス[ismClass.class.php]

<?php

class ismClass{

    public $v, $u;

//    function __construct(){  <==これで子クラスからismClassで呼び出すとだめなようだ。
    function ismClass(){
        $this->u = "ABC";

    }

    function ism(){
        printf("%s と %sがセットされています\n", $this->v ,$this->u);
    }

}

?>

子クラス[test_extends.php]

<?php

require_once('ismClass.class.php');

class ism_sub_Class extends ismClass{

    function __construct(){
         $this->ismClass(); //親クラスのコンストラクタの呼び出し
         $this->v = "JE2ISM";
    }

}

$obj = new ism_sub_Class();

$obj->ism();

?>

結果

$ php test_extends.php
JE2ISM と ABCがセットされています

エラー内容

PHP Fatal error:  Call to undefined method ism_sub_Class::ismClass()
in /home/okada/public_html/smarty_test/class_test/test_extends.php on line 9

__call

クラス定義されないメソッドを呼び出した場合通常はエラーするが、__call()メソッドが定義されている場合はこのメソッドが実行される。第一引数にはメソッド名、第二引数にはそのメソッドをcallしたときの引数が配列として表示される

<?php

class ismTest{

     function __call($name ,$args){
         printf("間違えたメソッドは %s 引数", $name);
         print_r($args);  //配列の出力

     }

}


$test = new ismTest();

$test->abc(1,2,3);

?>

実行結果

間違えたメソッドは abc 引数Array
(
    [0] => 1
    [1] => 2
    [2] => 3
)


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2008-11-20 (木) 13:35:01 (3379d)