ホームページ  >  記事  >  バックエンド開発  >  PHP リファレンスの受け渡しとリファレンスとその使用法入門_PHP チュートリアル

PHP リファレンスの受け渡しとリファレンスとその使用法入門_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-13 17:16:30857ブラウズ

phpでの引用は&を使用して行われます。ここで、php引用における使用例と引用の問題と事項をいくつか紹介します。参考のために入力してください。

引用とは

PHP でのクォートとは、同じ変数の内容に異なる名前でアクセスすることを意味します。これは C ポインターとは異なり、参照はシンボル テーブルのエイリアスです。 PHP では変数名と変数の内容が異なるため、同じ内容でも異なる名前が付けられることに注意してください。最も近い類似点は、Unix のファイル名とファイル自体です。変数名はディレクトリ エントリであり、変数の内容はファイル自体です。参照は、Unix ファイル システムのハードリンクと考えることができます。

引用符をどうするか
PHP の参照では、2 つの変数が同じコンテンツを指すことができます。
$a =& $b; の場合、$a と $b は同じ変数を指します。
ヒント: ここで $a と $b はまったく同じです。これは、$a が $b を指す、またはその逆ではなく、$a と $b が同じ場所を指すということです。

関数がその引数の値を変更できるように、参照によって変数を関数に渡すことができます。構文は次のとおりです:

コードは次のとおりです コードをコピー

関数 foo(&$var)
{
$var++
}

$a=5
ふー($a); エコー $a;

//出力は: 6

PHP 引用文字 &

PHP 参照の役割 (つまり、変数、関数、オブジェクトなどの前にアンパサンドを追加する) について、まず次のプログラムを見てみましょう。

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

$a = 100 //変数aを宣言します
; $b = &$a; //変数 b を宣言し、独立変数 a を参照します
エコー "$a
"; echo "$b
";
$a++; //変数 a が 1 増加します
echo "$a
";
echo "$b
";//変数 b を確認します。変数 b も 1 増加しており、同じストレージ ユニットが使用されていることを示します
?>

プログラムの実行結果:

100

100

101
101

php のデフォルトは値渡しです:

コードは次のとおりです30と20
コードをコピー
$a = 20;
$b = $a;
$a = $a + 10; $a と '.$b をエコーし​​ます。 ?>



プログラムの実行結果:

アドレスとして渡したい場合は、& を追加する必要があります。つまり:

コードは次のとおりです

コードをコピー $a = 20;
$b = &$a; $a = $a + 10; $a と '.$b をエコーし​​ます。 ?>




プログラムの実行結果:

つまり、& は $a のアドレスを $b に渡します。この場合、2 つの変数はメモリ記憶領域を共有することになります。これは、それらの値が同じであることを意味します。

同じ構文は、参照を返す関数と new 演算子で使用できます。

参照が行う 2 番目のことは、参照によって変数を渡すことです。これは、呼び出しスコープ内の同じコンテンツを参照する関数内にローカル変数を作成することによって実現されます。簡単に言うと、関数のパラメータはローカル変数への参照です。別の例を次に示します:
コードは次のとおりです コードをコピー

ソースプリントを表示しますか?
1

2 $bar =& 新しい fooclass();

3 $foo =& find_var($bar);

4 ?>

コードは次のとおりです 関数 foo(&$val1, $val2) {

$val1 += 1;
$val2 += 1;
}
$a=5;
$b=10;
foo($a,$b);
エコー $a;
エコー $b;
?>

このコードを実行するには、2 つのパラメーターを関数に渡します。1 つは $a の内容への参照で、もう 1 つは $b の値です。この関数を実行すると、$a の内容が次のようになっていることがわかります。変更されましたが、 $b の内容は変更されていません。
コードをコピー

PHP の参照と誤解

PHP における参照は、変数のエイリアスとして理解できます。 PHP 変数名はシンボル テーブルに格納され、変数の内容はヒープに格納されるため、参照ではシンボル テーブル内の異なるシンボル名を使用して同じストレージ コンテンツにアクセスします。これは、Unix ファイル システムのハードリンクと同じです。同じコンセプト、例えば:


コードは次のとおりです $a = 1;

$b = &$a; //$a と $b は同じコンテンツを指します
$b = 2;
エコー $b //2
エコー $a //2
パスリファレンス
参照による受け渡しは非常に簡単で、次のような「&」記号だけです:

関数 foo(&$a) {

$a = 2;
}

