Google

NAME="GENERATOR" CONTENT="Modular DocBook HTML Stylesheet Version 1.7">

LXXVIオブジェクトプロパティとメソッドコールのオーバーロード

警告

このモジュールは、実験的なものです。これは、これらの関数の動作、関数名は、このドキュメントに書かれて事項と同様に告知なく将来的なPHPのリリースで変更される可能性があります。注意を喚起するとともに、このモジュールは使用者のリスクで使用して下さい。

この拡張モジュールの用途は、オブジェクトのプロパティへのアクセスと メソッドのコールのオーバーロードを可能にすることです。この拡張モ ジュールで定義されている関数は1つだけです。この関数、 overload() はこの機能を有効にするクラスの名前を 引数とします。名前を指定されたクラスでこの機能を使用したい場合は以 下の適当なメソッドを定義する必要があります。これらは、 __get(),__set(), __call()で、それぞれ、プロパティを取得、設定、 メソッドをコールするためのものです。オーバーロード機能は選択可能で す。これらのハンドラ関数の中でオーバーロードは無効とすることができ、 この場合、オブジェクトのプロパティに普通にアクセスできます。

overload()関数の簡単な使用例をいくつか示します。

例 1PHPクラスのオーバーロード

<?php

class OO
{
    var $a = 111;
    var $elem = array('b' => 9, 'c' => 42);

    // プロパティを取得するためのコールバックメソッド
    function __get($prop_name, &$prop_value)
    {
        if (isset($this->elem[$prop_name])) {
            $prop_value = $this->elem[$prop_name];
            return true;
        } else {
            return false;
        }
    }

    // プロパティを設定するためのコールバックメソッド
    function __set($prop_name, $prop_value)
    {
        $this->elem[$prop_name] = $prop_value;
        return true;
    }
}

// OOオブジェクトをオーバーロードする
overload('OO');

$o = new OO;
print "\$o->a: $o->a\n"; // 出力: $o->a:
print "\$o->b: $o->b\n"; // 出力: $o->b: 9
print "\$o->c: $o->c\n"; // 出力: $o->c: 42
print "\$o->d: $o->d\n"; // 出力: $o->d:

// OOの$elem排列に新規アイテムを追加
$o->x = 56; 

// (PHP 4に組み込まれている)stdclassのインスタンスを生成
// $val はオーバーロードされていません!
$val = new stdclass;
$val->prop = 555;

// $valオブジェクトを有する配列として"a"を設定
// しかし、__set() はこれを$elem配列に代入する
$o->a = array($val);
var_dump($o->a[0]->prop);

?>

警告

この拡張モジュールは実験的なステータスにあり、全ての機能が動作す るわけではありません。現在、__call()はサポート されておらず、プロパティの取得または設定操作のオーバーロードだけ が可能です。クラスの元のオーバーロードハンドラを削除することはで きません。また、__set()はプロパティの一段階に アクセス場合にのみ動作します。

目次
overload --  クラスのプロパティおよびメソッドに関してオーバーロードを可能にする