在php中除object类型外其它类型的参数都是以传值(既拷贝)的方式传递,包括数组和字符串,这一点和其它大多数编程语言很不一样。大多语言数组都是实际以传址方式进行参数传递。在有的静态语言中可以声明数组类型参数为传值,但这个“值”实际上还是“址”,只是拷贝了一个数组本身的一个引用。而在PHP中则是不折不扣把整个数组元素值传递进函数,拷贝了整个数组。参看我下面所写的测试代码。
<?php
/**
* 演示php函数参数不同的传递方式
*
* @version $Id$
* @copyright 2006
**/
$numvalue=10;
$strvalue="this is string";
$arrvalue=array('key1'=>'this','key2'=>'is','key3'=>'array');
$objvalue=new A();
$objvalue->mystr="this is a object";
class A
{
var $mystr;
function __tostring()
{
return $this->mystr;
}
}
function set_numvalue($value)
{
$value+=1;
echo $value.'<br>';
}
function set_strvalue($value)
{
$value="this is still a string!";
echo $value.'<br>';
}
function set_arrvalue($value)
{
$value['key3']='new array';
echo $value['key3'].'<br>';
}
function set_objvalue($value)
{
$value->mystr="this is a new object";
echo $value->mystr.'<br>';
}
set_numvalue($numvalue);
echo $numvalue.'<br>';
set_strvalue($strvalue);
echo $strvalue.'<br>';
set_arrvalue($arrvalue);
echo $arrvalue['key3'].'<br>';
set_objvalue($objvalue);
echo $objvalue->mystr.'<br>';
?>
在IE中得到如下输出
11
10
this is still a string! //说明函数内的对字串修改不影响外面的字串。
this is string
new array //说明函数内的对数组修改不影响外面的数组。
array
this is a new object //这两行输出一样,说明对象类型是个传址传递。
this is a new object
所以我们在PHP编程进行数组参数传递时,为了提高效率尽可能采用引用变量声明&