導入
この拡張モジュールの用途は、オブジェクトのプロパティへのアクセスと
メソッドのコールのオーバーロードを可能にすることです。この拡張モ
ジュールで定義されている関数は1つだけです。この関数、
overload() はこの機能を有効にするクラスの名前を
引数とします。名前を指定されたクラスでこの機能を使用したい場合は以
下の適当なメソッドを定義する必要があります。これらは、
__get(),__set(),
__call()で、それぞれ、プロパティを取得、設定、
メソッドをコールするためのものです。オーバーロード機能は選択可能で
す。これらのハンドラ関数の中でオーバーロードは無効とすることができ、
この場合、オブジェクトのプロパティに普通にアクセスできます。
警告 |
このモジュールは、
実験的なものです。これは、これらの関数の動作、関
数名は、このドキュメントに書かれて事項と同様に告知なく将来的なPHPのリ
リースで変更される可能性があります。注意を喚起するとともに、このモジュー
ルは使用者のリスクで使用して下さい。 |
要件
これらの関数は、標準モジュールの一部と
して利用可能であり、常に使用できます。
インストール手順
以下の関数を使用するには、オプション
--enable-overloadを指定してPHPをコ
ンパイル必要があります。この拡張モジュールは、
PHP 4.3.0ではデフォルトで有効になっています。
--disable--overloadにより
オーバーロードのサポートを無効とすることができます。
Windows版のPHPには
この拡張モジュールのサポートが組み込まれています。これらの関数を使用
するために拡張モジュールを追加でロードする必要はありません。
注意:
オーバーロードの組み込みサポートはPHP 4.3.0で利用可能となりました。
実行用の設定
この拡張モジュールは設定ディレクティブを全く
定義しません。
リソース型
この拡張モジュールはリソース型を全く定義し
ません。
定義済みの定数
この拡張モジュールは定数を全く定義しませ
ん。
例
overload()関数の簡単な使用例をいくつか示します。
例 1. PHPクラスのオーバーロード
<?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()はプロパティの一段階に
アクセス場合にのみ動作します。
|