mirror of
https://github.com/php/php-src.git
synced 2024-11-25 19:05:31 +08:00
.. | ||
config.m4 | ||
CREDITS | ||
EXPERIMENTAL | ||
Makefile.in | ||
overload.c | ||
overload.dsp | ||
php_overload.h | ||
README |
This extension is experimental. That's all I'm required to say, as you should know the consequences, but I'll go ahead and add a few more notes. The purpose of this extension is to allow user-space overloading of object property access and method calls. It has only one function, overload() which takes the name of the class that should have this functionality enabled. But the class has to define appropriate methods if it wants to have this functionality: __get(), __set(), and __call(). So, overloading can be selective. Inside each handler the overloading is disabled so you can access object properties normally. Usage ----- <?php class OO { var $a = 111; var $elem = array('b' => 9, 'c' => 42); function OO($aval = null) { $this->a = $aval; } 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; } function __call($method, $args, &$return_value) { print '-- OO::' . $method . "() was called.--\n"; $return_value = call_user_func_array(array(&$this, 'my_' . $method), $args); return true; } function my_whatever($f1, $f2, $f3) { var_dump($f1, $f2, $f3); return $f1 + $f2; } function __get_foo(&$prop_value) { $prop_value = 'Bam bam bam!'; return true; } function __set_count($prop_value) { if ($prop_value >= 1 && $prop_value <= 100) { $this->elem['COUNT'] = $prop_value; return true; } else return false; } } overload('OO'); $o = new OO; print "\$o->a: $o->a\n"; print "\$o->b: $o->b\n"; print "\$o->c: $o->c\n"; print "\$o->d: $o->d\n"; $val = new stdclass; $val->prop = 555; $o->a = array($val); var_dump($o->a[0]->prop); var_dump($o->whatever(1, 2, 'a')); var_dump($o->foo); $o->count = 100; var_dump($o->COUNT); ?> What works ---------- Whatever you can get it to do. What doesn't work ----------------- Invoking original overloading handlers, if the class had any. __set() only works to one level of property access, no chains yet Whatever else I am forgetting about here. What might change ----------------- Hell, anything, even the name of extension and its only function. Feedback, please.