类/对象 函数
在线手册:中文  英文

call_user_method

(PHP 4, PHP 5)

call_user_method 对特定对象调用用户方法(已废弃)

说明

mixed call_user_method ( string $method_name , object &$obj [, mixed $parameter [, mixed $... ]] )
Warning

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


类/对象 函数
在线手册:中文  英文

用户评论:

david dot jarchovsky at gmail dot com (2008-12-17 04:48:03)

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();
?>

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

    
/**
    
        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->runCallbacktrue) . "\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->speakCallbacktrue) . "\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 (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

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

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

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

易百教程