【问题标题】:Returning references with or without a function返回有或没有函数的引用
【发布时间】:2016-08-30 10:49:23
【问题描述】:

这两种通过引用获取值的方式有什么实际区别吗?

方式 1

<?php
class foo {
    public $value = 42;

    public function &getValue() {
        return $this->value;
    }
}

$obj = new foo;
$myValue = &$obj->getValue();
// $myValue is a reference to $obj->value, which is 42.
$obj->value = 2;
echo $myValue;
// prints the new value of $obj->value, i.e. 2.
?>

方式 2

<?php
class foo {
    public $value = 42;
    public function getValue() {
        return $this->value;
    }
}

$obj = new foo;
$myValue = &$obj->value;
$obj->value = 2;
echo $myValue; 
?>

在这两种情况下都会打印 2。那么为什么需要 getValue() 函数呢?第一个例子取自PHP Manual

【问题讨论】:

  • PHP 中的 3 条引用规则是: 规则 #1) 不要使用引用。规则#2) 不要使用引用。规则 #3) 不要使用引用。
  • @Sherif 最好不要使用对象 ;-)
  • @jeroen 不知道你为什么会这么说。对象不是引用。
  • 使您的 $value 财产受到保护而不是公开。目前,您始终可以直接设置它。即这个例子没有展示任何有用的东西?

标签: php syntax return-by-reference


【解决方案1】:

如果类字段没有修饰符“public”,则需要第一种方法。在这种情况下,您无法获得对类外字段的引用。见例子:

<?php

class foo
{
    protected $value = 1;

    public function setValue($value)
    {
        $this->value = $value;
    }

    public function &getValue()
    {
        return $this->value;
    }
}

$obj = new foo;
$myValue = &$obj->getValue();
$obj->setValue(2);
echo $myValue;
?> 

【讨论】:

  • 即使属性可见性不公开,您也绝对需要参考根本。它可以与公共 setter/getter 方法一起正常工作。在那里使用引用只会破坏您的代码并导致奇怪的尴尬难以调试的错误,没有任何优势。
  • @Sherif 这不是必要的问题。说明何时可以使用第一种方法。使用与否取决于开发人员。
  • 解释错了,很遗憾。如果您希望开发人员对使用什么做出明智的选择,您需要实际解释它的优点。这说明不了什么。它只是描绘了选项1应该使用的,这只是纯粹的倡导,而不是解释。
  • 我的意思不是说磨人。所以我很抱歉,如果我有,但我所说的不是固执己见或主观的。它基于关于引用在 PHP 中如何工作的具体事实知识,以及在 PHP 中处理非常难以调试的代码的第一手经验,这是在不必要甚至没有帮助的地方使用不当引用的直接结果。在使用 PHP 时,我非常热衷于引导人们朝着正确的方向前进,我认为 OP 的问题是一个完美的例子,如果他们没有完全了解原因,他们可能会误入歧途这是一个糟糕的选择
  • 谢谢你,@andrej-ludinovskov!我想你解释了被问到的问题,这就是人们可以使用这些功能的目的。
猜你喜欢
  • 2019-02-16
  • 2020-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-25
  • 2022-08-18
  • 1970-01-01
  • 2011-06-06
相关资源
最近更新 更多