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

PHP マニュアル
前のページ |  | 次のページ

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

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

この拡張モジュールの用途は、オブジェクトのプロパティへのアクセスと メソッドのコールのオーバーロードを可能にすることです。この拡張モ ジュールで定義されている関数は１つだけです。この関数、 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()`はプロパティの一段階に アクセス場合にのみ動作します。

前のページ | ホーム | 次のページ
ob_start | 上に戻る | overload