It's possible to use this function in case of calling static methods too.
<?php
class example {
public static function b(){
$self = self;
call_user_method('c',$self);
}
public static function c(){
echo "B\n";
}
};
example::b();
?>
call_user_method
(PHP 4, PHP 5)
call_user_method — Roept een methode aan op een door de programmeur gespecificeerd object [vervangen]
Beschrijving
mixed call_user_method
( string $methode_naam
, object $obj
[, mixed $parameter
[, mixed $...
]] )
Warning
De functie call_user_method() is reeds vervangen in PHP 4.1.0. Gebruik de functie call_user_func() in plaats van deze.
Roept de methode methode_naam aan op het door de programmeur gespecificeerde object obj . Verderop vind je een voorbeeld waarin we een klasse definiëren, een object instantiëren en vervolgens call_user_method() gebruiken om indirect de methode print_info aan te roepen.
<?php
class Land {
var $NAAM;
var $TLD;
function Land($naam, $tld) {
$this->NAAM = $naam;
$this->TLD = $tld;
}
function print_info($voorvoegsel="") {
echo $voorvoegsel."Land: ".$this->NAAM."\n";
echo $voorvoegsel."Top Level Domain: ".$this->TLD."\n";
}
}
$land = new Land("Nederland","nl");
echo "* De methode wordt nu direct aangeroepen\n";
$land->print_info();
echo "\n* De methode wordt nu indirect aangeroepen\n";
call_user_method ("print_info", $land, "\t");
?>
Zie ook call_user_func_array(), call_user_func(), en call_user_method_array().
call_user_method
david dot jarchovsky at gmail dot com
17-Dec-2008 01:48
17-Dec-2008 01:48
Chris
24-Jun-2008 04:26
24-Jun-2008 04:26
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.
ravichandran_11 at yahoo dot co dot in
10-Mar-2008 01:32
10-Mar-2008 01:32
<?php
class abc{
function func($argument) {
$argument="It works";
}
}
$obj=new abc;
$argument_to_be_changed="No it doesn't work";
call_user_method("func", $obj, &$argument_to_be_changed);
echo "Result : ".$argument_to_be_changed;
?>
This code is working. But will through some warning message which you can hide by configuring php.ini
j dot h at h-elektro dot de
05-Feb-2007 09:11
05-Feb-2007 09:11
It does not work to use Pointers as Arguments:
<?php
class abc{
function func(&$argument) {
$argument="It works";
}
}
$obj=new abc;
$argument_to_be_changed="No it doesnt";
call_user_method("func", $obj, $argument_to_be_changed);
echo "Result".$argument_to_be_changed;
?>
The result is: "No it doesnt".
Regards
der Jan
paulo at emd dot com dot br
18-Sep-2000 02:12
18-Sep-2000 02:12
This function is very similar to this:
<?php
$method="Print";
$object->$method($param1,$param2);
?>
Note the extra $ after the ->
jmcastagnetto at php dot net
21-Aug-2000 02:04
21-Aug-2000 02:04
You can pass a variable number of parameters to a function, use a definition like:
function mymethod ($v1, $v2, $v3="", $v4="")
and then you can pass 2, 3 or 4 parameters. This is explained in the "Functions" section of the manual.
See also the PHP4 functions: func_num_args(), func_get_arg(), and func_get_args(), and examples therein
