Maison > développement back-end > Problème PHP > Quelles sont les différences entre le passage par valeur et le passage par référence en PHP ?

Quelles sont les différences entre le passage par valeur et le passage par référence en PHP ?

青灯夜游
Libérer: 2023-03-06 21:24:02
original
4200 Les gens l'ont consulté

Le passage par valeur copie la valeur de la variable vers une nouvelle valeur dans le cadre de la fonction, la modification de la valeur de la variable n'affectera pas la valeur de la variable en dehors de la fonction. Le passage par référence copie la référence de la variable ; dans la portée de la fonction, toute modification de la valeur est également reflétée en dehors de la fonction, car le passage par référence transmet l'adresse mémoire.

Quelles sont les différences entre le passage par valeur et le passage par référence en PHP ?

Recommandé : "Tutoriel vidéo PHP"

passage de la valeur php : dans la portée de la fonction Changer la valeur de la variable à l'intérieur de la fonction n'affectera pas la valeur de la variable en dehors de la fonction.

PHP par référence : dans le cadre de la fonction, toute modification de la valeur est également reflétée en dehors de la fonction, car l'adresse mémoire est passée par référence.

La différence entre le passage par valeur, le passage par référence et le passage par adresse :

1 Le passage par valeur signifie attribuer la valeur du paramètre réel à la ligne. paramètre

Ensuite, la modification du paramètre de ligne n'affectera pas la valeur du paramètre réel

2. Passer l'adresse

est une manière particulière de transmettre une valeur, mais quoi il transmet c'est l'adresse, pas de la manière ordinaire telle que int

Ensuite, après avoir passé l'adresse, les paramètres réels et les paramètres de ligne pointent vers le même objet

Passage par référence

.

Passez vraiment les paramètres par adresse

Après le passage, les paramètres de ligne et les paramètres réels sont le même objet, seuls leurs noms sont différents

La modification des paramètres de ligne affectera la valeur de les paramètres réels

Explication de Daniel :

Valeur de passage : C'est la même chose que la copie. [Par exemple, j'ai une maison. Je vous donne des matériaux de construction. Vous construisez une maison qui est exactement la même que la mienne. Tout ce que vous faites dans votre maison ne m'affectera pas, je le ferai dans ma maison. , indépendants les uns des autres. 】

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

Pass-by-reference : Semblable aux pointeurs en langage C, cela ressemble presque à la même chose. Par exemple, j'ai une maison. Si je vous donne une clé, nous pouvons tous les deux entrer dans la maison. Tout ce que vous faites dans la maison m'affectera.

[Avantages et inconvénients :] La transmission de valeurs prendra du temps, en particulier pour les chaînes et les objets volumineux. Ce sera une opération très coûteuse. Le transfert de références équivaut à n'importe quelle opération au sein de la fonction. sur les variables de transfert, il est très efficace lors du transfert de grandes variables !

1. Expliquons d’abord le nom.

Pendant le processus de passage par valeur, les paramètres formels de la fonction appelée sont traités comme des variables locales de la fonction appelée, c'est-à-dire que de l'espace mémoire est ouvert dans la pile pour stocker les paramètres entrés par la fonction appelante. La valeur du paramètre réel devient une copie du paramètre réel. La caractéristique du transfert de valeur est que toute opération de la fonction appelée sur les paramètres formels est effectuée comme une variable locale et n'affectera pas la valeur de la variable paramètre réelle de la fonction appelante.

Pendant le processus de passage par référence, bien que les paramètres formels de la fonction appelée soient également utilisés comme variables locales pour ouvrir de l'espace mémoire sur la pile, ce qui est stocké à ce moment est mis par l'appelant fonction. L’adresse de la variable de paramètre réelle. Toute opération de la fonction appelée sur les paramètres formels est traitée comme un adressage indirect, c'est-à-dire que les variables de paramètre réelles dans la fonction appelante sont accessibles via l'adresse stockée dans la pile. Pour cette raison, toute opération effectuée par la fonction appelée sur les paramètres formels affecte la fonction appelante.

Remarque : le texte rouge ci-dessus explique que le transfert d'application n'ouvre pas d'espace, mais ouvre de l'espace, mais l'espace ouvert est utilisé pour stocker l'adresse réelle de la variable de paramètre.

Il y a trois utilisations citées dans 2.php.

①. Affectation de référence des variables : $a = &$b

②. Paramètre de référence passant lors de l'appel de la fonction

1) Au début de PHP, & était passé lors de l'appel. Transfert de symboles de variables de type référence, telles que : func(&$arg);

2) Plus tard, il a été stipulé que les paramètres de type référence des fonctions devaient être définis lors de la déclaration de la fonction, par exemple : fonction func(&$arg) ;

Remarque :Après avoir défini les paramètres de type de référence lors de la déclaration d'une référence, le passage des paramètres de référence d'exécution est abandonné. Vous devez ajouter allow_call_time_pass_reference à php.ini pour l'activer. .

③ . La fonction renvoie un type de référence. Cette méthode d'application nécessite l'ajout d'un symbole & avant le nom de la fonction lors de la déclaration de la fonction, et lors de l'appel, la méthode d'affectation de référence doit être utilisée. suit :

function &func() {
    return $a;
}
$a = func();  //这种调用方式得到的不是引用传值
$a =& func(); //这样调用才是引用传值
Copier après la connexion
$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
Copier après la connexion

Veuillez consulter les détails ci-dessous Exemple :

3.php Différents types de données transmettant une valeur/un pointeur

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
  
/* **************************************************** */
Copier après la connexion

2 , tableau (par défaut, une copie des données est copiée), si vous souhaitez passer l'adresse, &$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 )
Copier après la connexion

3. Type de données d'objet transmettant la valeur

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
Copier après la connexion

En PHP5, la copie d'objet est réalisée par référence. Dans la colonne ci-dessus, $a=new person; $b=$a; est en fait équivalent à $a=new person;

En PHP5, la valeur par défaut est d'appeler les objets par référence, mais parfois, vous souhaiterez peut-être créer une copie d'un objet et espérer que les modifications apportées à l'objet d'origine n'affecteront pas la copie. À cet effet, PHP définit une méthode spéciale appelée __clone.

4.php copy-on-. écrire

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

通俗的讲

1:如果有下面的代码

$a="ABC";
 $b=$a;
Copier après la connexion

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

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

$a="EFG";
Copier après la connexion

由于$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
Copier après la connexion

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

unset($a);
echo $b;//这里输出EFG
Copier après la connexion

相关推荐:php培训

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal