我对通过引用传递在 PHP 中的工作方式有一点普遍的不满,我自己来自 Java 背景。这可能已经在 SO 上讨论过,所以如果这看起来多余,我很抱歉。
我将给出一个代码示例以使事情清楚。假设我们有一个 Person 类:
<?php
class Person
{
private $name;
public function __construct($name)
{
$this->name = $name;
}
public function setName($name)
{
$this->name = $name;
}
public function getName()
{
return $this->name;
}
}
?>
以及以下用法:
<?php
require_once __DIR__ . '/Person.php';
function changeName(Person $person)
{
$person->setName("Michael");
}
function changePerson(Person $person)
{
$person = new Person("Jerry");
}
$person = new Person("John");
changeName($person);
echo $person->getName() . PHP_EOL;
changePerson($person);
echo $person->getName() . PHP_EOL;
?>
现在,我和其他许多从 Java 或 C# 编程到 PHP 的人都希望上面的代码能够输出:
Michael
Jerry
但是,它没有,它输出:
Michael
Michael
我知道它可以通过使用 & 来修复。通过调查,我了解到这是因为引用是按值(引用的副本)传递给函数的。但这对我来说构成了一种意外/不一致的行为,所以问题是:他们选择这样做有什么特别的原因或好处吗?