>백엔드 개발 >PHP 문제 >PHP에서 값 전달과 참조 전달의 차이점은 무엇입니까?

PHP에서 값 전달과 참조 전달의 차이점은 무엇입니까?

青灯夜游
青灯夜游원래의
2020-10-30 17:12:224191검색

값 전달은 함수 범위 내에서 변수 값을 새 값으로 복사하는 것이며, 변수 값을 변경해도 함수 외부의 변수 값에는 영향을 미치지 않습니다. 참조로 전달하면 함수 범위 내에서 변수의 참조가 복사됩니다. 참조로 전달하면 메모리 주소가 전달되기 때문에 값에 대한 모든 변경 사항도 함수 외부에 반영됩니다.

PHP에서 값 전달과 참조 전달의 차이점은 무엇입니까?

권장: "PHP 비디오 튜토리얼"

php 값 전송: 함수 범위 내에서 변수 값을 변경해도 함수 외부의 변수 값에는 영향을 미치지 않습니다.

PHP 참조: 함수 범위 내에서 값에 대한 모든 변경 사항은 함수 외부에도 반영됩니다. 메모리 주소가 참조로 전달되기 때문입니다.

값 전달, 참조 전달, 주소 전달의 차이점:

1. 값 전달은 실제 매개변수의 값을 행 매개변수에 할당하는 것입니다.

그러면 행 매개변수를 수정해도 영향을 받지 않습니다. 실제 매개변수의 값

2. 주소 전달

은 값을 전달하는 특별한 방법이지만 일반적인 int

가 아닌 주소를 전달합니다. 그런 다음 주소를 전달한 후 실제 매개변수와 행 매개변수가 다음을 가리킵니다. 동일한 객체

3. 참조 전달

매개변수는 실제로 주소 형식으로 전달됩니다

전달 후 라인 매개변수와 실제 매개변수는 동일한 객체이며 이름만 다릅니다

라인 매개변수를 수정하면 영향을 받습니다. 실제 매개변수의 값

Daniu의 설명:

Value-passing: 복사와 동일합니다. [예를 들어, 나는 당신에게 건축 자재를 제공합니다. 당신이 당신의 집에서 하는 일은 나에게 영향을 미치지 않습니다. 서로 독립적으로 당신에게 영향을 미칠 것입니다. 】

<?php 
$testa=1; //定义变量a 
$testb=2; //定义变量b 
$testb = $testa; //变量a赋值给变量b 
echo $testb; //显示为1 
?>

Pass-by-reference: C 언어의 포인터와 비슷하며 거의 같은 느낌입니다. 예를 들어, 나에게 집이 있는데, 내가 당신에게 열쇠를 주면 우리 둘 다 집에 들어갈 수 있습니다.

[장점 및 단점:] 값을 전달하는 데는 시간이 많이 걸립니다. 특히 큰 문자열과 객체의 경우 이는 매우 비용이 많이 드는 작업입니다. 함수 내의 모든 작업은 변수를 전송하는 것과 같습니다. 큰 변수를 전송할 때 효율적입니다!

1. 먼저 명사에 대해 설명하겠습니다.

값별 전달 프로세스 중에 호출된 함수의 형식 매개변수는 호출된 함수의 지역 변수로 처리됩니다. 즉, 실제 매개변수에 넣은 값을 저장하기 위해 스택에 메모리 공간이 열립니다. 호출 함수에 의해 호출되므로 실제 매개변수의 복사본이 됩니다. 값 전송의 특징은 형식 매개변수에 대한 호출된 함수의 모든 작업이 지역 변수로 수행되고 호출 함수의 실제 매개변수 변수 값에 영향을 미치지 않는다는 것입니다.

참조별 전달 과정에서는 호출된 함수의 형식 매개변수도 로컬 변수로 사용되어 스택의 메모리 공간을 확보하지만 이때 호출 함수에서 넣은 실제 매개변수 변수가 저장됩니다. 주소. 형식 매개변수에 대한 호출된 함수의 모든 작업은 간접 주소 지정으로 처리됩니다. 즉, 호출 함수의 실제 매개변수 변수는 스택에 저장된 주소를 통해 액세스됩니다. 이 때문에 호출된 함수가 형식 매개변수에 대해 수행하는 모든 작업은 호출하는 함수에 영향을 미칩니다.

참고: 위의 빨간색 텍스트는 애플리케이션 전송이 공간을 여는 것이 아니라 공간을 열지만 열린 공간이 실제 매개변수 변수 주소를 저장하는 데 사용된다는 것을 설명합니다.

2.php에는 다음 세 가지 용도가 있습니다.

①. 변수의 참조 할당: $a = &$b

②. 함수 호출 시 참조 매개변수 전달

1) 초기 PHP에서는 호출 시 참조 유형 변수가 다음과 같이 & 기호를 통해 전달되었습니다. & $arg);

2) 나중에 함수 선언 시 함수의 참조 유형 매개변수를 정의해야 한다고 규정했습니다. 예: function func(&$arg);

참고:정의한 후. 참조 선언 중에 참조 유형 매개변수를 사용하면 런타임 참조 매개변수 전달이 중단되며 php.ini에allow_call_time_pass_reference를 추가하여 활성화해야 합니다.

