©
本文档使用 PHP中文网手册 发布
(PHP 4, PHP 5)
call_user_method — 对特定对象调用用户方法(已废弃)
$method_name
, object &$obj
[, mixed $parameter
[, mixed $...
]] )call_user_method() 函数从 PHP 4.1.0 开始已经停用,使用 call_user_func() 函数和 array(&$obj, "method_name") 语法代替。
从用户定义的 obj
对象中调用 method_name
指的方法。下边是用法示例,我们定义了一个类,接着创建了一个对象实例,然后使用
call_user_method() 间接调用它的
print_info 方法。
<?php
class Country {
var $NAME ;
var $TLD ;
function Country ( $name , $tld )
{
$this -> NAME = $name ;
$this -> TLD = $tld ;
}
function print_info ( $prestr = "" )
{
echo $prestr . "Country: " . $this -> NAME . "\n" ;
echo $prestr . "Top Level Domain: " . $this -> TLD . "\n" ;
}
}
$cntry = new Country ( "Peru" , "pe" );
echo "* Calling the object method directly\n" ;
$cntry -> print_info ();
echo "\n* Calling the same method indirectly\n" ;
call_user_method ( "print_info" , $cntry , "\t" );
?>
参见 call_user_func_array() 和 call_user_func() 。
[#1] Chris [2008-06-24 07:26:58]
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
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.
[#2] ravichandran_11 at yahoo dot co dot in [2008-03-10 04:32:12]
<?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
[#3] j dot h at h-elektro dot de [2007-02-05 12:11:41]
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
[#4] paulo at emd dot com dot br [2000-09-18 05:12:35]
This function is very similar to this:
<?php
$method="Print";
$object->$method($param1,$param2);
?>
Note the extra $ after the ->
[#5] jmcastagnetto at php dot net [2000-08-21 05:04:02]
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