ホームページ  >  記事  >  バックエンド開発  >  PHPリファレンス(&)の使い方の詳しい説明、phpリファレンス_PHPチュートリアル

PHPリファレンス(&)の使い方の詳しい説明、phpリファレンス_PHPチュートリアル

WBOY
WBOYオリジナル
2016-07-13 10:04:36799ブラウズ

PHP引用(&)、php引用の使い方を詳しく解説

PHP初心者向け&引用について

公式ドキュメント:

1. リファレンスとは: http://www.php.net/manual/zh/ language.references.whatare.php

2. リファレンスの内容: http://www.php.net/manual/zh/ language.references.whatdo.php
3. リファレンスの提供: http://www.php.net/manual/zh/ language .references .pass.php
4. リファレンスの戻り値: http://www.php.net/manual/zh/ language.references.return.php

PHP リファレンス (つまり、変数、関数、オブジェクトなどの前に & 記号を追加します)

PHP におけるリファレンスとは、異なる名前が同じ変数の内容にアクセスすることを意味します。
C言語のポインタとは異なります。 C言語におけるポインタは変数の内容とメモリ上に格納されているアドレスを格納します。

1. 変数参照

PHP 参照を使用すると、2 つの変数を使用して同じコンテンツを指すことができます

PHPリファレンス(&)の使い方の詳しい説明、phpリファレンス_PHPチュートリアル
$a="ABC";
$b =&$a;
echo $a;// ここに出力: ABC
echo $b;// ここに出力: ABC
$b="EFG";
echo $a;//ここでの$aの値がEFGになるのでEFG
が出力されます echo $b;//ここでEFGが出力されます
?> PHPリファレンス(&)の使い方の詳しい説明、phpリファレンス_PHPチュートリアル


2. 関数参照転送(アドレスによる呼び出し)

アドレスによる呼び出しについては詳しく説明しません

コードはすぐ下にあります。 PHPリファレンス(&)の使い方の詳しい説明、phpリファレンス_PHPチュートリアル <?php
関数テスト(&$ a)busing関数は、$ bの値を変更することにより、実際にはメモリアドレスです。 $b は変更可能です。
echo "
";
echo $b; // 101 を出力します
?>




ここでtest(1);を使用するとエラーが発生するので注意してください。
PHPリファレンス(&)の使い方の詳しい説明、phpリファレンス_PHPチュートリアル

注意:

上記の「test($b);」では $b の前に & 記号を追加しないでください。ただし、関数「

call_user_func_array

」では、パラメータを参照渡ししたい場合は、& 記号が必要です。次のコードに示されています:

function a(&$b){

$b++;}PHPリファレンス(&)の使い方の詳しい説明、phpリファレンス_PHPチュートリアル$c=0;
call_user_func_array('a',array(&$c));

echo $c;

//出力1

?>





3. 関数参照の戻りPHPリファレンス(&)の使い方の詳しい説明、phpリファレンス_PHPチュートリアル



まずコードを見てくださいPHPリファレンス(&)の使い方の詳しい説明、phpリファレンス_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 として出力します
?> PHPリファレンス(&)の使い方の詳しい説明、phpリファレンス_PHPチュートリアル


以下の説明:
この方法で得られるものは、実際には関数の参照戻りではありません。理由は次のとおりです。これは PHP の規定です。
PHP では、 $a= &test(); が関数の参照戻りであると規定されています。 参照戻りとは何かについては、PHP マニュアルに次のように書かれています。 参照戻りは、関数を使用して参照する変数を見つけたい場合に使用されます。 ) この文 このでたらめのせいで、長い間理解できませんでした

上の例を使って説明すると、$a=test() を使用して関数を呼び出すと、関数の値が $a に代入され、任意の値が代入されます。 $a への変更は影響しません。関数内で $b
が呼び出され、その関数は $a=&test() を通じて呼び出され、その関数は $b 変数のメモリ アドレスを返し、$b とそのメモリ アドレスをポイントします。 $a 変数を同じ場所に追加します
つまり、これは効果 ($a=&$b;) と同等なので、$a の値を変更すると $b の値も変更されます。つまり、
$a= を実行した後です。 &test();
$a=5;
、$b の値が 5 に変更されました

