Heim > Backend-Entwicklung > PHP-Problem > Was sind die Unterschiede zwischen der Wertübergabe und der Referenzübergabe in PHP?

Was sind die Unterschiede zwischen der Wertübergabe und der Referenzübergabe in PHP?

青灯夜游
Freigeben: 2023-03-06 21:24:02
Original
4200 Leute haben es durchsucht

Bei der Wertübergabe wird der Wert der Variablen innerhalb des Funktionsumfangs auf einen neuen Wert kopiert. Eine Änderung des Variablenwerts hat keinen Einfluss auf den Wert der Variablen außerhalb der Funktion. Bei der Referenzübergabe wird die Referenz der Variablen kopiert; innerhalb des Funktionsbereichs werden alle Änderungen am Wert auch außerhalb der Funktion widergespiegelt, da bei der Referenzübergabe die Speicheradresse übergeben wird.

Was sind die Unterschiede zwischen der Wertübergabe und der Referenzübergabe in PHP?

Empfohlen: „PHP-Video-Tutorial

php-Wertübertragung: Innerhalb des Funktionsumfangs hat eine Änderung des Variablenwerts keine Auswirkungen auf den Variablenwert außerhalb der Funktion.

PHP per Referenz: Innerhalb des Funktionsumfangs werden alle Änderungen des Werts auch außerhalb der Funktion reflektiert, da die Speicheradresse per Referenz übergeben wird.

Der Unterschied zwischen der Wertübergabe, der Referenzübergabe und der Adressübergabe:

1 Die Wertübergabe besteht darin, dem Zeilenparameter den Wert des tatsächlichen Parameters zuzuweisen. Dann werden keine Änderungen am Zeilenparameter vorgenommen wirkt sich auf den Wert des tatsächlichen Parameters aus

2. Die Übergabe der Adresse ist eine besondere Art der Wertübergabe, aber es wird eine Adresse übergeben, kein gewöhnlicher int. Nach der Übergabe der Adresse werden dann die tatsächlichen Parameter und Zeilenparameter übergeben Zeigen Sie auf dasselbe Objekt.

3. Übergeben von Referenzen. Parameter werden tatsächlich in Form von Adressen übergeben. Nach der Übergabe sind die Zeilenparameter und tatsächlichen Parameter dasselbe Objekt, nur ihre Namen sind unterschiedlich. Änderung der Zeilenparameter wirkt sich auf den Wert der tatsächlichen Parameter aus

Danius Erklärung:

Wertübergabe

