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 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(); ?>
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