<html>
<?php
/*
* 2001-03-16
*
* Steven P. Long
*
steven.long@erols.com
*
*
* Illustrates the use of the func_ functions for
* processing variable argument lists in PHP4
*
* Also illustrates dynamic object invocations.
*
*/
//
// Let\'s make a simple Widget class
//
class Widget {
var $a;
function Widget()
{
$this->a = array( \"one\", 2.0, \"III\") ;
echo \"
new widget\" ;
}
function bar( $s = \"bar\" ) { return $s ; }
function get_a() { return 49 ; }
function get_b() { return $this->a ; }
}
//
// Here is the function receiving the variable argument list.
// The argument list may vary in both number and types.
// foo recursively processes arrays and call all methods on
// objects (for illustration only, of course).
//
function foo()
{
// let\'s get the argument list and number of arguments.
$args = func_get_args(); // this is the argument list
$nArgs = func_num_args(); // this is the number of arugments
// iterate through the argument list
for ( $i = 0; $i < $nArgs; ++$i )
{
// get the base type of this parameter [argument]
$bType = strtolower( gettype( $args[$i] ));
switch ( $bType ) // process based on argument\'s type
{
case \"string\":
case \"integer\":
case \"double\":
echo \"
$bType \" . $args[$i] ;
break;
case \"array\": // process arrays recursively
$a = $args[$i];
foreach ( $a as $key => $item )
{
echo \"
recursing on foo for item [$i][$key]\" ;
foo( $item );
}
break;
case \"object\": // call a class method and create a new object
echo \"
type $bType\";
$args[$i]->bar(\"old-\" . $i); // call object->bar()
$cName = get_class( $args[$i] ); // get the class name
$object = new $cName(); // make a new object
$object->bar(\"new-\" . $i); // call the new object->bar()
// now iterate over the methods of $cName and recurse on returns
$method = get_class_methods( $cName );
for ( $m = 0; $m < count( $method ); ++$m )
{
$mName = $method[$m];
if ( $mName != $cName )
{
$x = $object->$mName();
echo \"
type(x) = \" . gettype( $x ) . \" :: \" . $x;
foo( $x );
}
}
break;
default:
echo \"
$bType handled by default.\" ; // all others here
}
echo \"
\";
}
}
//
// This section is the \"driver\" portion for foo.
// Here, the variables are defines and foo is called.
//
// create parameters for foo()
$str = \"aString\"; // string
$chr = \'a\'; // character
$dbl = 9.87; // double (floating point)
$num = 654; // integer
$exp = 3.21e-2; // double (exponential)
$hex = 0xFF; // integer (hexadecimal)
$wdg = new Widget(); // object of type Widget
$ar1 = array( $dbl, $str, $wdg, $hex ); // array of mixed types
$ar2 = array( $chr, $ar1, $num); // another array of mixed types
// let\'s try an array of arrays and some other things
$ar3 = array ( 0 => $ar1
, \'a\' => $ar2
, 2 => $wdg
, \'b\' => $num
);
// call foo() with varying number and type of parameters
foo( $str, $dbl, $chr, $ar1 );
foo( $chr, $ar2, $wdg, $hex, $exp, $ar3 );
?>
</html>