PHP的可变标识符与引用传值

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
点赞

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注