在 PHP 中,函数参数可以是值类型或引用类型。 值类型的参数传递会创建函数参数的拷贝,而引用类型的参数将使用与函数调用中提供的变量相同的内存地址。 对于对象来说,传递的参数是引用类型,因此函数调用中的对象参数将与原始对象共享内存地址。
考虑以下示例:
```
class Person {
public $name;
public function __construct($name) {
$this->name = $name;
}
public function setName($newName) {
$this->name = $newName;
}
}
function changePersonName($person, $newName) {
$person->setName($newName);
}
$person1 = new Person("John");
$person2 = $person1;
changePersonName($person1, "David");
echo $person1->name; // 输出 David
echo $person2->name; // 输出 David
```
在这个例子中,我们定义了一个名为 Person 的类,它具有一个公共属性 name 和一个名为 setName 的公共方法,该方法将 $name 属性设置为传递的新名称。我们还定义了一个名为 changePersonName 的函数,该函数接受一个人对象和一个新名称,并使用对象的 setName 方法更改对象的属性。
在主代码块中,我们创建了一个 person1 对象,并使用 $person2 变量引用它。 然后我们调用 changePersonName 函数,将 person1 对象和一个新名称传递给它。
由于对象是通过引用传递的,因此 changePersonName 函数将更改 person1 对象的名称,并且由于 $person2 与 person1 共享相同的内存地址,它也将更改 $person2 引用的对象名称。
因此,最终的输出是:
```
David
David
```
如果我们使用值类型参数传递 person 对象,即使更改对象的名称,它也不会影响原始对象。让我们看看这个例子,
```
class Person {
public $name;
public function __construct($name) {
$this->name = $name;
}
public function setName($newName) {
$this->name = $newName;
}
}
function changePersonNameValue($person, $newName) {
$person = new Person($newName);
}
$person1 = new Person("John");
$person2 = $person1;
changePersonNameValue($person1, "David");
echo $person1->name; // 输出 John
echo $person2->name; // 输出 John
```
在这个例子中,我们定义了与第一个例子相同的 Person 类,但使用了一个新的函数 changePersonNameValue,该函数接受一个人对象和一个新名称,但在内部创建了一个新对象并分配给传递的变量。我们再次创建 person1 和 person2 对象,将 person1 分配给 person2 变量,并调用 changePersonNameValue 函数来更改 person1 对象的名称。
由于我们使用了值类型参数传递 person 对象,它不会更改原始对象的名称。 更改只影响函数参数的拷贝。因此,最终的输出是:
```
John
John
```
总结一下,PHP 通过引用传递对象,因此在函数中更改对象的属性将影响原始对象,即使对象通过变量传递。 对于值类型参数,函数会创建参数值的副本,并将其用作函数内部的参数。 因此,更改值类型参数不会影响原始参数的值。 如果你喜欢我们三七知识分享网站的文章, 欢迎您分享或收藏知识分享网站文章 欢迎您到我们的网站逛逛喔!https://www.ynyuzhu.com/
发表评论 取消回复