目录
什么是通过参考的?
性能:有帮助吗?
常见的陷阱和陷阱
1。意外副作用
2。参考持续存在
3。返回参考(高级使用)
您什么时候应该逐行使用?
底线
首页 后端开发 php教程 了解PHP的通过参考:表现和陷阱

了解PHP的通过参考:表现和陷阱

Aug 03, 2025 pm 03:10 PM
PHP Functions

由于复印件和对象手柄,PHP中的传递不会通过大型数组或对象提高性能,因此不应将其用于该目的; 1。仅在需要修改原始变量(例如交换值或通过函数参数返回多个值)时,仅在逐次转文中使用; 2。避免出现绩效增长,因为现代PHP已经优化了价值传递; 3。要谨慎对待副作用,循环中的持续参考和意外的修改; 4。更喜欢为清洁,更安全和更可测试的代码返回新值; 5。储备参考的罕见情况,其中分析显示出受益的好处或在外部代码需要时,将其视为锋利的工具 - 在必要时可以使用,但如果过度使用,则可以使用危险。

理解php \ ty-Reference:绩效和陷阱

正确使用时,PHP的通过参考功能可以是一个强大的工具,但通常会被误解和误用,导致对性能的错误或错误的假设令人困惑。让我们分解如何在PHP中逐个引用,当它有所帮助以及它可以适得其反的地方。

了解PHP的通过参考:表现和陷阱

什么是通过参考的?

在PHP中,变量通常按值传递。这意味着,当您将变量传递给函数时,将制作其值的副本。功能内部的任何更改都不会影响原始变量。

另一方面,通过引用允许函数直接修改原始变量。您可以通过在函数参数定义中使用&符号来指示这一点:

了解PHP的通过参考:表现和陷阱
功能增量(&$ value){
    $ value;
}

$数字= 5;
增量($编号);
echo $ number; //输出:6

在这里, $number是通过引用传递的,因此该函数将直接修改。

性能:有帮助吗?

一个常见的误解是,通过参考传递大数组或对象可以通过避免记忆复制来显着提高性能。但这在现代PHP中大大已经过时。

了解PHP的通过参考:表现和陷阱

由于PHP 5(尤其是PHP 7),PHP使用折线对象手柄

  • 阵列和字符串:PHP在通过值通过时实际上不会复制大变量,除非它们进行了修改。多亏了复制在写作语义上,数据才能共享,直到出现写入为止。
  • 对象:从PHP 5开始,默认情况下通过引用传递对象(更准确地说,是通过对象句柄)传递,因此使用& On On On On On On On On On On On On On On Inspare是不必要的,并且不会提高性能。

因此,在大多数情况下:

  • 通过引用传递大数组不会使您的代码更快
  • 在实践中,绩效增益可以忽略不计或不存在。
  • 发动机已经有效地优化了价值传递。

只有在极少数情况下(例如,反复修改多个功能内部的大数组)可能会提供很小的优势,但是可读性和可维护性应首先出现。

常见的陷阱和陷阱

尽管参考可能很有用,但它们引入了复杂性和微妙的错误。

1。意外副作用

由于参考允许函数更改原始变量,因此它可以使代码更难理解:

功能过程(&$ items){
    排序($项目);
}

$ list = [3,1,2];
流程($ list);
// $ list现在已经分类了 - 也许您没想到!

除非您检查功能定义,否则这种副作用并不明显。它打破了函数不会改变输入的期望。

2。参考持续存在

最臭名昭著的陷阱之一涉及到foreach和参考:

 $ array = [1,2,3];
foreach($ array as&$ value){
    $ value *= 2;
}
// $ value仍然引用最后一个元素!

foreach($ array as $ value){
    //这将覆盖最后一个元素!
}
print_r($ array); //最后一个元素可能会意外地更改

始终在循环之后删除参考:

 unset($ value);

3。返回参考(高级使用)

您可以返回参考文献,但这很少见:

函数&getstaticValue(){
    静态$ value = 0;
    返回$ value;
}

$ ref =&getStaticValue();
$ ref = 42;
echo getstaticValue(); //输出:42

这对于实现某些模式(例如Singleton属性访问)可能很有用,但是很容易创建紧密耦合,难以测试的代码。

您什么时候应该逐行使用?

仅在以下方式时使用通过以下方式进行通过。

  • 需要从函数返回多个值
    功能交换(&$ a,&$ b){
        $ temp = $ a;
        $ a = $ b;
        $ b = $ temp;
    }
  • 您正在使用需要它的外部API或框架
  • 您正在实施关键绩效代码和分析表现出真正的好处(罕见)。

否则,优先返回值:

功能processData($ data){
    //修改并返回新值
    返回array_map('trim',$ data);
}

这更清洁,更安全,更易于测试。

底线

PHP中的通过引用不是性能快捷方式。发动机已经有效地处理大型数据。滥用参考会导致难以调试的副作用,错误和代码。

只有在明确意图时才使用它:修改原始变量是明确的目标。在大多数情况下,拥抱不变性并返回新值。

基本上,像对待&锋利的工具一样 - 在右手中使用,过度使用时危险。