ここで静的変数を使用するのは、関数の参照戻り値を誰もが理解できるようにするためです。実際、関数の参照戻り値は次のとおりです。主にオブジェクトで使用されます



公式の php の例を添付します:

これは、ポインタを使用してクラス内の変数にアクセスする方法です。PHPリファレンス(&)の使い方の詳しい説明、phpリファレンス_PHPチュートリアルclass talker{

private $data = 'Hi';

public function & get(){
return $this-> ;data;
}

public function out(){
echo $this->data;
}

}

$aa = new talker();
$d = &$aa->get() ;

$aa->out();
$d = '方法';
$aa->out();
$d = 'アレ';
$aa->out();
$ d = 'You';
$aa->out();
?>

出力は「HiHowAreYou」です

PHPリファレンス(&)の使い方の詳しい説明、phpリファレンス_PHPチュートリアル

4. オブジェクトへの参照

c->abc;//ここに ABC を出力 $b->abc=" DEF";
echo $c->abc;//ここに DEF を出力します
?>



上記のコードはPHP5での実行エフェクトです



PHP5では、オブジェクトの代入は参照処理です。上記の列の $b=new a; $c=$b; は、実際には $b=new a; $c=&$b; と同等です PHP5 のデフォルトでは、オブジェクトを参照によって呼び出すことになります。オブジェクトのコピーを作成し、元のオブジェクトへの変更がコピーに影響しないことを望みます。この目的のために、PHP5 は __clone と呼ばれる特別なメソッドを定義します。 PHPリファレンス(&)の使い方の詳しい説明、phpリファレンス_PHPチュートリアル PHP 5 では、new は自動的に参照を返すため、ここでの =& の使用は廃止され、E_STRICT レベルのメッセージが生成されます。

php4ではオブジェクトの代入はコピー処理です

例: $b=new a、new a は匿名のオブジェクト インスタンスを生成し、この時点の $b はこの匿名オブジェクトのコピーです。同様に、$c=$b も $b の内容のコピーです。したがって、php4 では、メモリ領域を節約するために、$b=new a を参照モード、つまり $b=& new a に変更するのが一般的です。

別の公式の例を次に示します:

php5 では、「オブジェクト参照」機能を実現するために他に何も追加する必要はありません。

