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 중국어 웹사이트의 기타 관련 기사를 참조하세요!