PHP函数传值和传引用
在PHP中,函数调用默认是传值方式,即将实参的值复制一份传递给函数,函数使用的是这份复制后的值,而原实参的值并没有改变。我们来看下面的例子:
```php
function foo($bar) {
$bar = 20;
echo $bar;
}
$a = 10;
foo($a); // 输出20
echo $a; // 输出10
```
可以看出,在foo函数中,我们将传入的$bar变量赋值为20,但是这个操作只会影响到函数内部的$bar变量,对于外部传入的$a变量并没有影响。
但是,有时候我们需要在函数内部修改外部传入的变量,这个时候我们就需要使用传引用方式传递变量。
传引用方式就是将实参的地址传递给函数,并在函数内部通过这个地址来对实参进行操作,这样就可以真正地改变实参变量的值了。
我们来看下面这个示例:
```php
function foo(&$bar) {
$bar = 20;
echo $bar;
}
$a = 10;
foo($a); // 输出20
echo $a; // 输出20
```
可以看到,在这个示例中,我们在函数定义时在参数前面加了一个&符号,表示传递的是引用,而不是值。在函数内部我们将传入的变量$bar赋值为20,这个操作同时也会改变外部传入的变量$a的值,因为它们指向的是同一个内存地址。因此,我们在函数外面再次输出$a的值时,发现它已经被改变了。
需要注意的是,在PHP中,只有变量才能够被传引用,不能传递常量或字面值。在函数调用时也必须传递真实的变量名,而不能传递表达式或函数返回值等。
传值和传引用方式的选择
那么,什么情况下应该使用传值方式,什么情况下应该使用传引用方式呢?
传值方式适合于那些只需要使用实参值并不需要改变实参本身的情况。例如,对于一个字符串进行截取操作,根据实参复制一份然后进行操作就可以了,不需要对原字符串进行改变。
而传引用方式则适用于那些需要改变实参本身的情况。例如,对于一个数组进行排序,对原数组进行改变就非常方便。
需要注意的是,在函数中如果修改了实参的值,一定要确保外部传入的变量仍然是有效的。如果函数内部对实参进行了unset操作或者重新给实参赋了新值,那么这个实参变量在函数外部就不再有效了。
例如,在下面这个示例中,经过unset操作后,$a变量就不再指向原来的变量了,如果在unset之后再试图输出$a变量,会得到一个Notice错误。
```php
function foo(&$bar) {
unset($bar);
}
$a = 10;
foo($a);
echo $a; // Notice: Undefined variable: a
``` 如果你喜欢我们三七知识分享网站的文章, 欢迎您分享或收藏知识分享网站文章 欢迎您到我们的网站逛逛喔!https://www.ynyuzhu.com/
发表评论 取消回复