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 140 141 142
|
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- $Revision: 1.2 $ -->
<reference id="ref.overload">
<title>Object property and method call overloading</title>
<titleabbrev>Object overloading</titleabbrev>
<partintro id="overload.partintro">
&warn.experimental;
<para>
O propsito desta extenso permitir overload de propriedades
de acesso e metodos de objetos. Somente uma funo definida
nesta extenso, <function>overload</function> que recebe o
nome da classe que deve ter esta funcionalidade habilitada.
A classe especificada tem que definir os metodos para
ter esta funcionalidade: <literal>__get()</literal>,
<literal>__set()</literal> and <literal>__call()</literal>
respectivamente para get/set as propriedades, ou chamar um metodo.
Desta forma o overloading pode ser seletivo. Dentro destas funes
o overloading disabilitado de forma que voc possa acessar
propriedades do objeto normalmente.
</para>
<para>
Alguns exemplos simples da utilizao da funo
<function>overload</function>
<example>
<title>Overload de uma classe no PHP</title>
<programlisting role="php">
<![CDATA[
<?php
class OO
{
var $a = 111;
var $elem = array('b' => 9, 'c' => 42);
// Metodo callback para pegar uma propriedade
function __get($prop_name, &$prop_value)
{
if (isset($this->elem[$prop_name])) {
$prop_value = $this->elem[$prop_name];
return true;
} else {
return false;
}
}
// Metodo callback para definir uma propriedade
function __set($prop_name, $prop_value)
{
$this->elem[$prop_name] = $prop_value;
return true;
}
}
// Aqui ns feito o overload do objeto OO
overload('OO');
$o = new OO;
print "\$o->a: $o->a\n"; // print: $o->a:
print "\$o->b: $o->b\n"; // print: $o->b: 9
print "\$o->c: $o->c\n"; // print: $o->c: 42
print "\$o->d: $o->d\n"; // print: $o->d:
// adicionar um novo intem para o array $elem em OO
$o->x = 56;
// iniciar stdclass ( integrada no PHP 4)
// $var no overloaded!
$val = new stdclass;
$val->prop = 555;
// Que "a" seja um array com o objeto $val dentro dele
// mas __set() o colocar no array $elem
$o->a = array($val);
var_dump($o->a[0]->prop);
?>
]]>
</programlisting>
</example>
</para>
<warning>
<para>
Como esta uma extenso experimental, nem todas
as coisas funcionam. No existe ainda suporte para
<literal>__call()</literal> e voc somente pode
fazer overload das operaes get e set para
propriedades. Voc no pode invocar as chamadas
originais da classe (antes de terem sido overloaded),
e <literal>__set()</literal> somente funciona
at um nvel de acesso de propriedades.
</para>
</warning>
</partintro>
<refentry id="function.overload">
<refnamediv>
<refname>overload</refname>
<refpurpose>
Habilitar overloading de chamadas de propriedade e metodo para classes
</refpurpose>
</refnamediv>
<refsect1>
<title>Descrio</title>
<methodsynopsis>
<type>void</type><methodname>overload</methodname>
<methodparam choice="opt"><type>string</type><parameter>
class_name
</parameter></methodparam>
</methodsynopsis>
<para>
A funo <function>overload</function> ir habilitar overloading
de chamadas de propriedades e metodos para classes identificadas
por <parameter>class_name</parameter>.
<link linkend="overload.partintro">Veja um exemplo
na seo introdutria desta parte</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
-->
|