$b = 1;

foo($b);

エコー $b //2

リファレンスに戻る
コードをコピー
ほとんどの場合、パフォーマンスを向上させるために参照を返す必要はありません。zend エンジンは自動的に最適化しますが、参照を返す必要がある場合は、次の方法で参照を返すことができます。


コードは次のとおりですコードをコピー クラス foo {
パブリック $value = 42;


パブリック関数 &getValue() { // 「&」が必要です
return $this->value;

}

}

$obj = 新しい foo;
$myValue = &$obj->getValue(); // もう 1 つ「&」が必要です。$myValue はクラス foo

の $value への参照です。 $obj->value = 2; // オブジェクトの $value 属性を変更します

echo $myValue; // 出力 2、$myValue はクラス foo
の $value と同じです。

とポインター
の違い 参照はポインターに非常に似ていますが、ポインターではありません。次のコードを参照してください。

コードは次のとおりですコードをコピー $a = 0;
$b = &a;
エコー $a //0
unset($b);
エコー $a //0

$b は $a のエイリアスにすぎないため、$b が解放されても $a には何の効果もありませんが、ポインタの場合はそうではありません。次のコードを参照してください。

コードは次のとおりです#include
コードをコピー
int main(int argc, char const *argv[]) {

int a = 0;
int* b = &a;

printf("%in", a); 無料(b);

Printf("%in", a); //*** オブジェクト 0x7fff6350da08 のエラー: 解放されるポインターが割り当てられていませんでした

}


b は a へのポインタであるため、b のメモリを解放した後、再度 a にアクセスするとエラーが発生します。これは、PHP 参照と C ポインタの違いを明確に示しています。

オブジェクトと参照
PHP でオブジェクトを使用するとき、「オブジェクトは参照によって渡される」とよく言われますが、実はこれは誤解です。 PHP のオブジェクト変数には、オブジェクトを渡すときに、実際に渡されるのは識別子です。次のコードを参照してください。

コードは次のとおりですコードをコピー PHP での参照は、変数名がディレクトリ エントリ、変数の内容がファイル自体を使用して行われます。参照は、Unix ファイル システムのハードリンクと考えることができます。 引用符は PHP の引用符と同じことを行います...
$a = 新しい A;
$b = $a; $b->testA = 2;

/*

※この時の$aと$bの関係は

* * $a --> オブジェクト (クラス A) | * * * * $b --> オブジェクト ID | * *
*
*/

$c = 新しい B;
$a = $c;
$a->testB = "変更されたクラス B";

/*
※この時の$a、$b、$cの関係:
* * $b --> オブジェクト (クラス A) | * * * * $a --> オブジェクト ID2 | *** *v
* * $c --> オブジェクト ID2 | * */


echo "オブジェクト a: "; //["testB"]=> string(15) "変更されたクラス B"
echo "オブジェクト b: "; //["testA"] => echo "オブジェクト c: "; //["testB"]=> string(15) "変更されたクラス B"



オブジェクトが参照渡しの場合、$a、$b、$c の出力内容は同じになるはずですが、実際には結果はこのようになりません。 オブジェクトを参照によって渡す次の例を見てください:

本当
コードは次のとおりです コードをコピー

$aa = 新しい A;
$bb = &$aa // 引用
; $bb->testA = 2;

/*
※この時の$aaと$bbの関係は
*
* * $bb --> オブジェクト (クラス A) | * * * * $aa --------+
*
*
*/

$cc = 新しい B;
$aa = $cc;
$aa->testB = "クラス B を変更しました";

/*

※この時の$aa、$bb、$ccの関係は
*
* * | オブジェクト ID |

* * * $bb ---->-----+

* * $aa ---->-----+
* * v *** * | オブジェクト ID2 ---------------+
*** *v
* * $cc --> オブジェクト ID2 |
* */

echo "object aa: "; var_dump($aa); //["testB"]=>string(15) "変更されたクラス B"
echo "object bb: "; //["testB"]=>string(15) "変更されたクラス B"
echo "object cc: "; //["testB"]=>string(15) "変更されたクラス B"




この時点では、$aa、$bb、$cc の内容は全く同じなので、オブジェクトが参照渡しされていないことがわかります。この誤解はできるだけ早く解く必要があります。





http://www.bkjia.com/PHPjc/628637.html

www.bkjia.com

http://www.bkjia.com/PHPjc/628637.html

技術記事

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