PHPリファレンス(&)の使い方の詳しい説明、phpリファレンス_PHPチュートリアル class foo{
protected $name;
function __construct($str){
$this->name = $str;
function __toString( ){
return 「私の名前は 」です。 $ this->name .'」 そして 私は 「 . __CLASS__ . 」に住んでいます。 。 "n";
}
function setName($str){
$this->name = $str;
}
}

class MasterOne{
protected $foo;
関数 __construct($f){
$this ->foo = $f;
}
function __toString(){
return 「マスター:」 。 __クラス__ 。 ' | ふー: ' 。 $this->foo 。 "n";
}
function setFooName($str){
$this->foo->setName( $str );
}
}

class MasterTwo{
protected $foo;
関数 __construct($f ){
$this->foo = $f;
}
function __toString(){
return 'マスター: ' 。 __クラス__ 。 ' | ふー: ' 。 $this->foo 。 "n";
}
function setFooName($str){
$this->foo->setName( $str );
}
}

$bar = new foo('bar') ;

印刷("n");
print("$bar の作成と $barn の印刷のみ");
print($bar);

print("n");
print("現在 $baz は $bar を参照しており、 $bar と $bazn を印刷中");
$baz =& $bar;
print($bar);

print("n");
print("今、マスター 1 と 2 を作成し、両方のコンストラクターに $bar を渡していますn" );
$m1 = 新しい MasterOne( $bar );
$m2 = 新しい MasterTwo( $bar );
print( $m1 );
print( $m2 );

print("n");
print( "現在、$bar の値を変更し、$bar と $bazn を印刷しています");
$bar->setName('baz');
print($bar);
print($baz);

print("n ");
print("再び MasterOne と Twon を印刷中です");
print($m1);
print($m2);

print("n");
print("MasterTwo の foo 名を変更して印刷しています再び MasterOne and Twon");
$m2->setFooName( 'MasterTwo's Foo' );
print( $m1 );
print( $m2 );

print("$bar と $bazn も印刷しています");
print( $bar );
print( $baz );
?> PHPリファレンス(&)の使い方の詳しい説明、phpリファレンス_PHPチュートリアル

出所:

PHPリファレンス(&)の使い方の詳しい説明、phpリファレンス_PHPチュートリアル $bar を作成し、$bar を印刷するだけです
私の名前は「bar」で、私は「foo」に住んでいます

現在、$baz は $bar に参照され、$bar と $baz を印刷しています
私の名前は「バー」で、私は住んでいます「foo」内。

今、MasterOne と Master Two を作成し、両方のコンストラクターに $bar を渡しています
Master: MasterOne | foo: 私の名前は「bar」で、「foo」に住んでいます。

マスター: MasterTwo | foo: 私の名前は「bar」で、私は「foo」に住んでいます。


今、$barの値を変更し、$barと$bazを出力しています
私の名前は「baz」で、私は「foo」に住んでいます。
私の名前は「baz」で、私は「foo」に住んでいます。

今度はマスターワンとツーを印刷中です
マスター: MasterOne| foo: 私の名前は「baz」で、「foo」に住んでいます。

マスター: MasterTwo | foo: 私の名前は「baz」で、私は「foo」に住んでいます。


今、MasterTwo の foo 名を変更して、もう一度 MasterOne と Two を印刷しています
Master: MasterOne | foo: 私の名前は「MasterTwo's Foo」で、「foo」に住んでいます。

マスター: MasterTwo | foo: 私の名前は「MasterTwo's Foo」、そして私は「foo」に住んでいます。

$bar と $baz も印刷します
私の名前は「MasterTwo's Foo」、そして私は「foo」に住んでいます。
私の名前は「MasterTwo's Foo」ですそして私は「foo」に住んでいます。 PHPリファレンス(&)の使い方の詳しい説明、phpリファレンス_PHPチュートリアル

上の例子解析:
$bar = 新しい foo('bar');
$m1 = 新しい MasterOne( $bar );
$m2 = 新しい MasterTwo( $bar );
オブジェクト $m1 と $m2 内の $bar はサンプル $bar の参照であり、コピーではありません。これは php5 内でのオブジェクト参照の特徴です。つまり、说
1.$m1 または $m2 の内部、任意の $ bar の操作のシティ参照は、外部オブジェクトの例 $bar の関連値に影響します。

php4 では、上記のように 1 つのオブジェクトの例を使用して、他のオブジェクトのプロパティを削除する必要があります。その等価コード (つまり引用用) は次のようになります。 class foo{

var $bar;

function setBar(&$newBar){
$this->bar =& newBar;
}
}

5. 参照の作用

結果程序比が大きく、同じオブジェクトを参照する量が多く、そのオブジェクトを完了した後に手動で削除し、個人による認証を "&" 方式で使用し、その後 $var=null 方式で行うことが望ましい清除。 それ以外の場合は、php5 の承認方法も使用します。 さらに、php5 では、多数のグループの転送に対して、「&」方式で内部保存スペースの使用を回避しています。これは、量コンテンツが保証されることを意味するものではありません。例:

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


$b は設定解除されず、$a のみです。同じ:

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

これは、たとえば、$var を unset しても、すべての局所変数は unset されないことを意味します。





ある関数の内部で
global の量が 1 つの参照に指定されている場合、その参照は関数の内部でのみ表示されます。

例 関数内でグローバル変数を参照する

PHPリファレンス(&)の使い方の詳しい説明、phpリファレンス_PHPチュートリアル $var1 = "変数の例";
$var2 = "";

function global_references($use_globals)
{
global $var1, $var2;
if (!$use_globals) {
$var2 = & $var1; // 関数内でのみ表示されます
} else {
$GLOBALS["var2"] =& $var1; // グローバルコンテキストでも表示されます
}
}

global_references(false);
echo " 2 is set to '$var2'n"; // var2 は ''
global_references(true);
echo "var2 is set to '$var2'n"; // var2 は 'Example variable' に設定されます
? > PHPリファレンス(&)の使い方の詳しい説明、phpリファレンス_PHPチュートリアル global $var;$var =& $GLOBALS['var']; の略称と考えてください。したがって、他の参照を $var に代入しても、ローカル変数の参照が変更されるだけです。

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


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

簡単に言うと
1: 次のコードがある場合


$a="ABC";
$b=&$a;
?>


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

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

$a="EFG";
?>


$a と $b が指すメモリ内のデータを書き換える必要があるため、Zend コアはこの時点で自動的に判断し、$b 用の $a のデータ コピーを自動的に生成し、保存用メモリ

PHP 参照 (つまり、変数、関数、オブジェクトなどの前にアンパサンドを追加する) は高度なトピックであり、パフォーマンスに大きな影響を与える PHP 参照を正しく理解することが重要です。誤解があるとプログラムエラーが発生する可能性があります。

多くの人は、PHP の参照が C のポインターと同じであると誤解しています。実際には、それらは異なり、大きく異なります。 C 言語のポインタは配列転送プロセス中に明示的に宣言する必要はなく、その他の点は * を使用して定義する必要があります。ただし、PHP のアドレスへのポインタ (ポインタと同様) 関数はユーザー自身が実装するものではありません。ただし、Zend コアによって実装されています。はい、PHP の参照は「コピーオンライト」の原則を採用しています。つまり、書き込み操作が発生しない限り、同じアドレスを指す変数やオブジェクトはコピーされません。次のコード:

$a = array('a','c'...'n');
$b = $a;

ここでのみプログラムが実行される場合、 $a と $b は同じですが、C のように異なるメモリ空間を占有することはありません。代わりに、これらは同じメモリを指します。これが php と c の違いです。 $b が $a のメモリを指すように $b=&$a と書く必要はありません。zend はすでに参照を実装しています。zend は、いつこれを行うべきか、いつ行うべきかを判断するのに非常に役立ちます。このように対処すべきではありません。

後で次のコードを書き続ける場合は、関数を追加し、パラメーターを参照渡しして、配列のサイズを出力します。

function printArray(&$arr) //参照渡し
{
print(count($arr));

}
printArray($a);

上記のコードでは、参照によって $a 配列を printArray() 関数に渡します。zend エンジンは printArray() によって $a が変更される可能性があると判断し、この時点で $a データを自動的に生成します。 $b. メモリをコピーして、ストレージに再適用します。これが、前述した「コピーオンライト」の概念です。

上記のコードを次のように変更すると:

function printArray($arr) //値の転送
{
print(count($arr));
}
printArray($a);

上記のコードは $a 値を printArray() に直接渡します。現時点では参照転送がないため、コピーオンライトは行われません。

上記の 2 行のコードの実行効率をテストできます。たとえば、ループを 1000 回外に追加して、実行にかかる時間を確認します。その結果、参照を誤って使用するとパフォーマンスが低下することがわかります。 30%以上。

自己理解:値渡しの場合は関数内のパラメータとは無関係でローカル変数の役割に相当しますが、アドレス(参照)渡しの場合は関数内のパラメータに関係します、これはグローバル変数の役割と同等です。パフォーマンスの観点からは、上記の分析を見るだけで十分です。 .

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/965027.html技術記事 PHP リファレンスの使い方を詳しく解説 ()、公式ドキュメントの引用に関する初心者向け PHP リファレンス: 1. リファレンスとは: http://www.php.net/manual/zh/ language.references.whatare.php 2.リファレンスは何をしますか: http :...

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