我有一个聪明的想法,那就是使用自定义错误处理程序,这让我陷入了困境。
以下代码给出(有和没有自定义错误处理程序): fatal error :只能通过引用传递变量
function foo(){
$b=array_pop(array("a","b","c"));
return $b;
}
print_r(foo());
以下代码给出(仅使用自定义错误处理程序):(2048) Only variables should be passed by reference
function foo(){
$a=explode( '/' , 'a/b/c');
$c=array_pop(array_slice($a,-2,1));
return $c;
}
print_r(foo());
第二个问题让我很担心,因为我有很多“紧凑”代码。因此,我要么放弃使用自定义错误处理程序(以改进我的日志记录模块)的好主意,要么扩展我的所有代码。
谁有更好的想法?还有,WTF?
更新:
多亏了这些回答,我才了解到 php 如何处理错误。 E_ALL 不包括 E_STRICT (php 5) 的混淆并不酷。
最重要的是,创建您自己的自定义错误处理程序默认启用 E_STRICT,这就是问题开始的地方。
故事的寓意是使用您自己的错误处理程序来捕获所有错误并使用错误常量(E_STRICT、E_USER_WARNING、E_USER_ERROR 等)进行过滤。
至于变量引用和某些函数的“内存损坏问题”,我能说什么?双重不酷。我将(这并不意味着你应该)忽略我的错误处理程序中的 E_STRICT,生活继续。
最佳答案
array_pop() 尝试更改作为参数传递的值。现在在您的第二个示例中,这是 array_slice() 的返回值。在引擎术语中,这是一个“临时值”,这样的值不能通过引用传递。你需要的是一个临时变量:
function foo(){
$a=explode( '/' , 'a/b/c');
$b=array_slice($a,-2,1);
$c=array_pop($b);
return $c;
}
print_r(foo());
然后可以将对 $b 的引用传递给 array_pop()。参见 http://php.net/references有关引用的更多详细信息。
关于php - 只有变量可以通过引用传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2967597/