PHP 5.5.X 及更高版本中是否需要再使用 & 符号?

2024-01-11

我到处都收到混合信号。

我是否使用 & 符号通过引用传递变量?

以下链接似乎告诉我它已被弃用并且不再需要:
http://gtk.php.net/manual/en/html/tutorials/tutorials.changes.references.html http://gtk.php.net/manual/en/html/tutorials/tutorials.changes.references.html

但像这样的话题让我想知道:
不推荐使用调用时间传递引用? https://stackoverflow.com/questions/5010036/call-time-pass-by-reference-deprecated

让我以我的问题为例。

如果我使用 PHP 5.5.5 创建一个函数:

function recurring_mailer_form($form, $form_state) 
{

}

是否与以下相同:

function recurring_mailer_form($form, &$form_state) 
{

}

?


不同的文章似乎在说不同的事情,因为它们谈论的是不同类型的引用传递。

决定参数是否应该通过引用传递的主要因素是函数签名本身,自 PHP 4 以来,其基本原理没有改变。考虑这个例子:

function foo( $by_value, &$by_reference ) { /* ... */ }

$a = 1; $b = 2;
foo( $a, $b );

这里,外部变量$a按值传递给函数,就好像它被分配为$by_value = $a;- 更改为$by_value不能影响$a。变量$b然而正在通过引用;就像表格的分配一样$by_reference =& $b;这意味着一个变量被两个名称引用,并且对其中一个名称的任何赋值都将充当对两个名称的赋值。

如果按值传递“普通”值(字符串、数字或数组),则其值只会复制到新变量。从 PHP 5 开始:但是,如果按值传递对象,则会发生稍微不同的情况 - 复制的“值”只是指向同一对象的指针。这意味着如果$a是一个对象,你可以调用$by_value->some_property = 42; and $a->some_property也会是42。但是,如果您为$by_value,仍然不会影响$a.

直到 PHP 5.4,有一个extra通过引用传递参数的方法,这是“强制”引用行为在通话时。这意味着你可以写foo(&$a, &$b);并“捕获”所做的更改$by_value在 - 的里面foo()功能。依赖于此通常是一个坏主意,因此它被删除了。 (它出现在 5.4 中是因为它原本打算在 PHP 6 中删除,但该项目被无限期搁置,较小的更改出现在 5.3 和 5.4 中)。

