对象方法参考 - 如何通过?

时间:2013-09-18 18:23:28

标签: php

如何将对象方法的引用传递给变量? 我不知道,尝试了一切。

class CObject
{
    public function method($param)
    {
        return $param;
    }
}

$obj = new CObject();
$a = $obj->method; //doesn't work, here I was trying to pass method reference of object to this variable

3 个答案:

答案 0 :(得分:2)

您不必传递对该方法的引用。由于PHP处理回调的方式,您只需要一个对象引用和方法名称作为字符串。

class AnObject 
{
    public function aMethod( $param )
    {
        return $param . ' was here';
    }
}

$method = 'aMethod';
$object = new AnObject( );
$param = 'fourty two';

// outputs: string(19) "fourty two was here"
var_dump( $object->{$method}($param) ); 

// also outputs: string(19) "fourty two was here"
var_dump( call_user_func( array( $object, $method ), $param ) );  

如果您尝试将引用传递给回调,那么您最有可能找到这个(根据您的原始示例):

$a = array( $object, 'method' );

然后您可以使用参数调用该方法:

$result = call_user_func( $a, 'my parameter' );

文档(call_user_funccallable)解释得更多。

答案 1 :(得分:1)

PHP通过callable机制强制执行引用功能。

如果要保留对方法的引用以供以后调用,则可以执行此操作

$obj = new CObject();
$myMethod = array($obj,'method');

稍后使用call_user_func调用它:

$result = call_user_func($myMethod,$someArgument);

可调用引用不封装方法,而是在类的特定实例的上下文中调用该方法(在本例中为$ obj)。

或者,有一个reflection API可以用来引用一个方法(就像Java一样)。

$obj = new CObject();
$cObjClass = new ReflectionClass($obj);
try{
   $myMethod = $cObjClass->getMethod('method');
   $myMethod->invoke($obj,$someArgument);
}catch(ReflectionException $e){
  //the method does not exist
}

答案 2 :(得分:0)

第二个回答:

class CObject
{
    public function method($param)
    {
        return $param;
    }
}

$obj = new CObject();
$a = $obj->method('value');
echo $a;

经典错误:

$a = function($param) { return $param; }; //lambda function passed to variable
echo $a('param');
你忘记了;