各クラスの定義は、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
|
|