クラスの基礎

class

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

注意: クラスやオブジェクトを扱うための、便利な関数があります。 クラス/オブジェクト関数 を参照ください。

new

あるクラスのインスタンスを生成する際、新たにオブジェクトが作成され、 変数に代入される必要があります。 新しいオブジェクトが作成される際には、そのオブジェクトが エラー時に 例外 を投げる よう定義された コンストラクタ を有していない限り、 常にオブジェクトが代入されます。 クラスは、そのインスタンスを作成する前に定義すべきです (これが必須となる場合もあります)。

例 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

クラスは、宣言部に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