最后,函数可以return通过引用的变量(如手册中讨论过这里 http://php.net/references.return)。这有点繁琐,因为它实际上需要你把& in twoplace:在函数声明的开头,表示return应该意味着“返回这个变量引用”而不是“返回这个值”;并在调用它的代码中,将变量分配给该引用,而不仅仅是复制其值。这是一个愚蠢的示例,它将引用参数与引用返回组合在一起(两者不必放在一起,这只是一个示例):

function &bar(&$some_param) { return $some_param; }
$a = 1;
$b =& bar($a);
// $b and $a now point at the same variable, not just the same value
// it was passed into and out of a function, and assigned to a new variable, 
// but all those operations were by reference

请注意,许多人错误地认为通过引用传递变量会给他们带来性能优势,这通常是他们使用调用时按引用传递的唯一原因。事实上,这通常是错误的,因为为 PHP 提供支持的 Zend 引擎使用一种称为“写时复制”的技术来留下多个变量,这些变量恰好具有指向同一块内存的相同值,即使它们没有绑定为参考。事实上,参考分配一般defeats这种优化是由于引擎跟踪哪些变量处于写时复制状态的方式而实现的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PHP 5.5.X 及更高版本中是否需要再使用 & 符号? 的相关文章

随机推荐

  • 在特定时间在 qglwidget 上绘制一个矩形

    我在 ubuntu 16 04 上使用 Qt 5 7 和 c 我正在尝试实现一个继承 qglwidget 的类 它以给定的速率 3 10 Hz 将图像渲染到屏幕上 除此之外 我想在屏幕上的某处绘制一个小矩形 将其颜色从黑色更改为白色 反之亦
  • 拆分 html 代码标签和内容

    有没有比我对正则表达式了解更多的人知道如何拆分 html 代码 以便将所有标签和所有单词分开 即 p Some content a href www test com A link a p 是这样分开的 array 0 gt p 1 gt
  • Notepad++ Regex + python脚本(替换中添加)

    我也遇到了这个人同样的问题 Notepad 正则表达式将数字相加 https stackoverflow com questions 20506990 notepad regular expression add up numbers 35
  • 获取不带“px;”的样式值的数字后缀

    我正在尝试对 HTML 元素的位置进行一些比较逻辑 我有一个我认为应该可以工作的系统 但是有一个问题 在我的代码中 我使用不等式语句将一个绝对定位元素的当前左侧值和顶部值与另一个 可能正在移动 的元素进行比较 gt and lt 问题是我得
  • 如果我为实体分配一个 ID,那么如何让 NHibernate 保存它,否则生成一个 ID?

    根据 REST 哲学 PUTrequest 应该更新 URL 上的资源 如果存在 如果不存在则创建它 换句话说 如果我使用以下 URL PUT http server item 5 If an ItemID 为 5 的存在 它将被更新 如果
  • 如何在background.js 和popup.js 之间进行通信?

    我有一个带有后台脚本的扩展 background scripts scripts background js 和内容脚本 content scripts matches js scripts content script js 弹出窗口 p
  • 存储谷歌翻译结果

    我的客户正在使用 Google Translate API 将文本从英语翻译成多种语言 如果客户以 Excel 表格的形式向我提供原始文本和翻译文本 我是否可以将翻译文本存储在我的数据库中 我尝试用谷歌搜索这个 发现一个页面说这是不允许的
  • 如何将表格放在div中

    我有一个div包含一个table有两行 如果单词之间有空格 一切都很好 但是如果我放了一个很长的单词 比如400 个字符 在里面 td 表将退出div 我怎样才能打破这个词并将其限制在 div Here https jsfiddle net
  • App Store 提交后出现无效的二进制错误

    I m constantly getting the following Error 将我的应用程序提交到 App Store 后 我已经尝试了 Apple 邮件中推荐的所有内容以及我在 Stackoverflow 上找到的帖子的答案 尽管
  • ISO 8601 定义感恩节的重复间隔?

    我试图定义一个每年重复的时间间隔 从 11 月的第四个星期四的 13 30z 开始 到同一天的 15 00z 结束 这可以使用 ISO 8601 来完成吗 这种重复无法用当前的 ISO 8601 来表达 ISO 8601 的下一版本很可能包
  • 在 jQuery click() 期间处理程序是否总是同步调用?

    通过一些简短的测试看来click 将触发任何适用的处理程序同步地 也就是说 处理程序都在之前调用click 返回 这对于我正在开发的东西来说是理想的 然而 jQuery 文档似乎并没有保证 没有提到一种或另一种方式 处理程序是同步调用的 同
  • 让文本输入框透明?应该很简单吧?

    我试图使我的表单输入透明并将其覆盖在我的 div 之上 基本上我希望文本字段对其后面的任何内容都是透明的 有什么建议么
  • 哪里可以下载 eclipse 4.4 的 google 插件?

    谷歌的一些服务在这里被屏蔽 我无法从更新站点安装谷歌的插件 那么在哪里下载eclipse 4 4的插件存档 目前 谷歌的官方网站只提供4 3的存档 干得好 http dl google com eclipse plugin core 4 4
  • iOS 如何处理 URL 方案重复?

    如果另外 2 个应用程序注册相同的 url 方案 iOS 如何处理这个问题 The iOS 文档 http developer apple com library ios documentation iPhone Conceptual iP
  • 调试测试时使用 DatabaseManager 连接到内存 Hsql(高超音速)数据库

    我想在 IDE Intellij IDEA 11 1 2 中调试测试时使用 hsql DatabaseManager 或 swing 版本 这并不重要 连接到内存中的 HSQL 数据库实例 我已经按照建议尝试过这个答案 https stac
  • 在 C# 中显示带有 alpha 通道的 PNG

    有没有办法在 C 应用程序中正确显示带有 alpha 通道的图像 比如说 PNG 感谢您的任何建议 UPDATE 好吧 我的问题有点不准确 我想获得 Alpha 通道的真正透明度 不填充父级的背景颜色 在下图中我们可以看到支持透明度 但按钮
  • Objective C 类别的实例变量

    我遇到的情况是 我似乎需要将实例变量添加到类别中 但我从 Apple 的文档中知道我不能这样做 所以我想知道最好的替代方案或解决方法是什么 我想要做的是添加一个类别 为 UIViewControllers 添加功能 我会发现它在我所有不同的
  • 在大型分箱数据集上使用“ggplot”时出现内存泄漏

    我正在制作各种ggplot在非常大的数据集上 比示例大得多 我在 x 轴和 y 轴上创建了一个分箱函数 以便能够绘制如此大的数据集 在下面的示例中 memory size 是在开始时记录的 然后将大数据集模拟为dt dt s x2是针对x1
  • SQL Server 的自定义处理器 + DBCPConnectionPool:未加载驱动程序 jar

    I have created a controller service to connect to a test db 我有一个自定义处理器 可以从 SQL Server 读取数据 模拟测试 构建和部署到 NiFi 都成功 处理器遇到错误
  • PHP 5.5.X 及更高版本中是否需要再使用 & 符号?

    我到处都收到混合信号 我是否使用 符号通过引用传递变量 以下链接似乎告诉我它已被弃用并且不再需要 http gtk php net manual en html tutorials tutorials changes references