以上是了解PHP的通过参考:表现和陷阱的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

热门话题

PHP教程
1596
276
解决PHP中递归功能的复杂问题 解决PHP中递归功能的复杂问题 Aug 02, 2025 pm 02:05 PM

递归函数是解决PHP中复杂问题的有效方法,特别适用于处理具有自相似结构的嵌套数据、数学计算和文件系统遍历。1.对于嵌套数组或菜单结构,递归能自动适应任意深度,通过基例(空子项)终止并逐层展开;2.计算阶乘和斐波那契数列时,递归直观实现数学定义,但朴素斐波那契存在性能问题,可通过记忆化优化;3.遍历目录时,递归可深入任意层级子目录,相比迭代更简洁,但需注意栈溢出风险;4.使用递归必须确保基例可达,避免无限调用,且在深度较大时应考虑使用迭代或显式栈替代以提升性能和稳定性。因此,当问题包含“更小的自身

了解PHP的通过参考:表现和陷阱 了解PHP的通过参考:表现和陷阱 Aug 03, 2025 pm 03:10 PM

Pass-by-referenceinPHPdoesnotimproveperformancewithlargearraysorobjectsduetocopy-on-writeandobjecthandles,soitshouldnotbeusedforthatpurpose;1.Usepass-by-referenceonlywhenyouneedtomodifytheoriginalvariable,suchasswappingvaluesorreturningmultiplevalues

回调的演变:php 8.1中的头等舱可呼叫语法 回调的演变:php 8.1中的头等舱可呼叫语法 Aug 03, 2025 am 10:00 AM

php8.1didnotintroducefirst classCallablesyntax; thisFeatureIscomingInphp8.4.4.1.priortophp8.4,callbackssusedstrings,阵列,orclos URES,WERERERROR-PRONEANDLACKEDIDEDIDESUPPORT.2.PHP8.1IMPREVEDTHEECOSYSTEMSTEMSTEMSTEMSTEMSTEMWITHENUMS,纤维和Bettertypingbutdidnotnotchangecalla

模拟PHP中模拟功能过载的技术 模拟PHP中模拟功能过载的技术 Aug 03, 2025 pm 01:12 PM

PHP不支持像Java或C 那样的函数重载,但可通过多种技术模拟;1.使用默认参数和可选参数,通过为参数设置默认值实现不同调用方式;2.使用变长参数列表(如...操作符),根据参数数量执行不同逻辑;3.在函数内部进行类型检查,根据参数类型改变行为;4.利用PHP8 的命名参数,通过显式命名跳过可选参数并提高可读性;5.基于参数模式分发,通过判断参数数量和类型路由到不同处理函数,适用于复杂场景;这些方法各有权衡,应根据实际需求选择以保证代码清晰和可维护。

带有PHP发电机和'收益”关键字的记忆效率迭代 带有PHP发电机和'收益”关键字的记忆效率迭代 Aug 03, 2025 am 01:38 AM

使用PHP生成器和yield关键字可以有效处理大数据集,避免内存溢出;1.生成器通过逐个yield值实现惰性求值,每次只保留一个值在内存中;2.适用于逐行读取大文件等场景,如用fgets结合yield逐行处理日志或CSV文件;3.支持键值对输出,可显式指定键名;4.具有内存占用低、代码简洁、与foreach无缝集成等优点;5.但存在无法倒带、不支持随机访问、不可重用等限制,需重新创建才能再次迭代;因此在需要遍历大量数据时应优先考虑使用生成器。

拥抱功能编程:PHP中的高阶功能 拥抱功能编程:PHP中的高阶功能 Aug 03, 2025 am 02:12 AM

高级functionsInphpareFunctionsThatAcceptotherfunctionsAsArgumentsReTurnTherThemasSresults,EnablingFunctionalProgrammingmingtechniqunes.2.phpsupportspasspasspasspasspasspassingfunctionsasargumentsAsargumentsCallbacks,AsdymentyByBycustMustionsLakeMfunctionsLikeLikeFilterRakeFilterArrarayAndBuiltBuiltBuiltBuiltBuilt-Infun-infun

用`__invoke`魔法方法在PHP中创建可呼叫的对象 用`__invoke`魔法方法在PHP中创建可呼叫的对象 Aug 06, 2025 am 09:29 AM

The__invokemagicmethodinPHPallowsanobjecttobecalledasafunction,enablingittoactlikeacallable.2.Itisdefinedwithinaclassandautomaticallytriggeredwhentheobjectisinvokedwithparenthesesandarguments.3.Commonusecasesincludestatefulcallables,strategypatterns,

掌握PHP封闭和词汇范围的'使用”关键字 掌握PHP封闭和词汇范围的'使用”关键字 Aug 01, 2025 am 07:41 AM

phpClosureswitheSeyKeyWordEnableLexicalScopingByCapturingVariables fromTheparentsCope.1.ClosuresAreAreAnMonyMousfunctionsThatCanAccessexCessexcessexCessexternalVariablesviause.2.ByDefault,variablesInusearePassedByvalue; tomodifythemexternally;

See all articles