Php 如何修复写上下文中的内置函数

Php 如何修复写上下文中的内置函数,php,Php,以下=&在php7.2或更高版本中创建错误。我不知道如何解决这个问题。如有任何意见,将不胜感激 public function title() { // If we have some segments passed // this line creates an error if ($title_segments =& func_get_args()) { $this->_title = implode($this->_tit

以下
=&
在php7.2或更高版本中创建错误。我不知道如何解决这个问题。如有任何意见,将不胜感激

public function title()
{
    // If we have some segments passed
    // this line creates an error
    if ($title_segments =& func_get_args())
    {
        $this->_title = implode($this->_title_separator, $title_segments);
    }

    return $this;
}

...

public function get_by()
{
    // this line creates an error
    $where =& func_get_args();
    $this->_set_where($where);

    return $this->db->get($this->_table)
        ->row();
}

你写的东西毫无意义
func\u get\u args()
返回一个参数数组;如果可以获得对该数组的引用,则可以修改函数的实际参数列表(考虑对其执行
array\u pop()

让我给你看一个没有绒毛的例子:

function add_nums ($first, $second) {
  return $first + $second;
}
很简单<代码>添加nums(10,25)返回35

现在,如果在那里调用
func\u get\u args()
,会怎么样?你会得到
[10,25]
。但是这个数组不存在——它不在代码中。引擎是从参数列表创建它的,但它实际上不是来自您的代码

引用该数组意味着什么?它可以是对
func\u get\u args()
为您创建的副本的引用,也可以是对实际参数列表的引用。在前一种情况下,它不会比实际阵列更好;将其视为引用是没有意义的,因为进一步调用
func\u get\u args()
将直接从原始文件创建一个新副本。在后一种情况下,您需要创建一个指向引擎内部的特殊引用,以便在调用函数后可以修改函数的参数列表,这是一个非常奇怪的概念。例如,如果您可以在该示例中获取对参数列表的引用并在其上调用
array\u pop()
,则引擎必须更新其内部结构,以反映调用现在是
add\u nums(10)
,而不是
add\u nums(10,25)


这就是为什么你不能得到对参数列表的引用
$foo=&func\u get\u args()
毫无意义-没有解决办法。

除非您可以提供特定的用例,因为任何版本的PHP都不支持引用从
func\u get\u args()
传递给函数的值的预期用途,我建议只删除by reference赋值运算符
&

最终,它将不会像我认为的那样工作,并将在
PHP<7.2
中发出警告,或者在
PHP 7.2+
中发出致命错误

PHP4.4.0-4.4.9、7.0.0-7.1.25

注意:只能通过引用指定变量

PHP5.0.5-5.6.38

严格标准:只能通过引用指定变量

此外,从
PHP5.0+
开始,对象将通过引用进行分配,不需要通过引用传递它们

例子:
性能和可读性略有提高。我建议使用PHP5.6+而不是
func\u get\u args()
,这将产生相同的结果

例子:
你犯了什么错误?它必须是注意而不是错误,您可以在行前使用
@
使其静音。@Viney如标题中的致命错误:无法在编写上下文中使用内置函数的结果我建议使用PHP 5.6+而不是
func_get_args()
,但它不能用于通过引用传递参数。虽然我不确定在这种情况下是否有必要通过引用进行传递。有效地通过引用传递并没有被我看到的使用。@fyrye我看到了!不知道在7.2中他们把它改成了E_错误。写得好!谢谢你的努力。我想补充一点,通过传递对象,有一种技术上的解决方法,因为它们是通过引用分配的,并使用对象属性的
func\u get\u args()
,但在问题中没有以这种方式使用。@fyrye谢谢!这将为您提供一个对对象本身的引用,但肯定不是对参数列表的引用-如果您将其他值与对象一起传递,那么修改对象显然不会影响这些值(假设对象不包含对它们的引用)。引用参数列表本身的概念是有问题的。是的,我理解。我发布了一个答案,解释了相关问题尽管如此,还是对你所付出的努力表示赞赏。保持好答案!
function title()
{
    $title_segments =& func_get_args();

    //change argument 1 ($a) to C
    $title_segments[0] = 'C'; 

    var_dump($title_segments);
}

$a = 'A';
title($a);

//passing by reference in PHP < 7.2 does not result in intended results of $a = 'C'
var_dump($a);
//var_dump($title_segments)
array(1) {
  [0]=>
  string(1) "C"
}

//var_dump($a)
string(1) "A" 
function title(...$title_segments)
{
    $title_segments[0] = 'C'; 

    var_dump($title_segments);
}