オーバーロード

メソッド呼び出しとメンバーへのアクセスのいずれも __call, __get そして __set メソッドを通してオーバーロードすることができます。 これらのメソッドは、オブジェクトや継承されたオブジェクトが アクセスしようとしているメンバーもしくはメソッドを含んでいない場合でも 実行されます。 オーバーロードしている全てのメソッドは、 public として定義されていなければなりません。

メンバーのオーバーロード

void __set ( string name, mixed value )

mixed __get ( mixed name )

独自のクラスで定義されているカスタムコードを実行するために、 特別な名前を持つメソッドによってクラスメンバーをオーバーロード することができます。 使用される $name パラメータは、 設定あるいは取得される変数名です。 __set() メソッドの $value パラメータにより オブジェクトが $name に設定する値を指定します。

例 19-18. __get と __set を使ったオーバーロードの例

<?php
class Setter
{
    
public $n;
    
private $x = array("a" => 1, "b" => 2, "c" => 3);

    
public function __get($nm)
    {
        print
"Getting [$nm]\n";

        if (isset(
$this->x[$nm])) {
            
$r = $this->x[$nm];
            print
"Returning: $r\n";
            return
$r;
        } else {
            echo
"Nothing!\n";
        }
    }

    
public function __set($nm, $val)
    {
        print
"Setting [$nm] to $val\n";

        if (isset(
$this->x[$nm])) {
            
$this->x[$nm] = $val;
            echo
"OK!\n";
        } else {
            echo
"Not OK!\n";
        }
    }
}

$foo = new Setter();
$foo->n = 1;
$foo->a = 100;
$foo->a++;
$foo->z++;
var_dump($foo);
?>

上の例の出力は以下となります:

Setting [a] to 100
OK!
Getting [a]
Returning: 100
Setting [a] to 101
OK!
Getting [z]
Nothing!
Setting [z] to 1
Not OK!
object(Setter)#1 (2) {
    ["n"]=>
    int(1)
    ["x:private"]=>
    array(3) {
        ["a"]=>
        int(101)
        ["b"]=>
        int(2)
        ["c"]=>
        int(3)
    }
}

メソッドのオーバーロード

mixed __call ( string name, array arguments )

独自クラスで定義されているカスタムコードを実行するために、 特別な名前を持つメソッドを用いてクラスメソッドをオーバーロード することができます。 使用される $name パラメータは、要求される関数名です。 この関数に渡される引数は、$arguments パラメータに配列として定義されます。 __call() メソッドから返される値は呼び出し元のメソッドに返されます。

例 19-19. __call を使ったオーバーロードの例

<?php
class Caller
{
    
private $x = array(1, 2, 3);

    
public function __call($m, $a)
    {
        print
"Method $m called:\n";
        
var_dump($a);
        return
$this->x;
    }
}

$foo = new Caller();
$a = $foo->test(1, "2", 3.4, true);
var_dump($a);
?>

上の例の出力は以下となります:

Method test called:
array(4) {
    [0]=>
    int(1)
    [1]=>
    string(1) "2"
    [2]=>
    float(3.4)
    [3]=>
    bool(true)
}
array(3) {
    [0]=>
    int(1)
    [1]=>
    int(2)
    [2]=>
    int(3)
}