You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 
Andrei Zmievski 87f5f3962d Properly return the result of __call() handler. 24 years ago
..
CREDITS Fix CREDIT files, remove email address 24 years ago
README This has been scaring people off. 24 years ago
config.m4 extension converted automatically to PHP_NEW_EXTENSION. Manually confirmed 24 years ago
overload.c Properly return the result of __call() handler. 24 years ago
overload.dsp fix CFLAGS, how could this have worked before? 24 years ago
php_overload.h Maintain headers. 24 years ago

README

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 doesn't work
-----------------
Invoking original overloading handlers, if the class had any.
__set() only works to one level of property access, no chains yet.