类实例(对象)入参是传址还是传值?

<?php
declare(strict_types=1);
ini_set('display_errors', 'On');
error_reporting(-1);

function foo(Human $human, string $name): void
{
    $human->setName($name);
}

/**
 * Human类
 */
class Human
{
    private string $name;

    public function __construct(string $name)
    {
        $this->name = $name;
    }

    public function setName(string $name): void
    {
        $this->name = $name;
    }

    public function getName(): string
    {
        return $this->name;
    }
}

$human = new Human('张三');
echo '(1) name is ' . $human->getName() . PHP_EOL; // (1) name is 张三

foo($human, '李四');
echo '(2) name is ' . $human->getName() . PHP_EOL; // (2) name is 李四

$tmp = $human;
$tmp->setName('王五');
echo '(3) name is ' . $human->getName() . PHP_EOL; // (3) name is 王五


//========== 总结 ==========//
// 1、类实例(对象)入参是传地址,所以在函数内部对实例进行修改会影响函数外部的原始实例。
// 2、由于类实例(对象)入参是传地址,所以形参名前面加“&”符号是多余的。
// 3、把类实例(对象)赋值给一个临时变量也是传地址,修改临时变量就是修改原始实例。

Copyright © 2024 码农人生. All Rights Reserved