首页 > 编程语言 >PHP中的引用参数的函数

PHP中的引用参数的函数

时间:2023-04-24 14:32:54浏览次数:42  
标签:变量 val demo1 参数 引用 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;

执行结果:

PHP中的引用参数的函数_引用参数

引用参数的函数

在上面的例子中,调用 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;

执行结果如下:

PHP中的引用参数的函数_PHP_02

在上面的实例中,调用 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);

执行结果如下:

PHP中的引用参数的函数_php_03

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

标签:变量,val,demo1,参数,引用,PHP,函数
From: https://blog.51cto.com/micai01/6221121

相关文章

  • BeanUtils.copyProperties()深拷贝失效,对象值被引用改变
    之前就想一个深拷贝的解决方案,尝试用BeanUtils.copyProperties实现现在发现无法实现,两个变量引用位置相同最好自己实现一个工具类。之前在脉脉上看到有人提问,回答是用fastjson序列化解决的 Studentclone=JSONObject.parseObject(JSONObject.toJSONBytes(student),Stude......
  • recv函数具有包的提前预读
    #include<sys/types.h>#include<sys/socket.h>ssize_trecv(intsockfd,void*buf,size_tlen,intflags);1.具有紧急指针功能2.具有带外数据3.数据包提前预读ssize_trecvfrom(intsockfd,void*buf,size_tlen,intflags,......
  • 第六章 重新组织函数
    6.1提炼函数 一个过长的函数或者一段,需要注释才能理解用途的代码,将这段代码放入一个独立的函数。每个函数的粒度很小,复用的机会就会很大。高层函数可读性就很高,看起来就是再读一堆注释。函数都是细粒度,复写也会更容易。提炼出的函数,根据这个函数的意图来命名(以它做什么命名,......
  • 构造函数私有化或保护化
    构造函数私有化或保护化摘自:https://blog.csdn.net/caoyangxiaoyao/article/details/81184786构造函数私有化/保护化可以将构造函数设置为私有函数,但是这样做就无法从外部直接调用构造函数,因此就无法直接构造这个类的对象。1.如果你不想让外面的用户直接构造一个类(类A)的对象,而是......
  • 13、c++使用单例模式实现命名空间函数
    本案例实现一个test命名空间,此命名空间内有两个函数,分别为getName()和getNameSpace();声明命名空间及函数namespacetest{conststd::string&getName()和();conststd::string&getNameSpace();}命名空间内实现单例类实现一个单例类,构造函数要为private,自身对......
  • 箭头函数
    箭头函数提供了一种更加简洁的函数书写方式。基本语法是:参数=>函数体箭头函数多用于匿名函数的定义//传统方式定义函数varf1=function(a){returna}//console.log(f1(3))//es6使用箭头函数定义//参数=>函数体varf2=a=>a//console.log(f2(4)) 使......
  • php按照首字母排序,PHP获取汉字首字母并分组排序
    没问题的直接上代码classCharacter{publicfunctiongroupByInitials(array$data,$targetKey='name'){$data=array_map(function($item)use($targetKey){returnarray_merge($item,['initials'=>$thi......
  • 05 第一个c函数
    hal_start函数:执行板级初始化,初始化hal层:就是硬件抽象层,分离硬件特性,向上提供接口,让内核不在关注硬件相关的细节,也能方便以后的移植和扩展;Cosmos是x86平台下的,其他平台替换hal层即可;init_hal函数,初始化平台、初始化内存、初始化中断;初始化平台:init_halplatform两个任务:......
  • m基于simulink和S函数实现SVPWM永磁同步电机双PI转矩脉动控制系统仿真
    1.算法仿真效果matlab2022a仿真结果如下:     2.算法涉及理论知识概要        永磁同步电机(PMSM)基本结构为定子、转子和端盖。其中转子磁路结构是永磁同步电机(PMSM)与其它电机最主要的区别,其在很大程度上决定了永磁同步电机(PMSM)的实际性能指标[12,13,14]......
  • MKL稀疏矩阵运算示例及函数封装
    IntelMKL库提供了大量优化程度高、效率快的稀疏矩阵算法,使用MKL库的将大型矩阵进行稀疏表示后,利用稀疏矩阵运算可大量节省计算时间和空间,但由于MKL中的原生API接口繁杂,因此将常用函数封装,便于后续使用,最后在实际例子中调用接口执行想要的矩阵运算。0稀疏矩阵稀疏矩阵是指矩阵......