PHPBuilder - Variable argument lists and dynamic instantiation



RSS Twitter
Tips Php Functions

Variable argument lists and dynamic instantiation

by: Steve Long
|
May 10, 2001

<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>

Comment and Contribute

Your comment has been submitted and is pending approval.

Author:
Steve Long

Comment:



Comment:

(Maximum characters: 1200). You have characters left.