iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >PHP 通过引用与通过值传递变量
  • 526
分享到

PHP 通过引用与通过值传递变量

2024-02-27 20:02:56 526人浏览 薄情痞子
摘要

在 PHP 中,我们可以通过两种不同的方式将变量传递给函数:按值和按引用。 了解这两种传递变量的方法之间的区别对于编写高效且有效的 php 代码很重要。 按值传递变量 默认情况下,PHP 按值将

PHP 中,我们可以通过两种不同的方式将变量传递给函数:按值和按引用。 了解这两种传递变量的方法之间的区别对于编写高效且有效的 php 代码很重要。

按值传递变量

默认情况下,PHP 按值将变量传递给函数。 这意味着创建变量的副本并将其传递给函数,函数内对变量所做的任何更改都不会影响函数外的原始变量。

下面是在 PHP 中按值传递变量的示例:


function increment($num) {
    $num++;
    return $num;
}

$x = 5;
$new_x = increment($x);
echo $x; // 👉️ output: 5
echo $new_x; // 👉️ output: 6

在此示例中,increment 函数采用参数 $num 并将其递增 1。当使用变量 $x 调用该函数时,将创建 $x 的副本并将其传递给该函数。 该函数递增 $x 的副本,然后返回新值。 但是,**$x** 的原始值没有改变。


通过引用传递变量

在 PHP 中,我们还可以通过引用将变量传递给函数。 当通过引用传递变量时,将对原始变量的引用而不是副本传递给函数。 这意味着对函数内变量所做的任何更改都会影响函数外的原始变量。

下面是在 PHP 中通过引用传递变量的示例:


function increment_by_reference(&$num) {
    $num++;
}

$x = 5;
increment_by_reference($x);
echo $x; // 👉️ output: 6

在此示例中,increment_by_reference 函数使用 & 符号通过引用获取参数 $num。 当使用变量 $x 调用该函数时,对 $x 的引用将传递给该函数。 该函数使用引用递增 $x 的值,并且更改反映在函数外部的原始变量 $x 中。


使用场景

通常,按值传递变量是 PHP 中的默认和首选方法。 但是,在某些情况下,可能需要或更有效地通过引用传递变量。 以下是一些指南,可帮助我们决定何时使用哪种方法:

  • 当我们不需要修改原始变量并希望避免意外副作用时,按值传递变量。
  • 当我们需要修改原始变量或希望避免对大型或复杂数据结构进行不必要的复制时,通过引用传递变量。

在 PHP 中,所有变量都存储在内存中。 当我们将变量传递给函数时,PHP 会在内存中创建该变量的副本并将该副本传递给函数。 这称为按值传递。

按值传递确保对函数内变量所做的任何更改都不会影响函数外的原始变量。 这是因为该函数使用的是变量的副本,而不是原始变量本身。

另一方面,当我们通过引用传递变量时,PHP 不会在内存中创建该变量的副本。 相反,它将对内存中原始变量的引用传递给函数。

引用是指向存储变量的内存地址的指针。 当我们通过引用传递变量时,该函数直接使用内存中的原始变量。 这意味着对函数内变量所做的任何更改都会影响函数外的原始变量。

在幕后,PHP 使用称为 zval 引用计数 的机制实现引用传递。 当我们通过引用传递变量时,PHP 会创建一个新的 zval(一种保存变量值和其他信息的结构)并将其“is_ref”标志设置为 1 以指示它是一个引用。 PHP 还会增加 zval 的引用计数。

当函数修改变量时,PHP 更新 zval 的值并减少引用计数。 当函数返回时,PHP 检查 zval 的引用计数。 如果计数大于 1,则意味着还有其他对 zval 的引用(即指向同一内存地址的其他变量)。 在这种情况下,PHP 会为返回值创建一个新的 zval 并减少原始 zval 的引用计数。 如果计数为 1,则表示不再使用 zval,因此 PHP 可以简单地返回原始 zval

通过引用传递变量比通过值传递更有效,尤其是对于大型或复杂的数据结构。 这是因为按值传递需要 PHP 在内存中创建变量的副本,这对于大型或复杂变量来说可能是耗时且占用内存的。 通过引用传递允许函数直接使用内存中的原始变量,避免复制变量的开销。

但是,如果我们不小心,通过引用传递变量也可能导致意外行为。 如果在函数内修改变量,会影响到函数外的原变量。 这在某些情况下可能很有用,但它也会引入错误并使您的代码更难理解和维护。

一般来说,按值传递变量是一种很好的做法,除非有特定的理由按引用传递。 这可以帮助我们避免意外的副作用,并使代码更易于预测和推理。


总结

了解在 PHP 中按值传递变量和按引用传递变量之间的区别对于编写高效且有效的代码很重要。 默认情况下,PHP 按值传递变量,但也可以使用 & 符号按引用传递变量。 使用本文中概述的准则来确定何时在自己的 PHP 代码中使用哪种方法。

--结束END--

本文标题: PHP 通过引用与通过值传递变量

