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);
}