<?php
class Overloadable
{
static function call($obj, $method, $params=null) {
$class = get_class($obj);
$suffix_method_name = $method.self::getMethodSuffix($method, $params);
if (method_exists($obj, $suffix_method_name)) {
return call_user_func_array(array($obj, $suffix_method_name), $params);
}else{
throw new Exception('Tried to call unknown method '.$class.'::'.$suffix_method_name);
}
}
static function getMethodSuffix($method, $params_ary=array()) {
$c = '__';
if(is_array($params_ary)){
foreach($params_ary as $i=>$param){
switch(gettype($param)){
case 'array': $c .= 'a'; break;
case 'boolean': $c .= 'b'; break;
case 'double': $c .= 'd'; break;
case 'integer': $c .= 'i'; break;
case 'NULL': $c .= 'n'; break;
case 'object':
if($param instanceof Closure ){
$c .= 'c';
}else{
$c .= 'o';
}
break;
case 'resource': $c .= 'r'; break;
case 'string': $c .= 's'; break;
case 'unknown type':$c .= 'u'; break;
}
}
}
return $c;
}
static function &refAccess($var_name) {
$r =& $GLOBALS["$var_name"];
return $r;
}
}
class test
{
private $name = 'test-1';
function __call($method, $args) {
return Overloadable::call($this, $method, $args);
}
function func__() {
pre('func(void)', __function__);
}
function func__i($int) {
pre('func(integer '.$int.')', __function__);
}
function func__s($string) {
pre('func(string '.$string.')', __function__);
}
function func__so($string, $object) {
pre('func(string '.$string.', '.print_r($object, 1).')', __function__);
}
function func__c(Closure $callback) {
pre("func(".
print_r(
array( $callback, $callback($this->name) ),
1
).");", __function__.'(Closure)'
);
}
function anotherFunction__a($array) {
pre('anotherFunction('.print_r($array, 1).')', __function__);
$array[0]++;
$array['val']++;
}
function anotherFunction__s($key) {
pre('anotherFunction(string '.$key.')', __function__);
$a2 =& Overloadable::refAccess($key);
$a2 *= 3;
}
}
$val = 10;
class obj {
private $x=10;
}
$t = new test;
$t->func();
$t->func($val);
$t->func("hello");
$t->func("str", new obj());
$t->func(function($n){
return strtoupper($n);
});
echo '<br><br>$val='.$val;
$t->anotherFunction(array(&$val, 'val'=>&$val));
echo 'Result: $val='.$val;
$t->anotherFunction('val');
echo 'Result: $val='.$val;
function pre($mixed, $title=null){
$output = "<fieldset>";
$output .= $title ? "<legend><h2>$title</h2></legend>" : "";
$output .= '<pre>'. print_r($mixed, 1). '</pre>';
$output .= "</fieldset>";
echo $output;
}
overloading
, than is being asked in the question. (See the accepted answer for more details.) – ToolmakerSteve