【问题标题】:Functions by reference or by variable, which to use when?引用函数还是变量函数,什么时候使用?
【发布时间】:2011-06-17 15:16:41
【问题描述】:

嗯,我在方便的 PHP 书籍中读到,能够区分引用参数和可变参数非常重要。书中说参数化变量的原始值在变量改变时被保留,而参数化引用的原始值在引用改变时改变。如果我没看错的话,它说这是关键的区别。

嗯,我想知道什么时候每个都比另一个更有用。创建自己的函数时,如何知道何时使用变量以及何时使用引用?

【问题讨论】:

  • 实际上从 5.3 开始,对象是通过引用传递的(尽管这不会影响原语)。
  • @Tomalak:更具体地说,对象通过对象标识符传递(和分配),对象标识符的行为与引用略有不同。例如,如果通过为传递的对象分配字符串值“abc”来覆盖传递的对象,您会看到原始对象保持不变。
  • @webbiedave:当然可以。
  • 我想我得看看代码或输出什么的。我不确定我是否理解,真的。

标签: php variables reference scope


【解决方案1】:

这很简单。当您需要修改传入函数的变量的值时,请使用引用。当您不需要或不想修改值时使用变量。

因此,例如,如果您正在编写一个函数,该函数接受一个数组并更改该数组,那么您最好使用该数组的引用,而不是从该函数返回一个新数组。

【讨论】:

  • 在处理对象时不要[明确]使用引用。当您想将收到的对象复制到函数中时,不要什么都不做。
  • 对不起,这超出了我的想象。我只是阅读了有关引用和变量的内容,并没有看到它们与对象的关系。也许我必须稍后再回来才能理解。不过,这是我的想法,如果它可以帮助您解释:对象似乎没有返回值。那么,它们是如何复制到函数中的呢?
  • @Fohsap 他们是通过引用传递的。
【解决方案2】:

“引用”(变量别名)使您的代码更难理解,并可能导致难以理解的错误。没有正当理由在 php 中使用引用,为了更安全,请尽量避免使用它们。

不,php5 中的对象与“引用”无关。

在 php 中实现的“引用”是一个奇怪的概念。通常,在编程语言中,变量是相互独立的,因此更改一个变量不会影响其他变量。 Php“引用”允许多个变量共享相同的值并相互依赖。基本上,你改变了一个变量,突然另一个你认为完全不相关的变量也发生了变化。这不是一件好事,而且经常会导致很多混乱。

php 中的对象(我需要添加“五个”吗?)在上述意义上与“引用”无关。它们的行为很像 C 指针(实际上,这就是它们的底层)——当你将一个对象传递给一个函数时,你实际上传递了一个指针,而函数可以使用这个指针来操作对象的内容,但是没有函数改变传递变量本身的方式,例如,使其指向另一个对象。

这种“对象是引用”的误解可能是因为人们将 php “引用”(与符语法)与 generic CS term 混淆了,这也适用于指针、句柄等。

【讨论】:

  • 我认为您应该扩展您的陈述,即“没有正当理由在 php 中使用引用。”
  • 我同意.... 同时,我并没有真正理解对象和引用是如何关联的。我认为引用分配给函数,而不是对象......我真的很想听到更多,但我想很难通过空白来解释......如果你能扩展你的答案,我会非常感激.
  • 谢谢。由于 C 级解释,它更有意义。这就是它在我的书中拟定的方式——对象是指针。我仍然不完全理解,但我非常有信心在这一点上它在我的头上。不过,在我看来,使用引用的场合是变量更改应该影响多个函数的返回值,相同的引用应该用作每个函数的参数....跨度>
  • 我的理解是,在读了一点 C 之后,当一个变量被它的名字引用时,就会产生一个副本。因此,您可以在不更改原始值的情况下更改副本的值。另一方面,当您通过引用引用变量时,仅使用指针。因为没有副本,所以只能更改原始值。如果更改了原始值,则引用的值也会更改,因为它们都返回到原始值。因此,参考 = 一个可能的值;名称 = 可能有多个值。
  • @stereofrog:“函数无法更改传递的变量本身,例如,使其指向另一个对象。”我不确定你的意思。您可以通过引用将对象传递给函数,然后将传递的变量分配给另一个对象。当调用者从那时起操纵变量时,它将“指向”新对象。 codepad.org/8I8hVFoz
猜你喜欢
  • 2022-08-24
  • 2010-11-18
  • 1970-01-01
  • 2019-09-04
  • 2018-11-13
  • 1970-01-01
  • 2010-12-28
  • 1970-01-01
相关资源
最近更新 更多