Lia*_*iam 5 php pass-by-reference
简而言之,我有以下功能作为我的框架的一部分:
public function use_parameters()
{
$parameters = func_get_args();
$stack = debug_backtrace();
foreach($stack[0]['args'] as $key => &$parameter)
{
$parameter = array_shift($this->parameter_values);
}
}
Run Code Online (Sandbox Code Playgroud)
其中$ this-> parameter_values = array('value1','value2','value3','value4','value5',...);
在以下上下文中使用:
$instance->use_parameters(&$foo, &$bah);
Run Code Online (Sandbox Code Playgroud)
分配:
$foo = 'value1';
$bah = 'value2';
Run Code Online (Sandbox Code Playgroud)
再次打电话给它
$instance->use_parameters(&$something);
Run Code Online (Sandbox Code Playgroud)
将设置
$something = 'value3'
Run Code Online (Sandbox Code Playgroud)
等等.
从5.3开始,它将返回"已弃用:调用时间传递已被弃用"警告.为了符合5.3的工作方式,我删除了导致:
$instance->use_parameters($foo, $bah);
Run Code Online (Sandbox Code Playgroud)
不幸的是,这导致了这些论点没有确定,我正在努力想出一个解决方案.
值得我在Apache/2.2.16(Debian)上运行PHP v5.3.3-7
任何帮助将不胜感激.
在 PHP 中你不能这样做,并且你滥用了引用的概念。您必须显式指定引用参数,尽管使用默认值。 但是,您不想使用 NULL 作为默认值,因为这是未分配的引用变量将被设置的值。因此,您需要定义一些您知道不会用作参数的常量,现在代码将类似于
const dummy="^^missing^^";
public function use_parameters(&$a, &$b=self::dummy, &$c=self::dummy ) {
$a=array_shift($this->parameter_values);
if($b!==self::dummy) $b=array_shift($this->parameter_values);
if($c!==self::dummy) $c=array_shift($this->parameter_values);
# add $d,$e,$f,... as required to a sensible max number
}
Run Code Online (Sandbox Code Playgroud)
请注意,因为您正确使用了引用,所以不需要 debug_backtrace() 错误。