文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2024-02-27 20:26

关注

在 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 代码中使用哪种方法。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