객체 변수의 값을 변경할 때 PHP는 참조 및 값 할당을 어떻게 처리합니까?

DDD
풀어 주다: 2024-10-22 07:22:30
원래의
355명이 탐색했습니다.

When Changing the Value of Object Variables, How Does PHP Handle Assignment of Reference and Value?

PHP의 할당: 값 또는 참조로 전달

PHP의 객체는 할당 시 기본 데이터 유형과 다르게 처리됩니다. 기본적으로 PHP는 변수를 참조로 할당합니다. 즉, 객체의 변수 값을 변경하면 원래 객체에도 영향을 미칩니다. 이 동작은 특히 객체 배열로 작업할 때 다소 혼란스러울 수 있습니다.

코드 설명

다음 코드 조각을 고려하세요.

<code class="php">class Foo
{
    // ...
}

class Bar
{
    private array $foos;

    // ...

    public function getFoo(int $index): Foo
    {
        return $this->foos[$index];
    }

    public function test(): void
    {
        $testFoo = $this->getFoo(5);
        $testFoo->setValue("My value has now changed");
    }
}

$b = new Bar;
echo $b->getFoo(5)->value;
$b->test();
echo $b->getFoo(5)->value;</code>
로그인 후 복사

값 및 참조로 전달

이제 코드를 분석하고 질문에 대답해 보겠습니다.

Bar::test() 메서드가 실행되고 foo 객체 배열의 foo #5 값은 배열의 실제 foo #5에 영향을 미치나요?

getFoo 메소드가 인덱스 5의 Foo 객체를 반환할 때 다음과 같이 객체의 복사본을 반환합니다. PHP는 기본 데이터 유형에 대해 값으로 변수를 할당하고 기본적으로 참조 데이터 유형에 대해 복사본을 할당하기 때문에 기본값입니다. 따라서 $testFoo 개체에 대한 변경 사항은 배열에 다시 할당될 때까지 배열의 원래 개체에 영향을 주지 않습니다.

참조에 의한 할당

그러나 , 테스트 내부의 코드는 반환된 Foo 객체를 직접 수정합니다. 객체에 할당이 이루어지면 PHP는 참조를 통해 할당합니다. 즉, 할당된 개체에 대한 변경 사항이 원본 개체에 반영됩니다. 결과적으로 $testFoo에서 setValue 메소드가 호출된 후 $foos 배열의 인덱스 5에 있는 원래 Foo 객체가 업데이트됩니다.

데모

코드는 다음 출력을 생성합니다.

Foo #5
My value has now changed
로그인 후 복사

이 출력은 참조에 의한 할당 동작이 배열의 원래 객체에 영향을 미쳤음을 보여줍니다.

할당 동작 변경

참조 대신 값(사본 생성)으로 개체를 할당하려면 아래와 같이 'clone' 키워드를 사용할 수 있습니다.

<code class="php">$testFoo = clone $this->getFoo(5);</code>
로그인 후 복사

위 내용은 객체 변수의 값을 변경할 때 PHP는 참조 및 값 할당을 어떻게 처리합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!