note 84022 deleted from function.call-user-method by cmb

From: Date: Sun, 25 Oct 2020 13:15:30 +0000
Subject: note 84022 deleted from function.call-user-method by cmb
References: 1  Groups: php.notes 
Request: Send a blank email to php-notes+get-215644@lists.php.net to get a copy of this message
Note Submitter: Chris ---- From what i've observed, call_user_func() does everything this funciton does and a little more. I made a pretty good example call_user_func()'s usage with object instances and figured it might be useful here: <?php /** This is a demonstration of 2 neat features of PHP * passing array arguments in as a big array, and using += to assign defaults to missing values This would allow for function calls that more closely mimick thoes made in javascript using JSON, with enough work, it could be almost identical using associative arrays * function callbacks within a class to global instances of other classes This allows you pass a function callback to an object early on, and hold off its execution until later in the program (say during page outputing after everything has been setup) **/ class Runner { public $id; public function __construct($id) { $this->id = $id; echo "constructing " . __CLASS__ . " with id of $id<br />\n"; } public function run($distance = null, $measurement = 'km') { if ($distance) { echo 'I ran ' . $distance . ' ' . $measurement . '.'; } else { echo 'I ran.'; } echo "({$this->id})<br />\n"; } } class Speaker { public $id; public function __construct($id = 0) { $this->id = $id; echo "constructing " . __CLASS__ . " with id of $id<br />\n"; } public function speak($statement = 'hello world') { echo $statement . "({$this->id})<br />\n"; } } class Test { protected $runCallback = null; protected $speakCallback = null; protected $statement; protected $distance; public function __construct(array $params = array()) { echo "constructing " . __CLASS__ . "<br />\n"; $params += array('speakCallback' => array('Speaker', 'speak'), 'runCallback' => array('Runner', 'run'), 'statement' => 'Hello from ' . __CLASS__ . ' class!', 'distance' => 10); foreach($params as $k => $v) { $this->$k = $v; } } public function getInstance() { return new self(current(func_get_args())); } public function callRunner() { if (is_callable($this->runCallback)) return call_user_func($this->runCallback, $this->distance); else throw new Exception("runCallback is not callable\n" . var_export($this->runCallback, true) . "\n"); } public function callSpeaker() { if (is_callable($this->speakCallback)) return call_user_func($this->speakCallback, $this->statement); else throw new Exception("speakCallback is not callable\n" . var_export($this->speakCallback, true) . "\n"); } } $r = new Runner(1); $s = new Speaker(2); // Note that we're using $s instead of 'Speaker' call_user_func(array($s, 'speak'), 'Hello from global!'); // try out from global with call_user_func_array() to pass args as an array call_user_func_array(array($r, 'run'), array(5, 'mi')); $Test = new Test(array('runCallback' => array($r, 'run'), 'speakCallback' => array($s, 'speak'))); $Test->callRunner(); $Test->callSpeaker(); $Test = call_user_func(array('Test', 'getInstance'), array('runCallback' => array($r, 'run'), 'distance' => 15)); // should work as expected $Test->callRunner(); // should throw an error for trying to use this during a static call to Speaker::speak() because of the default $Test->callSpeaker(); ?> Hope that's helpful.

« previous php.notes (#215644) next »