1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139
|
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision: 1.3 $ -->
<reference id="ref.overload">
<title>オブジェクトプロパティとメソッドコールのオーバーロード</title>
<titleabbrev>オブジェクトのオーバーロード</titleabbrev>
<partintro id="overload.partintro">
&warn.experimental;
<para>
この拡張モジュールの用途は、オブジェクトのプロパティへのアクセスと
メソッドのコールのオーバーロードを可能にすることです。この拡張モ
ジュールで定義されている関数は1つだけです。この関数、
<function>overload</function> はこの機能を有効にするクラスの名前を
引数とします。名前を指定されたクラスでこの機能を使用したい場合は以
下の適当なメソッドを定義する必要があります。これらは、
<literal>__get()</literal>,<literal>__set()</literal>,
<literal>__call()</literal>で、それぞれ、プロパティを取得、設定、
メソッドをコールするためのものです。オーバーロード機能は選択可能で
す。これらのハンドラ関数の中でオーバーロードは無効とすることができ、
この場合、オブジェクトのプロパティに普通にアクセスできます。
</para>
<para>
<function>overload</function>関数の簡単な使用例をいくつか示します。
<example>
<title>PHPクラスのオーバーロード</title>
<programlisting role="php">
<![CDATA[
<?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);
?>
]]>
</programlisting>
</example>
</para>
<warning>
<para>
この拡張モジュールは実験的なステータスにあり、全ての機能が動作す
るわけではありません。現在、<literal>__call()</literal>はサポート
されておらず、プロパティの取得または設定操作のオーバーロードだけ
が可能です。クラスの元のオーバーロードハンドラを削除することはで
きません。また、<literal>__set()</literal>はプロパティの一段階に
アクセス場合にのみ動作します。
</para>
</warning>
</partintro>
<refentry id="function.overload">
<refnamediv>
<refname>overload</refname>
<refpurpose>
クラスのプロパティおよびメソッドに関してオーバーロードを可能にする
</refpurpose>
</refnamediv>
<refsect1>
<title>説明</title>
<methodsynopsis>
<type>void</type><methodname>overload</methodname>
<methodparam choice="opt"><type>string</type><parameter>
class_name
</parameter></methodparam>
</methodsynopsis>
<para>
<function>overload</function> 関数は、
<parameter>class_name</parameter>で指定されたクラスのプロパティと
メソッドコールをオーバーロードします。
<link linkend="overload.partintro">このパートの導入部</link>にあ
る例題を参照下さい。
</para>
</refsect1>
</refentry>
</reference>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"../../manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->
|