PHP中的普通变量定义和函数传值比较简单,但可变标识符与函数传址或引用就比较复杂,下面我们来研究一下PHP中的可变标识符和函数传值与传址(引用),希望大家能有所收获。
可变标识符
在PHP中定义变量需要$,那么我们来看看$在可变标识符的应用。
可变变量
$i = 3;
$k = 'i';
echo $$k; //输出3
可变函数
function func() {echo 'hello!';}
$i = 'func'; $i(); //输出hello`
可变下标
$i = '1234';
$k = 3;
echo $i[$k]; //输出4
可变类名
class CLS{public $k = 'hello';}
$i = 'CLS';
$j = new $i;
echo $j->k;
可变属性
class CLS{public $k = 'hello';}
$i = 'k';
$j = new CLS;
echo $j->$i;
可变方法
class CLS{public function k(){echo 'hello';}} $i='k';
$j=new CLS;
$j->$i();
通过上面的例子,我们可以看出不管$用的如何千变万化,其本质都是用来定义或者说明一个变量的,我们只需抓住本质就可以了。
引用传值
普通的变量的引用赋值: $a = &$b,变量a和变量b指向的是用一个内存。
函数调用时的引用参数传递
function func(&$arg){
$arg=5;
}
$a=10;
func($a);
echo $a;
输出的结果是5
早期php是在调用时通过&符号传递引用类型的变量, 比如: func(&$arg);不过现在不能使用了。后来, 函数的引用类型参数被规定为需要在函数声明时定义, 比如: function func(&$arg),也就是我上面的写法。
注: 引用声明时定义引用类型参数后, 运行时引用参数传递被废弃, 需要在php.ini中增加allow_call_time_pass_reference来开启。
PHP函数参数传递是值传递,普通的变量或者数组都是拷贝一份数据,如果传递的是对象的变量,修改了对象的属性是会发生变化的,因为对象的变量存的是对象的地址。
比如:
function func($arg) {
$arg[1]=100;
}
$array=array(7,8,9);
func($array);
echo $array[1],PHP_EOL;
function fun(&$arg) {
$arg[1]=100;
}
$array=array(7,8,9);
fun($array);
echo $array[1];
结果:
8 //值传递
100 //引用传递
对象变量的传递虽然也是值传递,但是这个值存的是对象的地址。比如:
class Test{
var $a=100;
}
function func($arg) {
$arg->a=80;
}
$te=new Test();
func($te);
echo $te->a;
结果:
80
函数返回值是引用类型
函数返回值是引用类型需要声明函数时, 在函数名前增加&符号, 并且, 在调用时, 要用引用赋值方式。
例如:
function &func(&$arg) {
echo $arg,PHP_EOL;
return $arg;
}
$a=10;
$b =& func($a); //这样调用才是引用传值
$b=4;
$c = func($a); //这种调用方式得到的不是引用传值
$c=5;
func($a);
结果:
10
4
4