File: overload.xml

package info (click to toggle)
phpdoc 20020310-1
  • links: PTS
  • area: main
  • in suites: woody
  • size: 35,272 kB
  • ctags: 354
  • sloc: xml: 799,767; php: 1,395; cpp: 500; makefile: 200; sh: 140; awk: 51
file content (139 lines) | stat: -rw-r--r-- 4,844 bytes parent folder | download
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
-->