在PHP中是通过引用传递还是返回数组更好?

9

我所有需要返回多个值的带有多个参数的函数都会像这样返回一个数组...

function eg($a, $b) {
    $a += 5;
    $b += 10;
    return array('a' => $a, 'b' => $b);
}
$no = eg(0, 5);
echo $no['a']; // 5
echo $no['b']; // 10

相较于通过引用传递,这是否被认为是不好的做法?

function eg(&$a, &$b) {
    $a += 5;
    $b += 10;
}  
eg(0, 5);
echo $a; // 5
echo $b; // 10

这真的有关系吗?在使用上述示例时,什么情况下我想使用其中之一?性能上有任何区别吗?

谢谢


由于这是个人观点,所以这个问题可能不完全适合在这个论坛里讨论,但就我个人而言,我认为你上面的例子可能比通过引用传递更干净和更好,通过引用传递实际上有些懒惰,如果你的代码被封装得很好,当读取它时,很难看出为什么你的$a和$b值会突然变化。在我看来,我认为你的第一个例子是正确的做法。 - DaOgre
抱歉关于这个问题,是另一个成员从另一个问题告诉我要问的。感谢您的评论。我只是想知道是否根据最佳实践来更改代码,但我明白第一个示例更容易理解。 - cgwebprojects
没有肯定或否定的答案,我同意第一个例子更清晰,你的同事会因为这种清晰度而感谢你。 - Wrikken
谢谢@Wrikken。我知道这个问题很模糊,但我不知道在哪里问它! - cgwebprojects
根据您的实际代码需要,接受参数并返回对象也是有意义的。或者,更好的方法是将eg()实现为类方法。在给定的示例中,这样做可能过于复杂了...但在实际应用中,这种方法可以更加简洁。 - Justin ᚅᚔᚈᚄᚒᚔ
我想回答这个问题,但它已经关闭了。传递数组引用更快,因为它避免了复制数组的过程。然而,这通常是一种不必要的优化,所以最好选择更清晰的方法,除非数组很大或函数在循环中被多次调用。忘记变量是按引用传递的很容易成为错误的源头。您可以通过选择良好的命名约定并保持一致来最小化风险。例如 set vs get setDimensions(&$dimensions)getDimensions($dimensions) - Dan Bray
1个回答

8

正如大多数评论所指出的,第一种方法(返回一个数组)更加简洁易懂,因此从这个标准来看,它是“更好的”。

然而,根据您的使用情况,甚至可能最好不要尝试返回多个值。考虑以下内容:

public function getDimensions() {
    return array(
        'width' => $this->_width,
        'height' => $this->_height
    );
}

$dim = $canvas->getDimensions();
echo $dim['width'], ' x ', $dim['height'];

与之相比:

public function getWidth() {
    return $this->_width;
}

public function getHeight() {
    return $this->_height;
}

echo $canvas->getWidth(), ' x ', $canvas->getHeight();

这只是一个人为的例子,但请想象一下你的方法执行某些昂贵的操作而不是琐碎的事情。现在假设您只需要一组值中的第一个值,但由于您的方法计算所有值,因此每次调用都要浪费地计算所有内容并丢弃不需要的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接