3. 이 함수는 참조 유형을 함수 앞에 추가해야 합니다. 함수 선언 시 이름 지정, 호출 시 참조 할당 방식을 사용하기 위한 예시 코드는 다음과 같습니다.

function &func() {
    return $a;
}
$a = func();  //这种调用方式得到的不是引用传值
$a =& func(); //这样调用才是引用传值
$a = 1;
function &func(&$a) {
  return $a;
}
$b = func($a);
$c =& func($a);
$b = 2;
echo "a: $a, b: $b, c: $c. <br />/n";
//输出a: 1, b: 2, c: 1.
//可见对$b的修改不会影响$a
$c = 3;
echo "a: $a, b: $b, c: $c. <br />/n";
//输出a: 3, b: 2, c: 3.
//可见对$c的修改会影响$a

아래 자세한 예시를 참고하세요.

3.php 다양한 데이터 유형이 값/포인터를 전달합니다.

1 . 기본 데이터 유형의 값 전달

/* **************************************************** */ 
function testvar($k){
 $k = 40;
}
$c = 30;
//给一个函数参数传一个基本数据类型(整型,布尔,字符 ...), 实际上传的就是值 ;
testvar($c);
echo $c;//结果是:30
function testvar2(&$k){
 $k = 40;
}
$e = 30;
//给一个函数参数传一个基本数据类型(整型,布尔,字符 ...), 实际上传的y就是地址 ;
testvar2($e);
echo $e;//结果是:40
  
/* **************************************************** */

2 , 배열(기본적으로 데이터 복사본이 복사됨), 주소를 전달하려면 &$arr

 1 $arr1 = array(-1,5,0); 
 2 function testArr($arr){ 
 3  for($i=0;$i<count ($arr);$i++){ 
 4   for($j=$i+1;$j<count($arr);$j++){ 
 5    if($arr[$i]>$arr[$j]){ 
 6     $temp = $arr[$i]; 
 7     $arr[$i] = $arr[$j]; 
 8     $arr[$j] = $temp; 
 9    } 
10   } 
11  
12  } 
13  print_r($arr);  //结果:Array ( [0] => -1 [1] => 0 [2] => 5 )  
14 } 
15 testArr($arr1); 
16 print_r($arr1);  //结果:Array ( [0] => -1 [1] => 5 [2] => 0 )  
17  
18 function testArr2(&$arr){ 
19  for($i=0;$i</count><count ($arr);$i++){ 
20   for($j=$i+1;$j<count($arr);$j++){ 
21    if($arr[$i]>$arr[$j]){ 
22     $temp = $arr[$i]; 
23     $arr[$i] = $arr[$j]; 
24     $arr[$j] = $temp; 
25    } 
26   } 
27  
28  } 
29 } 
30 testArr($arr1); 
31 print_r($arr1);  //结果:Array ( [0] => -1 [1] => 0 [2] => 5 )

3. 값 전달 객체 데이터 유형

class person{
 public $name;
 public  $age;
}
  
$a = new person();
$a->name = &#39;小明&#39;;
$a->age = &#39;20&#39;;
//变量a在存的是对象的地址,把a赋给b这个变量,实际上就是赋了一个地址。
$b = $a;
$b->age = 30;
//echo $a->age.$b->age;//结果是:30 30
//给一个函数参数传一个对象, 实际上传的是这个对象的地址;
function test($k){
 $k->age =40;
}
//调用
test($b);
//echo $a->age.$b->age;//结果是:40 40

PHP5에서는 객체 복사가 참조에 의해 이루어집니다. 위 열에서 $a=new person; $b=$a; 는 실제로 $a=new person; $b=&$a;
PHP5의 기본값은 참조로 객체를 호출하는 것입니다. 객체의 A 복사본을 만들고 원본 객체의 변경 사항이 복사본에 영향을 미치지 않기를 바랍니다. 이를 위해 PHP는 __clone이라는 특수 메서드를 정의합니다.

4.php copy-on-write

php中对于地址的指向(类似指针)功能不是由用户自己来实现的,是由Zend核心实现的,php中引用采用的是“写时拷贝”的原理,就是除非发生写操作,指向同一个地址的变量或者对象是不会被拷贝的。

通俗的讲

1:如果有下面的代码

$a="ABC";
 $b=$a;

其实此时$a与$b都是指向同一内存地址而并不是$a与$b占用不同的内存

2:如果在上面的代码基础上再加上如下代码

$a="EFG";

由于$a与$b所指向的内存的数据要重新写一次了,此时Zend核心会自动判断自动为$b生产一个$a的数据拷贝,重新申请一块内存进行存储。

5.php引用于C指针的区别

在PHP 中引用的意思是:不同的名字访问同一个变量内容.
与C语言中的指针是有差别的.C语言中的指针里面存储的是变量的内容在内存中存放的地址。

PHP 的引用允许你用两个变量来指向同一个内容

$a="ABC";
$b =&$a;
echo $a;//这里输出:ABC
echo $b;//这里输出:ABC
$b="EFG";
echo $a;//这里$a的值变为EFG 所以输出EFG
echo $b;//这里输出EFG

当你 unset 一个引用,只是断开了变量名和变量内容之间的绑定。这并不意味着变量内容被销毁了。例如:

unset($a);
echo $b;//这里输出EFG

相关推荐:php培训

위 내용은 PHP에서 값 전달과 참조 전달의 차이점은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.