ホームページ  >  記事  >  バックエンド開発  >  PHPリファレンス

PHPリファレンス

巴扎黑
巴扎黑オリジナル
2016-11-23 13:15:11972ブラウズ

PHP におけるいわゆる参照とは、異なる名前が同じ変数の内容にアクセスすることを意味します。変数、関数、オブジェクトの前にアンパサンドを追加することで、それらの変数、関数、オブジェクトに対して使用できます。参照の種類と機能について詳しく説明します:

1. 参照型

1.1. 変数参照: 2 つの変数は同じ内容を指します

Php コード

<?php  
  $a = "abc";   
  $b = &$a;   
  echo $a;//这里输出:abc   
  echo $b;//这里输出:abc   
    
  $b = "done";   
  echo $a;//这里$a的值变为done, 所以输出done   
  echo $b;//这里输出done  
?>


1.2. 関数転送参照

Phpコード

function test(&$a)  
{  
    $a=$a+100;   
}  
  
$b=1;  
  
test($b); //这里$b传递给函数的其实是$b的变量内容所处的内存地址,通过在函数里改变$a的值,就可以改变$b的值了   
  
echo $b;//输出101

なお、ここで test(1); を使用するとエラーが発生します

1.3. 関数リファレンス

Php コード

function &test()   
{  
    static $b=0;//申明一个静态变量  
    $b=$b+1;  
    echo $b;  
    return $b;  
}  
  
$a=test();//$b的值:1  
  
$a=5;  
$a=test();//$b的值:2  
  
$a=&test();//$b的值:3  
  
$a=5;  
$a=test();//$b的值:6

を以下のように説明します。 :

$a=test () メソッドで関数を呼び出すと、関数の値が $a に代入されるだけで、$a への変更は関数内の $b には影響しません。ただし、$a= で関数を呼び出すと、 &test() メソッドの役割は、戻り値 $b のメモリ アドレスを $a 変数のメモリ アドレスと同じ場所に指定することで、同等の効果が得られます ($a=&b;)。 $aの値も変更すると同時に$bの値も変更されるので


$a=&test();を実行すると$bの値は5になります


関数の参照戻りを理解しやすくするため、静的変数のみが使用されます。実際、関数参照戻りは主にオブジェクトで使用されます


1.4、オブジェクト参照

Php コード

class testa  
{  
    var $abc="ABC";   
}  
  
$b=new testa;  
$c = &$b; // or $c = $b;  
echo $b->abc;//这里输出ABC   
echo $c->abc;//这里输出ABC   
$b->abc="DEF";   
echo $c->abc;//这里输出DEF

上記のコードはPHP5 での実行効果;

PHP5 では、オブジェクトのコピーは参照によって実現されます。上記の例では、$b=new a; $c=$b; は実際には $b=new a; $c=&$b; と同等ですが、場合によってはオブジェクトを参照します。オブジェクトのコピーを作成したいと考えており、元のオブジェクトへの変更がコピーに影響しないことを望んでいます。 この目的のために、PHP では __clone と呼ばれる特別なメソッドが定義されています

2. 参照の役割

プログラムが比較的大規模な場合、同じオブジェクトを参照する変数が多数あり、それを手動でクリアしたい場合、私は個人的にそうします。 「&」メソッドを使用してから、$var=null を使用してクリアすることをお勧めします。それ以外の場合は、php5 のデフォルトのメソッドを使用します。また、php5 で大きな配列を転送する場合は、メモリ領域を節約できるため、「&」メソッドを使用することをお勧めします。

3. 参照解除

参照の設定を解除すると、変数名と変数の内容の間のバインドが解除されます。これは、変数の内容が破壊されることを意味するものではありません。例:



<?php 
   $a = 1; 
   $b =& $a; 
   unset ($a); 
?>

は $b の設定を解除しませんが、$a を破棄するだけです。

別の例は、グローバル $var で変数を宣言すると、実際にグローバル変数への参照が確立されます。これは、次のことと同じです:


<?php 
    $var =& $GLOBALS["var"]; 
?>

これは、たとえば、unset $var はグローバル変数の設定を解除しないことを意味します。


$this の参照: オブジェクトのメソッドでは、$this は常にそれを呼び出すオブジェクトへの参照になります。


追記:

PHP の利点の 1 つは、自動ガベージ コレクション メカニズム (メモリの解放) を利用できることです。つまり、変数を使用した後にメモリを解放するための処理を行う必要はなく、PHP が自動的に実行します。もちろん、必要に応じて unset() 関数を呼び出してメモリを解放することもできますが、これは通常は必要ありません。

ただし、PHP では、次のように、メモリが自動的に解放されない状況が少なくとも 1 つあります。

2 つのオブジェクト間に「親オブジェクト-子オブジェクト」などの相互参照関係がある場合"、親オブジェクトで unset() を呼び出しても、子オブジェクト内の親オブジェクトを参照しているメモリは解放されません (親オブジェクトがガベージ コレクションされている場合でも)。


このとき、unset()を手動で呼び出しても同様です。詳細については、http://bugs.php.net/bug.php?id=33595 を参照してください。


その妥協案は、unset() 関数内のオブジェクトの __destruct() メソッドを呼び出すことです。 ------------------------------------------------ -- --------------

補足:

PHPにおけるアドレスのポインティング(ポインタに似た)機能はユーザー自身が実装するものではなく、Zendコアによって実装されており、 php 参照では、「コピーオンライト」の原則が採用されています。つまり、書き込み操作が発生しない限り、同じアドレスを指す変数やオブジェクトはコピーされません。

簡単に言うと

1: 次のコードがあるとします

$a="ABC";

$b=$a;

実際、この時点では、$a と $b は両方とも同じメモリを指します。 $a と $b ではなくアドレスが別のメモリを占有します

2: 上記のコードに次のコードを追加すると

$a="EFG";

$a と $b が指すメモリ内のデータなので一度書き込んだ後、Zend コアはこの時点で自動的に判断し、$a の $b 用のデータ コピーを自動的に作成し、ストレージ用のメモリを再申請します。




声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。