本文链接: https://www.lsjlt.com/news/568951.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • PHP 通过引用与通过值传递变量
    在 PHP 中,我们可以通过两种不同的方式将变量传递给函数:按值和按引用。 了解这两种传递变量的方法之间的区别对于编写高效且有效的 PHP 代码很重要。 按值传递变量 默认情况下,PHP 按值将...
    99+
    2024-02-27
  • PHP 变量通过引用传递
    变量默认按值传递给函数,但在 PHP 中也可以通过引用传递。本文演示如何在 PHP 中通过引用传递。 PHP 变量通过引用传递 & 符号 & 将添加到变量参数的开头,以便在 PH...
    99+
    2024-02-27
  • 如何通过引用传递变量?
    问题内容 我编写这个类是为了测试: class PassByReference: def __init__(self): self.variable = 'Or...
    99+
    2024-02-09
    作用域
  • 如何通过C#引用传递
    这篇文章主要介绍“如何通过C#引用传递”,在日常操作中,相信很多人在如何通过C#引用传递问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何通过C#引用传递”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!C#...
    99+
    2023-06-17
  • 在 Go to 函数中通过引用和值传递
    在PHP开发中,Go to 函数是一个非常常用的函数,可以用于控制程序的流程。在使用Go to函数时,我们有两种传递参数的方式:通过引用和通过值传递。通过引用传递参数时,函数内部对参数...
    99+
    2024-02-13
  • 通过引用改变接口值
    php小编百草在这里为大家介绍一种通过引用改变接口值的方法。在编程中,有时候我们需要改变一个函数或方法的参数,但是又不希望直接返回一个新的值,而是希望通过引用的方式修改原来的值。这种情...
    99+
    2024-02-14
    overflow
  • php怎么通过url传递参数
    在PHP中,可以通过URL传递参数使用GET方法或POST方法。1. 通过GET方法传递参数:通过在URL中附加参数来传递参数,参数...
    99+
    2023-08-17
    php
  • Python如何通过变量ID得到变量的值
    目录通过变量ID得到变量的值如何查看一个变量的id用id()函数通过变量ID得到变量的值 已知获得变量的id用函数id(),那么它的反函数是什么? 答案是:PyObj_FromPtr...
    99+
    2024-04-02
  • Python怎么通过变量ID得到变量的值
    本篇内容介绍了“Python怎么通过变量ID得到变量的值”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!通过变量ID得到变量的值已知获得变量的...
    99+
    2023-06-30
  • php如何通过变量调用方法
    这篇“php如何通过变量调用方法”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“php如何通过变量调用方法”文章吧。1.使用可...
    99+
    2023-07-06
  • 在Java中字符串是通过引用传递的吗
    本篇内容介绍了“在Java中字符串是通过引用传递的吗”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1. 一...
    99+
    2024-04-02
  • mysql通过@变量实现递归详细实例
    目录1. 测试表结构2. 向下递归(包括自己)3.向下递归(不包括自己)4. 向下递归可能存在问题,修正优化:5. 向上递归所用函数介绍:1、GROUP_CONCAT([distinct] colName)2、F...
    99+
    2023-06-08
    mysql如何实现递归 mysql递归sql mysql @变量
  • 如何通过PHP输出HTML表格并显示变量值
    小编给大家分享一下如何通过PHP输出HTML表格并显示变量值,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!PHP输出HTML表格并显示变量值:老规矩了,分步骤进行...
    99+
    2023-06-20
  • php通过url传递参数的方法是什么
    PHP通过URL传递参数的方法有两种:1. 使用GET方法传递参数在URL后面添加参数,格式为`参数名1=值1&参数名2=值2&.....
    99+
    2023-08-09
    php
  • Angular5.0 子组件如何通过service传递值给父组件
    这篇文章主要为大家展示了“Angular5.0 子组件如何通过service传递值给父组件”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Angular5.0 子...
    99+
    2024-04-02
  • golang通过反射设置结构体变量的值
    如果需要动态设置struct变量field的情况下, 可以利用reflect来完成。 代码如下: package main import ( "fmt" "reflect" ...
    99+
    2024-04-02
  • vue怎么通过params和query传值
    这篇文章主要介绍了vue怎么通过params和query传值的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇vue怎么通过params和query传值文章都会有所收获,下面我们一起来看看吧。vue通过路由传值在许...
    99+
    2023-06-30
  • 怎么通过CGI程序传递Radio数据
    本篇内容介绍了“怎么通过CGI程序传递Radio数据”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!通过CGI程序传递Radio数据Radio...
    99+
    2023-06-08
  • vue怎么通过按钮传递新页面
    在Vue中,我们可以通过路由来实现页面之间的跳转。在本文中,我们将探讨如何在Vue中使用按钮传递到新页面。我们将使用Vue的官方路由器插件Vue Router。Vue Router是Vue.js官方路由器。它允许我们设置路由表,将一些URL...
    99+
    2023-05-23
  • 怎么通过CGI程序传递checkbox数据
    本篇内容介绍了“怎么通过CGI程序传递checkbox数据”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!通过CGI程序传递checkbox数...
    99+
    2023-06-08
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作