是否可以使用call_user_func_array()通过引用传递参数?

时间:2008-11-17 06:43:04

标签: php reference callback

使用call_user_func_array()时,我希望通过引用传递参数。我该怎么做例如

function toBeCalled( &$parameter ) {
    //...Do Something...
}

$changingVar = 'passThis';
$parameters = array( $changingVar );
call_user_func_array( 'toBeCalled', $parameters );

4 个答案:

答案 0 :(得分:51)

要使用call_user_func_array()通过引用传递,数组中的参数必须是引用 - 它不依赖于函数定义是否通过引用传递。例如,这将起作用:

function toBeCalled( &$parameter ) {
    //...Do Something...
}

$changingVar = 'passThis';
$parameters = array( &$changingVar );
call_user_func_array( 'toBeCalled', $parameters );

有关详细信息,请参阅call_user_func_array() function documentation上的说明。

答案 1 :(得分:1)

直接地说,这可能是不可能的 - 但是,如果您对正在实现调用代码的的函数进行控制 - 那么就有一个可能找到合适的解决方法。

您是否可以将有问题的变量嵌入到对象中?如果你这样做,代码看起来会有点像这样。

function toBeCalled( $par_ref ) {
    $parameter = $par_ref->parameter;
    //...Do Something...
    $par_ref->parameter = $parameter;
}

$changingVar = 'passThis';
$parembed = new stdClass; // Creates an empty object
$parembed->parameter = array( $changingVar );
call_user_func_array( 'toBeCalled', $parembed );

你知道,PHP中的对象变量只是对象的内容引用 - 所以如果你将一个对象传递给一个函数,那么任何变化该函数对该对象的内容的反映将反映在调用函数可以访问的内容中。

确保调用函数永远不会对对象变量本身进行赋值 - 或者这将导致函数基本上丢失引用。函数所做的任何赋值语句必须严格到对象的内容

答案 2 :(得分:0)

这通过双引用工作,修改$ parameter变量时修改原始变量。

def create
    @book = Book.new(params_book)
    @book.authors_attributes = params[:book][:author_attributes].inject({}){|hash,(k,v)| hash[k] = Author.find_or_initialize_by(name: v['name']).attributes.merge(v) and hash}

    if @book.save
        redirect_to see_book_url(Book.last)
    else
       render 'new'
    end
end

答案 3 :(得分:-2)

除非您在此处使用已弃用的功能。你将在PHP5中生成一个警告,使其不完美。

  

警告:不推荐使用call-time pass-by-reference;如果要通过引用传递它,请修改运行时函数名称的声明。如果您想启用调用时传递引用,可以在INI文件中将allow_call_time_pass_reference设置为true ...

不幸的是,据我所知,似乎没有任何其他选择。