ホームページ  >  記事  >  バックエンド開発  >  PHP 変数リファレンスとオブジェクトリファレンスの詳細な紹介_PHP チュートリアル

PHP 変数リファレンスとオブジェクトリファレンスの詳細な紹介_PHP チュートリアル

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

この記事では、PHPで変数参照を作成する方法と変数参照とは何なのかをまとめています。 PHP の変数参照の使い方を 1 つずつ紹介していきます。

引用符をどうするか
PHP の参照では、2 つの変数が同じコンテンツを指すことができます。つまり、これを行うとき:

コードは次のとおりです コードをコピー
$a =& $b;
?>


これは、$a と $b が同じ変数を指していることを意味します。
注:

$a と $b はここではまったく同じです。$a が $b を指しているわけではなく、その逆でもありません。$a と $b が同じ場所を指しているだけです。

注:

参照を持つ配列がコピーされた場合、その値は逆参照されません。配列値を関数に渡す場合も同様です。

注:

未定義の変数が参照によって割り当てられた場合、参照によって渡された場合、または参照によって返された場合、変数は自動的に作成されます。

例 #1 未定義の変数への参照を使用する

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

関数 foo(&$var) { }

foo($a); // $a が「作成」され、null に割り当てられます

$b = 配列();
foo($b['b']);
var_dump(array_key_exists('b', $b)) // bool(true)

;

$c = 新しい StdClass;
foo($c->d);
var_dump(property_exists($c, 'd')) // bool(true)
; ?>


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

コードは次のとおりですコードをコピー $bar =& new fooclass();
$foo =& find_var($bar);
?>

PHP 5 では、new は自動的に参照を返すため、ここでの =& の使用は廃止され、E_STRICT レベルのメッセージが生成されます。

注:

& 演算子を使用しないと、オブジェクトのコピーが生成されます。クラスで $this を使用すると、そのクラスの現在のインスタンスに適用されます。 & なしで代入するとインスタンス (オブジェクトなど) がコピーされ、そのコピーに $this が適用されますが、必ずしも望ましい結果になるとは限りません。パフォーマンスとメモリ消費の問題のため、通常は 1 つのインスタンスのみで作業する必要があります。

@new などの @ 演算子を使用してコンストラクター内のエラー メッセージを抑制することは可能ですが、これは &new ステートメントを使用する場合には効果がありません。これは Zend エンジンの制限であり、解析エラーが発生します。

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

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


アドレスによる関数呼び出し
アドレスによる呼び出しについては詳しく説明しません。コードはすぐ下にあります

$a="ABC";
$b =&$a;
echo $a;//ここに出力: ABC
echo $b;//ここに出力: ABC
$b="EFG";
echo $a;//ここでの$aの値がEFGになるのでEFGが出力されます
echo $b;//ここにEFGを出力します
?>

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

機能テスト(&$a)
{
$a=$a+100;
}
$b=1;
echo $b;//出力 1
test($b); //ここで関数に渡される $b は、実際には $b の変数の内容が配置されているメモリ アドレスです。関数内の $a の値を変更することで、$b の値を変更できます。変わりました
echo "
";
echo $b;//出力 101

ここでtest(1);を使用するとエラーが発生するので注意してください

関数参照が返されます
まずはコードを見てみましょう

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

関数&test()
{
static $b=0;//静的変数を宣言します
$b=$b+1;
エコー $b;
$b を返します;
}

$a=test();//このステートメントは、$b の値が 1 であることを出力します
$a=5;
$a=test();//このステートメントは、$b の値が 2 であることを出力します

$a=&test();//このステートメントは、$b の値が 3 であることを出力します
$a=5;
$a=test();//このステートメントは、$b の値が 6 であることを出力します

以下の説明:
このように、$a=test(); は実際には関数からの参照を取得しません。理由としては、これは 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になります

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

オブジェクトの参照

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

クラスA{
var $abc="ABC";
}
$b=新しいa;
$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=&$b; と同等です。 PHP5 のデフォルトでは、参照によってオブジェクトを呼び出しますが、オブジェクトのコピーを作成し、元のオブジェクトへの変更がコピーに影響しないようにしたい場合があります。この目的のために、PHP は __clone と呼ばれる特別なメソッドを定義しています。

引用符の役割

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

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

コードは次のとおりですコードをコピー
$a = 1;
$b =& $a;
設定を解除 ($a);
?>

$b の設定は解除されず、$a のみが解除されます。

世界的な引用
global $var を使用して変数を宣言すると、実際にはグローバル変数への参照が作成されます。それはこれを行うのと同じです:

コードは次のとおりですコードをコピー $var =& $GLOBALS["var"];
?>
これは、たとえば、unset $var ではグローバル変数の設定が解除されないことを意味します。

$これ

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

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

平たく言うと

1: 次のコードがある場合

$a="ABC";

$b=$a;

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

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

$a="EFG";

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

関数内でグローバルに宣言された変数に参照が割り当てられている場合、その参照は関数内でのみ表示されます。これは、$GLOBALS 配列を使用することで回避できます。

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

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

global $var; は $var =& $GLOBALS['var']; の略称と考えてください。したがって、別の参照を $var に代入しても、ローカル変数への参照が変更されるだけです。


面接の質問を見てみましょう


PHP 面接の質問は次のとおりです:

$var1 = "変数の例";
$var2 = "";

関数 global_references($use_globals)

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

global_references(false);

echo "var2 は '$var2'n に設定されます"; // var2 は ''
に設定されます global_references(true);
echo "var2 は '$var2'n に設定されます"; // var2 は 'サンプル変数' に設定されます
?>

質問:
コードは次のとおりです コードをコピー
$a = 1; $x =&$a; $b=$a++
?>

$b と $x の値は何ですか?


PHPの面接の質問に対する答えは次のとおりです:

$b = 1; $x = 2; インタビュー参照とオブジェクト参照についてどれだけ計算し、どれだけ知っているかを確認します。




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

www.bkjia.com

http://www.bkjia.com/PHPjc/631279.html技術記事この記事では、PHPで変数参照を作成する方法と変数参照とは何なのかについてまとめています。 PHP の変数参照の使い方を 1 つずつ紹介していきます。 PHP の引用符をどうするか...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。