>  기사  >  백엔드 개발  >  PHP의 변수 할당을 정말로 이해하고 있나요?

PHP의 변수 할당을 정말로 이해하고 있나요?

藏色散人
藏色散人앞으로
2021-09-19 16:42:203747검색

많은 분들이 이 제목, 변수 할당을 무시하실 것 같은데요? 실례합니다? 개발의 첫 번째 교훈을 배워볼까요? 하지만 이러한 기본적인 것들은 가치관과 참고문헌의 관계 등 많은 사람들을 혼란스럽게 할 수 있습니다. 오늘은 이에 대해 자세히 알아보겠습니다.

우선 변수를 정의하고 값을 할당하는 것은 당연합니다. ​

$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 비디오 튜토리얼"

위 내용은 PHP의 변수 할당을 정말로 이해하고 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 segmentfault.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제