ホームページ > バックエンド開発 > PHPの問題 > PHP における値渡しと参照渡しの違いは何ですか?

PHP における値渡しと参照渡しの違いは何ですか?

青灯夜游
リリース: 2023-03-06 21:24:02
オリジナル
4197 人が閲覧しました

値を渡すとは、変数の値を新しい値にコピーすることを意味します。関数のスコープ内で変数の値を変更しても、関数の外の変数の値には影響しません。参照による受け渡しは変数の参照をコピーします。参照による受け渡しはメモリ アドレスを渡すため、関数のスコープ内では、値への変更は関数の外側にも反映されます。

PHP における値渡しと参照渡しの違いは何ですか?

推奨事項: 「PHP ビデオ チュートリアル

php 値の受け渡し: 関数スコープ内関数内で変数値を変更しても、関数外の変数値には影響しません。

PHP 参照による: メモリ アドレスは参照によって渡されるため、関数スコープ内では、値への変更は関数の外部にも反映されます。

値渡し、参照渡し、アドレス渡しの違い:

1. 値渡しとは、実際のパラメータの値を行に割り当てることです。パラメータ

この場合、行パラメータの変更は実際のパラメータの値には影響しません

2。アドレス

を渡すのは値を渡す特別な方法ですが、 int

#アドレスを渡した後、実際のパラメータと行パラメータは同じオブジェクトを指します

#3. 参照を渡す

実際にパラメータをアドレスで渡します

渡した後、行パラメータと実際のパラメータは同じオブジェクトですが、それらの名前は異なります

##行パラメータを変更すると、実際のパラメータ

ダニエルの説明:

値を渡す

: copy と同じです。 [たとえば、私は家を持っています。私はあなたに建築資材をあげます。あなたは私とまったく同じ家を建てます。あなたが家で何をしても私には影響しません。私が家で何をするかは私には影響しません。何もありません。相互に独立してあなたに影響を与えます。 】

<?php 
$testa=1; //定义变量a 
$testb=2; //定义变量b 
$testb = $testa; //变量a赋值给变量b 
echo $testb; //显示为1 
?>
ログイン後にコピー
参照渡し

: C言語のポインタとほぼ同じ感じです。たとえば、私には家があります。私があなたに鍵を渡せば、私たち二人とも家に入ることができます。あなたが家の中で何をしても私に影響します。

[長所と短所:] 値の受け渡しは、特に大きな文字列やオブジェクトの場合、時間がかかります。これは非常にコストのかかる操作になります。参照の転送は、関数内のすべての操作と同等です。操作の場合転送変数では、大きな変数を転送するときに非常に効率的です。

1. まず名詞について説明しましょう。

値の転送 (値渡し) プロセス中、呼び出される関数の仮パラメータは呼び出される関数のローカル変数として扱われます。つまり、スタック内にメモリ空間が開かれ、呼び出し関数によって入力されたパラメータ。実際のパラメータの値は、実際のパラメータのコピーになります。値転送の特徴は、呼び出される関数の仮パラメータに対する操作はすべてローカル変数として実行され、呼び出し元関数の実パラメータ変数の値には影響を与えないことです。

参照渡しプロセス中、呼び出された関数の仮パラメータはスタック上のメモリ空間を開くためのローカル変数としても使用されますが、この時点で格納されているものは呼び出し側によって格納されます。 function. 実際のパラメータ変数のアドレス。仮パラメータに対する呼び出された関数の操作はすべて、間接アドレス指定として処理されます。つまり、呼び出し関数内の実際のパラメータ変数には、スタックに格納されているアドレスを介してアクセスされます。このため、呼び出される関数が仮パラメータに対して行う操作は、呼び出し元の関数に影響を与えます。

注: 上の赤字のテキストは、アプリケーション転送によって領域が解放されるのではなく、領域が解放されることを説明しています。ただし、解放された領域は実際のパラメータ変数アドレスを格納するために使用されます。

2.php には以下の 3 つの用途があります。

①. 変数の参照代入: $a = &$b

②. 関数呼び出し時に渡す参照パラメータ

1) PHP の初期には、& 記号が使用されていました。 func(&$arg);

などのパス参照型変数を呼び出すときに使用されました。 2) その後、関数の参照型パラメータは、関数の宣言時に定義する必要があると規定されました。 : function func(&$arg);

Note:

参照宣言中に参照型パラメータを定義した後、ランタイム参照パラメータの受け渡しは放棄されます。有効にするには、php.ini にallow_call_time_pass_reference を追加する必要があります。 it.

③. この関数は参照型を返します。このアプリケーション メソッドでは、関数を宣言するときに関数名の前に & 記号を追加する必要があり、呼び出すときに参照代入メソッドを使用する必要があります。コード例は次のとおりです。

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 のデフォルトでは、参照によってオブジェクトを呼び出しますが、場合によっては、オブジェクトのコピーを作成し、元のオブジェクトへの変更がコピーに影響しないことを望む場合、この目的のために、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 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート