在调用函数时,需要向函数传递参数,被传入的参数成为实参,而函数定义时的参数为形参。上一章节我们对php自定义函数的参数进行了实例讲解,本章节就重点介绍一下函数间参数传递的3种方式:按照值传递,按引用传递和默认参数。

1.按值传递的方式

将实参的值赋值到对应的形参中,在函数内部的操作针对形参进行,操作的结果不会影响到实参,即函数返回后,实参的值不会改变。值传递(pass-by-value)过程中,被调函数的形式参数作为被调函数的局部变量处理,即在堆栈中开辟了内存空间以存放由主调函数放进来的实参的值,从而成为了实参的一个副本。值传递的特点是被调函数对形式参数的任何操作都是作为局部变量进行,不会影响主调函数的实参变量的值。

首先定义一个函数 example(), 功能是将传入的参数值做一些运算后在输出;接着在函数外部定义一个变量$m,也就是实参;最后调用函数 example($m)。分别在函数体内和体外输出形参 $m 和 实参 $m 的值。

其实例代码如下的显示:<?php

function example($m){

$m = $m + 10;

echo "在函数内部:m = ".$m ."
"; //输出形参的值

}

$m = 1;

example($m); // 将实参$m的值传递给形参$m

echo "在函数外部:m = ".$m; // 实参的值没有变化,$m = 1

?>

函数的运行结果如下图:

2. 按引用传递方式

按引用传递就是将实参的内存地址传递给形参。这时,在函数内部所有对形参的操作都会影响到实参的值。函数返回后,实参的值会发生变化。引用传递方式就是函数定义时在形参前面加上 “ &” 符号。引用传递(pass-by-reference)过程中,被调函数的形式参数虽然也作为局部变量在堆栈中开辟了内存空间,但是这时存放的是由主调函数放进来的实参变量的地址。被调函数对形参的任何操作都被处理成间接寻址,即通过堆栈中存放的地址访问主调函数中的实参变量。正因为如此,被调函数对形参做的任何操作都影响了主调函数中的实参变量。

代码示例如下所示:<?php

function example(&$m){ //定义一个函数,同时传递参数$m的地址

$m = $m + 10;

echo "在函数内部:m = ".$m ."
"; //输出形参的值

}

$m = 1;

example($m); // 将实参$m的地址传递给形参$m

echo "在函数外部:m = ".$m; // 实参的值发生了变化,$m = 11

?>

函数的运行结果如下图:

3. 默认参数(可选参数)

还有一种设置参数的方式,即可选参数。可以指定某个参数为可选参数,将可选参数放在参数列表末尾,并且指定其默认值为空。

应用一个例子使用可选参数实现一个简单的价格计算功能。设置自定义函数 values 的参数 $tax 为可选参数,其默认值为空。 第一次调用该函数,并且给参数 $tax 赋值,输出价格;第二次调用该函数,不给参数复制,输出价格。

其代码如下所示:<?php

function value($price, $tax=""){ //定义一个函数,第二个参数为空

$price = $price*$tax;

echo "价格:$price
"; //输出价格

}

value(10,5); // 为可选参数赋值5

value(10); // 没有给可选参数赋值

?>

输出结果为:

价格:50

价格:0

注意:当使用默认参数时,默认参数必须放在非默认参数的右侧,否则函数可能出错。

说明:从PHP5 开始,默认值也可以通过引用传递。下面一章将介绍什么是自定义函数的返回值。

【相关教程推荐】

php 多参数函数,php自定义函数的参数在函数间传递的三种方式详解相关推荐

  1. python 命令-python解析命令行参数的三种方法详解

    这篇文章主要介绍了python解析命令行参数的三种方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 python解析命令行参数主要有三种方法: ...

  2. vue 函数 路由跳转_vue中通过路由跳转的三种方式

    router-view 实现路由内容的地方,引入组件时写到需要引入的地方 需要注意的是,使用vue-router控制路由则必须router-view作为容器. 通过路由跳转的三种方式 1.router ...

  3. android开发自定义键盘,Android 总结:自定义键盘实现原理和三种实例详解

    1.实现原理 实现软键盘主要用到了系统的两个类 Keyboard 和 KeyboardView .html 1. Keyboard 用于监听虚拟键盘:java Loads an XML descrip ...

  4. js 将内部函数变成全局函数_js中三种作用域详解(全局,函数,块级)

    1.全局变量:声明在函数外部的变量(所有没有var直接赋值的变量都属于全局变量) 2.局部变量:声明在函数内部的变量(所有没有var直接赋值的变量都属于全局变量) JS中变量申明分显式申明和隐式申明. ...

  5. tp6验证参数的几种方式详解

    控制器直接验证 好处是在控制器一眼就能看到有那些验证规则,复用性比较差,每个方法都需要复制一份 1.validate助手函数验证 示例代码 $params = input();//验证try {val ...

  6. python process 函数_Python Process创建进程的2种方法详解

    前面介绍了使用 os.fork() 函数实现多进程编程,该方法最明显的缺陷就是不适用于 Windows 系统.本节将介绍一种支持 Python 在 Windows 平台上创建新进程的方法. Pytho ...

  7. QT中connect函数的几种用法详解总结

    前言 信号与槽机制是QT非常核心的东西,通过信号与槽我们可以将不同的部分有机的结合起来,使得各个组件之间的交互简单高效,信号与曹槽像是设计模式中的观察者模式(我自己觉得是这样),只关心信号何时发来,以 ...

  8. 【python教程入门学习】Python函数定义及传参方式详解(4种)

    这篇文章主要介绍了Python函数定义及传参方式详解(4种),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 一.函数初识 1.定 ...

  9. 函数参数传递三种方式(传值方式,地址传递,引用传递)

    函数参数传递三种方式(传值方式,地址传递,引用传递) 形参与实参 形参即形式上的参数,对实参的一种抽象类型描述只是声明一个函数能够接受什么类型的实参,而不确定接受的实参的具体内容是什么 实参即传递给函 ...

最新文章

  1. 《如何高效学习》作者推荐!
  2. HDU1010 Tempter of the Bone DFS+剪枝
  3. HadoopIO和javaIO的区别
  4. 树-二叉树、满二叉树和完全二叉树
  5. 乐山市计算机学校太坑,乐山市计算机学校小规矩成就大素养
  6. 苹果cms V10模板 仿优酷网PC模板+wap模板
  7. 更快更精准的感知,元戎启行提出基于LiDAR的3D物体检测新框架|CVPR 2020
  8. 微软开源 TensorFlow-DirectML,为 WSL2 提供 GPU 支持
  9. 交叉编译iproute2
  10. 巴蒂尔7个三分火箭破网 麦蒂战表兄取缺姚后首胜
  11. iOS开发之isa、superclass(课程总结)
  12. java 001 002_java笔记0x002:操作符
  13. 韦东山freeRTOS系列教程之【第五章】队列(queue)
  14. 阿里云技术专家入选Apache Member;百度Q1财报:营收241亿元;华为面向全球发布AI-Native数据库……...
  15. 详细版【循环神经网络RNN】(邱锡鹏)
  16. Django - 安装wagtail
  17. 支付宝小程序会员卡开通
  18. 模拟信道与数字信道的区别
  19. github访问不进去,浏览器证书不安全,访问失败,证书失效,证书颁发者为VMware,谷歌浏览器小bug
  20. 英国AI初创企业OKRA获416万美元A轮融资

热门文章

  1. linux系统可以玩星际争霸吧,《星际争霸》4.0版本更新说明
  2. 智能家居创意DIY之智能插座(Homekit可用)
  3. 单片机I/O开漏输出详解 “与逻辑” ,改变上拉电源的电压,提供TTL/CMOS电平输出,标准的开漏脚一般只有输出的能力添加其它的判断电路,才能具备双向输入、输出的能力
  4. 其次坐标,以及和非其次坐标互转
  5. 消耗cpu资源的脚本
  6. IntelliJ IDEA查看一个类的类图结构 show diagrams,用图表的方式查看类的关系层次
  7. NLP-生成模型-2016:CopyNet【Copy机制赋予seq2seq模型从源文本中复制词汇的能力,解决Decoder的OOV问题】
  8. 【学习总结】企业信息化管理之数据管理发展与探索之路
  9. C++ 的成功属于意料之外
  10. 各国立法组织、立法程序、法律法规形式、信息安全涉及主管部门分析-欧盟篇