많은 분들이 이 제목, 변수 할당을 무시하실 것 같은데요? 실례합니다? 개발의 첫 번째 교훈을 배워볼까요? 하지만 이러한 기본적인 것들은 가치관과 참고문헌의 관계 등 많은 사람들을 혼란스럽게 할 수 있습니다. 오늘은 이에 대해 자세히 알아보겠습니다.
우선 변수를 정의하고 값을 할당하는 것은 당연합니다.
$a = 1; $b = '2'; $c = [4, 5, 6]; $d = new stdClass();
4개의 변수는 각각 정수, 문자열, 배열의 객체를 정의합니다. 이것들은 우리가 매일 다루는 네 가지 유형이기도 합니다.
그런 다음 변수는 변수에 값을 할당합니다.
$a1 = $a; $b1 = $b; $c1 = $c; $d1 = $d;
처음 3개의 과제는 일반 과제, 즉 특정 콘텐츠의 복사본이라는 점을 참고해주세요. $a1을 수정해도 $a는 변경되지 않습니다. $a1은 우리의 가치를 담고 있는 새로 열린 메모리 공간입니다. 즉, 값은 동일하지만 메모리 주소가 다릅니다. 그들은 서로 비슷하고 아무 관련도 없는 두 사람일 뿐입니다.
하지만 $d1과 $d는 값이 동일할 뿐만 아니라 메모리 주소도 동일합니다. 이러한 상황을 우리는 참조 할당이라고 부릅니다. $d1이 변경되면 $d2도 변경됩니다.
다음과 같이 말할 수 있습니다. 참조 할당은 원래 변수에 대해 Windows에서 바로 가기를 만들거나 Linux에서 소프트 링크를 만드는 것입니다.
특정 예를 사용하여 먼저 일반적인 값의 할당을 설명합니다.
// 普通赋值 $v = '1'; $c = $v; $c = '2'; echo $v, PHP_EOL; // '1' // 数组也是普通赋值 $arr1 = [1,2,3]; $arr2 = $arr1; $arr2[1] = 5; print_r($arr1); // [1, 2, 3]
$c는 $v의 값에 영향을 주지 않습니다. $arr2는 아래 첨자 1을 수정합니다. 즉, 두 번째 숫자는 5입니다. 물론 $arr1에는 영향을 미치지 않습니다.
그렇다면 객체 형태의 참조 할당은 어떨까요?
// 对象都是引用赋值 class A { public $name = '我是A'; } $a = new A(); $b = $a; echo $a->name, PHP_EOL; // '我是A' echo $b->name, PHP_EOL; // '我是A' $b->name = '我是B'; echo $a->name, PHP_EOL; // '我是B'
예상대로 $b가 name 속성의 내용을 수정한 후 $a의 이름도 $b가 수정한 내용으로 변경되었습니다.
이 경우 객체가 참조로 전달되는 것을 원하지 않으면 자체 복사본을 만드는 프로토타입 모드인 __clone()을 사용하는 것입니다. 두 번째는 외부에서 새로운 것을 만드는 것입니다.
// 使用克隆解决引用传递问题 class Child{ public $name = '我是A1的下级'; } class A1 { public $name = '我是A'; public $child; function __construct(){ $this->child = new Child(); } function __clone(){ $this->name = $this->name; // new 或者用Child的克隆都可以 // $this->child = new Child(); $this->child = clone $this->child; } } $a1 = new A1(); echo $a1->name, PHP_EOL; // 输出a1原始的内容 echo $a1->child->name, PHP_EOL; $b1 = $a1; echo $b1->name, PHP_EOL; // b1现在也是a1的内容 echo $b1->child->name, PHP_EOL; $b1->name = '我是B1'; // b1修改内容 $b1->child->name = '我是B1的下级'; echo $a1->name, PHP_EOL; // a1变成b1的内容了 echo $a1->child->name, PHP_EOL; // 使用__clone $b2 = clone $b1; // b2克隆b1 $b2->name = '我是B2'; // b2修改内容 $b2->child->name = '我是B2的下级'; echo $b1->name, PHP_EOL; // b1不会变成b2修改的内容 echo $b1->child->name, PHP_EOL; echo $b2->name, PHP_EOL; // b2修改的内容没问题,b1、b2不是一个货了 echo $b2->child->name, PHP_EOL;
물체에 대한 언급은 사람들을 정말 혼란스럽게 할 수 있습니다. 특히 더 복잡한 개체의 경우 내부 속성에는 다른 개체에 대한 다양한 참조가 있습니다. 이 경우 참조 할당으로 인해 문제가 발생하는지 주의 깊게 확인해야 합니다. 문제가 있으면 새로운 개체나 복제 기술을 사용하여 참조 문제를 해결해야 합니다.
마지막으로, 참조 변수 할당은 참조 매개변수를 메서드에 전달할 때와 동일합니다. & 기호를 사용하면 됩니다!
// 引用赋值 $b = &$v; $b = '3'; echo $v, PHP_EOL;
오늘 우리는 PHP의 할당 문제, 특히 일반적인 할당 및 참조 할당 문제에 대해 더 심층적으로 연구하고 이해했습니다. 다음번에 코드와 프레임워크를 살펴보면 다른 사람들이 이 두 가지 할당을 어떻게 유연하게 사용하는지 주목해볼 수 있습니다. 또한 이 두 가지 방법을 사용하여 자신이 작성한 버그를 수정할 수 있는지 확인해 볼 수도 있습니다.
测试代码: https://github.com/zhangyue0503/dev-blog/blob/master/php/201910/source/PHP%E7%9A%84%E5%8F%98%E9%87%8F%E8%B5%8B%E5%80%BC.php 参考文档: https://www.php.net/manual/zh/language.variables.basics.php
추천 학습: "PHP 비디오 튜토리얼"