【web 开发基础】PHP中的引用参数的函数 (32)

举报
迷彩 发表于 2023/06/27 19:54:32 2023/06/27
【摘要】 前言php的引用(就是在变量或者函数、对象等前面加上&符号)在PHP 中引用的意思是:不同的名字访问同一个变量内容。与C语言中的指针是有差别的。C语言中的指针里面存储的是变量的内容在内存中存放的地址,函数的引用返回多用在对象中引用参数的函数格式说明如下代码所示:void funName (array &args) 在参数列表中使用&描述参数在PHP中默认是按值传递,而且函数的参数也属于局部变...

前言

php的引用(就是在变量或者函数、对象等前面加上&符号)

在PHP 中引用的意思是:不同的名字访问同一个变量内容。与C语言中的指针是有差别的。C语言中的指针里面存储的是变量的内容在内存中存放的地址,函数的引用返回多用在对象中

引用参数的函数格式说明如下代码所示:

void funName (array &args) 在参数列表中使用&描述参数


在PHP中默认是按值传递,而且函数的参数也属于局部变量,所以即使在函数内部改变参数的值,它并不会改变函数外部的值。函数为子程序,调用函数的程序可以称为父程序。父程序直接传递指定的值或变量给函数使用。由于传递的值或者变量与函数里的数值分别存储与不同的内存区块,所以如果函数对所导入的数值做了任何变动,并不会对父程序造成直接影响。

如下面代码所示:

<?php
/**
 * demo1
 * @param int $arg
 */
 
function demo1($arg){
	$arg = 800;
}

$val = 300;
demo1($val);
echo $val;

执行结果:


引用参数的函数

在上面的例子中,调用 demo1()函数时,将全局变量$val 的值传给函数 demo1()。虽然在 demo1()函数中对变量$val指定了新的值800,但是并不能改变函数外变量$val的值。 调用 demo1()函数结束以后,变量 $val输出的值仍为300。如果希望允许函数修改它的参数值,则必须通过引用传递参数。

相对于值传递模式,并不会将父程序中的指定数值或者目标变量传递给函数,而是把该数值或者变量的内存存储区块相对地址导入函数之中。因此,当该数值在函数中有任何的变动时,会连带对父程序造成影响。如果想要函数的一个参数总是通过引用传递,则在函数定义中,在参数的前面预先加上&符号。这时我们只需要对上面的函数稍作修改即可:

<?php

/**
 * demo1
 * @param int $arg
 */
 
function demo1(&$args){
	$args = 800;
}

$val = 300;
demo1($val);
echo $val;

执行结果如下:


在上面的实例中,调用 demo1()函数时,不是将全局变量$val 的值传给函数 demo1()。而是在demo1()函数的定义中,使用了引用符号 & 将指定变量$val为按引用传递方式。在函数体中对变量$args指定了新的值800,由于按引用方式会修改外部数据,所以外部变量$val的值也一起被修改。函数调用结束以后,可以看到变量$val的输出的结果为:800

注:如果在函数的形参中有使用 & 修饰参数。则在调用该函数时就必须传入一个变量给这个参数,而不能传递一个值


在PHP的系统函数中有很多这样的函数,都需要传递一个变量给引用参数,在函数中改变参数变量的值,则传递的这个参数变量本身的值也会在父程序中被改变。比如:在数组处理函数中的next(),sort(),shuffle(),key()等函数都是引用参数的函数。接下来我们看看sort()排序函数怎么使用:

<?php


$array = array(12,35,67,45,23,25,16,8);
print_r($array);

sort($array);
var_dump($array);

执行结果如下:

从运行结果可以看出使用sort()函数成功对数组$array进行了排序,只需要直接将数组变量$array作为参数调用sort()函数处理,原数组就是排序后的顺序。因为sort()使用的是一个引用参数,所以sort()内部对传入的数组参数进行排序,父进程向该函数传入的数组变量也就会被改变

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。