LXXV. Propriet� object e method call overloading
Attenzione |
Questo modulo �
SPERIMENTALE. Ovvero, il comportamento di queste
funzioni, i nomi di queste funzioni, in definitiva tutto ci�
che � documentato qui pu� cambiare nei futuri rilasci
del PHP senza preavviso. Siete avvisati, l'uso di questo modulo
� a vostro rischio. |
Lo scopo di questa estensione � di permettere l'overloading delle propriet�
di accesso agli oggetti e dei metodi di chiamata. Solo una funzione � definita
in questa estensione, overload() che prende il
nome dalla classe che ha questa funzionalit� abilitata.
La classe nominata ha da definire metodi appropriati se
vuole avere questa funzionalit�: __get(),
__set() and __call()
rispettivamente per ricevere/impostare una propriet�, o chiamare un metodo.
Questa strada del sovraccarico pu� essere selettiva. Dentro queste
funzioni handler l'overloading � disabilitato cos� si pu� accedere
alle propriet� dell'oggetto normalmente.
Alcuni semplici esempi sull'uso della funzione
overload()
Esempio 1. Overloading di una classe PHP <?php
class OO
{
var $a = 111;
var $elem = array('b' => 9, 'c' => 42);
// Callback method for getting a property
function __get($prop_name, &$prop_value)
{
if (isset($this->elem[$prop_name])) {
$prop_value = $this->elem[$prop_name];
return true;
} else {
return false;
}
}
// Callback method for setting a property
function __set($prop_name, $prop_value)
{
$this->elem[$prop_name] = $prop_value;
return true;
}
}
// Here we overload the OO object
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:
// add a new item to the $elem array in OO
$o->x = 56;
// instantiate stdclass (it is built-in in PHP 4)
// $val is not overloaded!
$val = new stdclass;
$val->prop = 555;
// Set "a" to be an array with the $val object in it
// But __set() will put this in the $elem array
$o->a = array($val);
var_dump($o->a[0]->prop);
?> |
|
Attenzione |
Siccome � una estensione sperimentale, non tutto
funziona. Non c'� attualmente il supporto per
__call(),
puoi solo overloadare le operazioni di ricezione e di impostazione
per le propriet�. Non puoi invocare l'overloading
handlers originale della classe, e
__set() funziona solo su un livello
di propriet� di accesso.
|
- Sommario
- overload -- Abilita le propriet� e il method call overloading per una classe