: Es ist dasselbe wie Kopieren. [Ich habe zum Beispiel ein Haus, das genau das gleiche ist wie meines, ich werde es in meinem Haus tun , unabhängig voneinander. 】

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

Referenzübergabe

: Ähnlich wie bei Zeigern in der C-Sprache fühlt es sich fast gleich an. Wenn ich Ihnen zum Beispiel einen Schlüssel gebe, können wir beide das Haus betreten. Was auch immer Sie im Haus tun, wird sich auf mich auswirken.

[Vorteile und Nachteile:] Das Übergeben von Werten ist zeitaufwändig, insbesondere bei großen Zeichenfolgen und Objekten. Das Übertragen von Referenzen ist gleichbedeutend mit dem Übertragen von Variablen effizient bei der Übertragung großer Variablen! 1. Erklären wir zunächst die Substantive.

Während des Passl-by-Value-Prozesses werden die formalen Parameter der aufgerufenen Funktion als lokale Variablen der aufgerufenen Funktion behandelt, d. h. es wird Speicherplatz im Stapel geöffnet, um die Werte der eingegebenen tatsächlichen Parameter zu speichern durch die aufrufende Funktion und wird so zu einer Kopie des tatsächlichen Parameters. Das Merkmal der Wertübertragung besteht darin, dass jede Operation der aufgerufenen Funktion an den formalen Parametern als lokale Variable ausgeführt wird und sich nicht auf den Wert der tatsächlichen Parametervariablen der aufrufenden Funktion auswirkt. Obwohl während des Referenzdurchlaufprozesses die formalen Parameter der aufgerufenen Funktion auch als lokale Variablen verwendet werden, um Speicherplatz auf dem Stapel freizugeben, werden zu diesem Zeitpunkt die von der aufrufenden Funktion eingegebenen tatsächlichen Parametervariablen gespeichert. Adresse. Jede Operation der aufgerufenen Funktion an den formalen Parametern wird als indirekte Adressierung verarbeitet, d. h. der Zugriff auf die tatsächlichen Parametervariablen in der aufrufenden Funktion erfolgt über die im Stapel gespeicherte Adresse. Aus diesem Grund wirkt sich jede Operation, die die aufgerufene Funktion an den formalen Parametern ausführt, auf die aufrufende Funktion aus.

Hinweis: Der rote Text oben erklärt, dass die Anwendungsübertragung keinen Speicherplatz freigibt, aber Platz freigibt, der freigewordene Platz jedoch zum Speichern der tatsächlichen Parametervariablenadresse verwendet wird. In 2.php werden drei Verwendungen aufgeführt.

①. Referenzzuweisung von Variablen: $a = &$b

② Referenzparameterübergabe beim Aufrufen der Funktion

1) In frühen PHP wurden Referenztypvariablen beim Aufruf über das &-Symbol übergeben, wie zum Beispiel: func( & $arg);

2) Später wurde festgelegt, dass die Referenztypparameter der Funktion definiert werden müssen, wenn die Funktion deklariert wurde. Zum Beispiel: function func(&$arg);

Hinweis:

Nach der Definition Die Übergabe der Referenztypparameter während der Referenzdeklaration wird aufgegeben und muss durch Hinzufügen von „allow_call_time_pass_reference“ in php.ini aktiviert werden.

③ Die Funktion gibt einen Referenztyp zurück, der vor der Funktion hinzugefügt werden muss Name beim Deklarieren der Funktion und beim Aufrufen. Um die Referenzzuweisungsmethode zu verwenden, lautet der Beispielcode wie folgt:

function &func() {
    return $a;
}
$a = func();  //这种调用方式得到的不是引用传值
$a =& func(); //这样调用才是引用传值
Nach dem Login kopieren
$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
Nach dem Login kopieren

Bitte sehen Sie sich das detaillierte Beispiel unten an:

3.php Verschiedene Datentypen übergeben Wert/Zeiger

1 . Wertübergabe von Basisdatentypen

/* **************************************************** */ 
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
  
/* **************************************************** */
Nach dem Login kopieren

2, Array (standardmäßig wird eine Kopie der Daten kopiert), wenn Sie die Adresse übergeben möchten, dann &$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 )
Nach dem Login kopieren

3. Wertübergabe von Objektdatentyp

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
Nach dem Login kopieren

In PHP5 wird das Kopieren von Objekten durch Referenz erreicht. In der obigen Spalte ist $a=new person; $b=$a; eigentlich äquivalent zu $a=new person $b=&$a; Die Standardeinstellung in PHP5 ist, dass Objekte per Referenz aufgerufen werden; Ich möchte eine Kopie des Objekts erstellen und hoffe, dass Änderungen am Originalobjekt keine Auswirkungen auf die Kopie haben. Zu diesem Zweck definiert PHP eine spezielle Methode namens __clone.

4.php copy-on-write

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

通俗的讲

1:如果有下面的代码

$a="ABC";
 $b=$a;
Nach dem Login kopieren

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

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

$a="EFG";
Nach dem Login kopieren

由于$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
Nach dem Login kopieren

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

unset($a);
echo $b;//这里输出EFG
Nach dem Login kopieren

相关推荐:php培训

Das obige ist der detaillierte Inhalt vonWas sind die Unterschiede zwischen der Wertübergabe und der Referenzübergabe in PHP?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage