各クラスの定義は、classキーワードで始まり、クラス名が続きます。
クラス名には、PHPの予約語以外のあらゆる名前を
使用することができます。
波括弧の中に、クラスのメンバーとメソッドの定義が記述されます。
メソッドがオブジェクトコンテキストからコールされる場合
(通常は、メソッドが属するオブジェクトですが、
メソッドが第二のオブジェクトのオブジェクトの
コンテキストから スタティックに
コールされる場合には、別のオブジェクトとなる場合もあります)、
疑似変数 $this
が利用可能です。
以下にこの例を示します。
例 19-1. オブジェクト指向言語における $this 変数
<?php class A { function foo() { if (isset($this)) { echo '$this is defined ('; echo get_class($this); echo ")\n"; } else { echo "\$this is not defined.\n"; } } }
class B { function bar() { A::foo(); } }
$a = new A(); $a->foo(); A::foo(); $b = new B(); $b->bar(); B::bar(); ?>
|
上の例の出力は以下となります。 $this is defined (a)
$this is not defined.
$this is defined (b)
$this is not defined. |
|
例 19-2. 簡単なクラス定義
<?php class SimpleClass { // メンバ宣言 public $var = 'a default value';
// メソッド宣言 public function displayVar() { echo $this->var; } } ?>
|
|
デフォルト値は定数でなければなりません。(たとえば)
変数、クラスのメンバあるいは関数コールなどは使用できません。
例 19-3. クラスのメンバのデフォルト値
<?php class SimpleClass { // 無効な形式のメンバ宣言 public $var1 = 'hello '.'world'; public $var2 = <<<EOD hello world EOD; public $var3 = 1+2; public $var4 = self::myStaticMethod(); public $var5 = $myVar;
// 有効な宣言 public $var6 = myConstant; public $var7 = self::classConstant; public $var8 = array(true, false); } ?>
|
|
あるクラスのインスタンスを生成する際、新たにオブジェクトが作成され、
変数に代入される必要があります。
新しいオブジェクトが作成される際には、そのオブジェクトが
エラー時に 例外を投げる
よう定義された
コンストラクタを有していない限り、
常にオブジェクトが代入されます。
クラスは、そのインスタンスを作成する前に定義すべきです
(これが必須となる場合もあります)。
例 19-4. インスタンスを作成する
<?php $instance = new SimpleClass(); ?>
|
|
作成済みのクラスのインスタンスを新たな変数に代入する場合、新しい変数は、
代入されたオブジェクトと同じインスタンスにアクセスします。
この動作は、インスタンスを関数に渡す場合も同様です。
作成済みのオブジェクトのコピーは、その
クローンを作成
することにより作成可能です。
例 19-5. オブジェクトの代入
<?php $assigned = $instance; $reference =& $instance;
$instance->var = '$assigned will have this value';
$instance = null; // $instance と $reference は null になります
var_dump($instance); var_dump($reference); var_dump($assigned); ?>
|
上の例の出力は以下となります。 NULL
NULL
object(SimpleClass)#1 (1) {
["var"]=>
string(30) "$assigned will have this value"
} |
|
クラスは、宣言部にextendsキーワードを含めることで、他のクラスのメソッドとメソッドと
メンバーを継承することができます。他重継承を行うことはできず、クラスが継承できるベース
クラスは一つだけです。
継承されたメソッドとメンバーは、親クラスで final
としてメソッドが定義されていない限り、親クラスで定義されたのと同じ名前で
再度宣言を行うことでオーバーライドすることができます。
parent::で
参照することにより、このオーバーライドされたメソッドまたはメンバーに
アクセスすることができます。
例 19-6. 簡単なクラスの継承
<?php class ExtendClass extends SimpleClass { // 親クラスのメソッドを再定義 function displayVar() { echo "Extending class\n"; parent::displayVar(); } }
$extended = new ExtendClass(); $extended->displayVar(); ?>
|
上の例の出力は以下となります。 Extending class
a default value |
|