クラスは、※プロパティ(メンバ変数)と※メソッドから構成されます。プロパティ=変数、メソッド=関数と考えると分かり易いかもしれません。
クラスの定義には、classというキーワードを使用し、続けて定義するクラス名を指定します。クラス名を指定したら、そのクラスのプロパティ(メンバ変数)と、メソッドを定義します。
※プロパティ(メンバ変数)とは・・・
クラスで表現したいオブジェクトの「パラメータ」を格納するための変数にあたります。例えば、私たち「人間」をクラスとすると、「性別」、「年齢」、「血液型」がプロパティにあたります。
※メソッドとは・・・
機能を実現するための関数にあたります。メソッドは一般の関数とは異なり、あくまでクラスのオブジェクトの中でのみ有効になります。例えば、私たち「人間」をクラスとすると、「食べる」、「走る」、「寝る」がメソッドにあたります。
クラスを作る
<?php
// クラスsansuを定義する
class sansu {
// プロパティを定義する
var $result;
// メソッドkakezanを定義する
function kakezan( $number ) {
return $this->result = $number * 100;
}
}
// インスタンスを作成する
$jsansu = new sansu;
echo $jsansu->kakezan( 7 );
?>
上記のスクリプトでは、classというキーワードに続けてsansuというクラス名を指定しています。次に、※varを付けてプロパティを定義し、クラス全体で使用できるようにします。
メソッドkakezanを定義している中に、「$this->result」と記述ありますが、これはsansuクラス内からresultプロパティを呼び出す、という意味です。「$this->」は、自分自身を表し、「$this->プロパティ名」で同一クラス内からプロパティを呼び出すことができます。
実行結果
700※varについて
プロパティを定義するときには、プロパティ名だけでなく、アクセス制限設定も同時に行うことができます。アクセス制限とは、PHP5から新たに導入されたもので、プロパティがクラス外からアクセス可能かどうかを決定するものです。PHP5では、プロパティの定義にvarを使用せずに、「public」、「private」、「protected」の修飾子を使用することが推奨されています。なお、アクセス制限の指定を省略した場合は、publicを指定したとみなされます。
プロパティのアクセス制限設定
| 修飾子 | 説明 |
|---|---|
| public | どこからでもアクセス可能 |
| protected | 同一クラスおよび派生クラスからアクセス可能 |
| private | 同一クラスからのみアクセス可能 |
作成したクラスを実行するには、※インスタンスを作成しなければなりません。インスタンスを作成するには、newというキーワードを使います。
※インスタンスとは・・・
インスタンスとは、クラスから生成されるデータ群のことです。クラスは定義が書かれているだけの雛型のようなもので、インスタンスを生成することで、実際にデータを扱うことが可能になります。人間クラス(人間という集合)のインスタンス(実例、実際の要素)はAさん、というような感じになります。
// インスタンスを作成する
$jsansu = new sansu;
上記の定義により、$jsansuがインスタンスとなります。そして、この$jsansuを使用して、クラスで定義したプロパティやメソッドを利用します。
echo $jsansu->kakezan( 7 );
つまり、kakezanメソッドを呼び出すには、自分自身を表す->という記述を用いて、上記のように記述します。
継承とは、あるクラスのプロパティ、メソッドを引き継ぐことをいいます。継承により新しく作成されたクラスでは、継承されたクラスから引き継いだプロパティ、メソッドを定義しなくても使用することができます。
継承によって新しく作成するクラスをサブクラス(子クラス、派生クラス)、それに対して継承される側のクラスをスーパークラス(親クラス、基底クラス、基本クラス)と呼びます。
継承からkeisyou_sansuクラスを作成する
<?php
// クラスsansuを定義する
class sansu {
// プロパティを定義する
var $result;
// メソッドkakezanを定義する
function kakezan( $number ) {
return $this->result = $number * 100;
}
}
// sansuクラスを継承する
class keisyou_sansu extends sansu {
var $result2;
var $result3;
var $result4;
function tashizan( $number ) {
return $this->result2 = $number + 100;
}
function hikizan( $number ) {
return $this->result3 = $number - 100;
}
function warizan( $number ) {
return $this->result4 = $number / 100;
}
}
// インスタンスを作成する
$jsansu = new keisyou_sansu;
echo $jsansu->kakezan( 5 ), "<br />\n";
echo $jsansu->tashizan( 7 ), "<br />\n";
echo $jsansu->hikizan( 300 ), "<br />\n";
echo $jsansu->warizan( 200 ), "<br />\n";
?>
上記のスクリプトでは、作成したsansuクラスを、extendsというキーワードで継承して、keisyou_sansuというサブクラスを作成しています。続けて、継承した掛け算メソッド、kakezanに加えて、足し算(tashizan)、引き算(hikizan)、割り算(warizan)が行えるメソッドを定義しています。
実行結果
500「$jsansu = new keisyou_sansu;」でクラスのインスタンスが作成され、「tashizan」、「hikizan」「warizan」が使用可能になり、「$jsansu->kakezan( 5 )」、「$jsansu->tashizan( 7 )」、「$jsansu->hikizan( 300 )」、「$jsansu->warizan( 200 )」から()内の数字が計算されています。その計算結果がそれぞれ、「500」、「107」、「200」、「2」となっています。
get_class()関数は、引数で指定したオブジェクト変数が参照しているクラスのクラス名を取得することができます。
クラス名を取得する
<?php
class sansu {
function kakezan( $number ) {
return $this->result = $number * 100;
}
function ClassName() {
echo "クラスの名前は", get_class( $this ), "です<br />\n";
}
}
$name = new sansu();
echo "参照しているクラスの名前は", get_class( $name ), "です<br />\n";
$name->ClassName();
?>
実行結果
参照しているクラスの名前はsansuですget_declared_classes()関数は、定義済みのクラス名を取得することできます。自分で定義したクラス以外にも、PHPの標準で定義してあるクラス名も取得することができます。
クラス名を取得する(1)
<?php
class sansuKake {
var $result;
function kakezan( $number ) {
return $this->result = $number * 100;
}
}
class sansuTashi {
var $result2;
function tashizan( $number ) {
return $this->result2 = $number + 100;
}
}
class sansuHiki {
var $result3;
function hikizan( $number ) {
return $this->result3 = $number - 100;
}
}
class sansuWari {
var $result4;
function warizan( $number ) {
return $this->result4 = $number / 100;
}
}
$array = get_declared_classes();
print_r( $array );
?>
実行結果(PHP4の定義済みクラス)
[0] => stdClass実行結果(PHP5の定義済みクラス)
[0] => stdClassget_parent_class()関数は、継承元となる親クラス名を取得することができます。親クラスが存在しない場合にはNULLになります。
クラス名を取得する(2)
<?php
class sansu {
var $result;
var $result2;
function keisan1( $number ) {
return $this->result = $number * 100;
return $this->result2 = $number + 100;
}
}
class sansu2 {
var $result3;
var $result4;
function keisan2( $number ) {
return $this->result3 = $number - 100;
return $this->result4 = $number / 100;
}
}
class child1 extends sansu {
function child1() {
echo "私の親クラスは", get_parent_class( $this ), "です<br />\n";
}
}
class child2 extends sansu2 {
function child2() {
echo "私の親クラスは", get_parent_class( 'child2' ), "です<br />\n";
}
}
$parentName1 = new child1();
$parentName2 = new child2();
?>
実行結果
私の親クラスはsansuですget_class_methods()関数は、クラスで定義されているメソッドの名前を配列で取得することができます。
クラスのメソッド名を取得する
<?php
class sansu {
var $result;
var $result2;
var $result3;
var $result4;
function kakezan( $number ) {
return $this->result = $number * 100;
}
function tashizan( $number ) {
return $this->result2 = $number + 100;
}
function hikizan( $number ) {
return $this->result3 = $number - 100;
}
function warizan( $number ) {
return $this->result4 = $number / 100;
}
}
$sansu_method = get_class_methods( sansu );
foreach( $sansu_method as $method_name ) {
echo "$method_name<br />\n";
}
?>
実行結果
kakezanclass_exists()関数は、引数に指定したクラスが定義されているかどうかを調べることができます。
クラスが存在するか調べる
<?php
class sansu {
var $result;
function kakezan( $number ) {
return $this->result = $number * 100;
}
}
if( class_exists( sansu ) ) {
echo "このクラスは存在します";
} else {
echo "このクラスは存在しません";
}
?>
実行結果
このクラスは存在しますmethod_exists()関数は、対象のクラスに、指定したメソッドが存在するかどうかを調べることができます。
クラスのメソッドが存在するか調べる
<?php
class sansu {
var $result;
function kakezan( $number ) {
return $this->result = $number * 100;
}
}
if( method_exists( sansu, "kakezan" ) ) {
echo "このメソッドは存在します";
} else {
echo "このメソッドは存在しません";
}
?>
実行結果
このメソッドは存在しますget_class_vars()は、クラスで定義されているプロパティを配列で取得することができます。
クラスのプロパティ情報を取得する
<?php
class sansu {
var $result1;
var $result2;
var $result3;
var $result4;
function kakezan( $number ) {
return $this->result = $number * 100;
}
function tashizan( $number ) {
return $this->result2 = $number + 100;
}
function hikizan( $number ) {
return $this->result3 = $number - 100;
}
function warizan( $number ) {
return $this->result4 = $number / 100;
}
}
$sansu_var = get_class_vars( sansu );
foreach( $sansu_var as $key => $value ) {
echo "$key<br />\n";
}
?>
実行結果
result1