Warning: Call-time pass-by-reference has been deprecated的解决办法

问题提示如下:
Warning: Call-time pass-by- reference has been deprecated – argument passed by value; If you would like to pass it by reference, modify the declaration of [runtime function name] (). If you would like to enable call-time pass-by- reference, you can set allow_call_time_pass_reference to true in your INI file. However, future versions may not support this any longer. in c:\crm203 \modules\Reports\Report.php on line 370
修改 PHP.ini,allow_call_time_pass_reference = On。实际上,我在安装了Apache/2.0.58 (Win32) PHP/4.4.2,这个选项缺省是打开的,另外,我记得有朋友说另一个解决的办法是关闭错误报告功能。实际上,将上述php配置文件的值设为on可以视做一个解决的办法,但关闭报告功能估计是一种自己骗自己的方法,因为这是一个大的错误,不让他显示并不代表就可以解决掉。
我在解决这一问题中发现,一共有几个原因可能导致上述问题:
1.上述值被设置了off。解决方法:修改PHP.ini,allow_call_time_pass_reference = On。
2.如果你在windows下安装,而php安装目录 everyone没有读与执行的权限,可能也会导致这个问题;
3.如果php配置中的session目录设置不正确,也可能导致这一问题。包括配置文件中路径设置不正确和没有创建session数据目录;
4.如果php配置中的includes目录设置不正确,也可能导致这一问题。包括配置文件中中路径配置不正确和没有创建includes这个目录。
上述后三种情况,多数apache+php配置说明都有详细的描述,大家可以参考。

上面这个问题,通常发生在不使用vTigerCRM的安装程序,而是自己手工安装apache+php+mysql中,比如使用单独的安装文件或者easyphp安装包。都很有可能出现上述的问题。  上面是我在解决这些问题时一些经验,不一定有代表性,只希望大家在解决类似问题时提供一些参考。

php.ini中allow_call_time_pass_reference参数的意思

从php手册中可以找到:allow_call_time_pass_reference boolean

是否启用在函数调用时强制参数被按照引用传递。此方法已不被赞成并在 PHP/Zend 未来的版本中很可能不再支持。鼓励使用的方法是在函数定义中指定哪些参数应该用引用传递。鼓励大家尝试关闭此选项并确保脚本能够正常运行,以确保该脚本也能在未来的版本中运行(每次使用此特性都会收到一条警告,参数会被按值传递而不是按照引用传递)。

在函数调用时通过引用传递参数是不推荐的,因为它影响到了代码的整洁。如果函数的参数没有声明作为引用传递,函数可以通过未写入文档的方法修改其参数。要避免其副作用,最好仅在函数声明时指定那个参数需要通过引用传递。

当allow_call_time_pass_reference=Off时<?php
function abc($a,$b){
echo “$a\n”;
echo “$b\n”;
$b = ‘cde’;
}

$a = ‘abc’;
$b = “bcd”;
//不好的用法,会引发一个php warnning
abc($a ,&$b);

echo “$b\n”;
?>要想通过引用来传递参数$b,程序可改为<?php
function abc($a,& $b){
echo “$a\n”;
echo “$b\n”;
$b = ‘cde’;
}

$a = ‘abc’;
$b = “bcd”;
//正确的用法
abc($a ,$b);

echo “$b\n”;
//output is:
//abc
//bcd
//cde
?>