この記事の内容は、PHPリファレンスとは何か? phpで引用した紹介文(コード例)はある程度参考になるので、困っている友人は参考にしていただければ幸いです。
1. 参照とは
PHP では、参照とは、同じ変数の内容に異なる名前でアクセスすることを指します。
PHP では変数名と変数の内容が異なるため、同じ内容でも異なる名前が付けられる場合があります。
最も近い類似点は、Unix ファイル名とファイル自体です。変数名はディレクトリ エントリであり、変数の内容はファイル自体です。参照は、Unix ファイル システムのハード リンクと考えることができます。
PHP の参照は C のポインターとは異なります。たとえば、参照に対してポインター演算を行うことはできません。参照は実際のメモリ アドレスではなく、シンボル テーブルのエイリアスです。
2. 参照機能
PHP の参照により、2 つの変数が同じコンテンツを指すことができます。
$a =& $b;
これは、$a と $b が同じ変数を指していることを意味します。ここで
$a と $b はまったく同じです。$a が $b を指している、またはその逆ではなく、$a と $b が同じ場所を指しているということです。参照を持つ配列がコピーされた場合、その値は逆参照されません。配列値を関数に渡す場合も同様です。
$a = 'a'; $arr1 = [ 'a' => $a, 'b' => &$a, // $arr1['b'] 与 $a 指向同一个变量 ]; // 将 $arr1 传值赋值给 $arr2 $arr2 = $arr1; print_r($arr2); // $arr2 的值为 ['a' => 'a', 'b' => 'a'] // 修改 $a 的值为 'b' $a = 'b'; print_r($arr2); // $arr2 的值为 ['a' => 'a', 'b' => 'b'] function foo($arr){ // 将 $arr['b'] 的值改为 'c'; $arr['b'] = 'c'; } echo $a; // $a 的值为 'b' // 将 $arr1 传入函数 foo($arr1); echo $a; // $a 的值为 'c'
未定義の変数が参照によって割り当てられた場合、参照パラメータによって渡された場合、または参照によって返された場合、変数は自動的に作成されます。
// 定义函数 foo(),通过引用传递参数 function foo(&$var) { } foo($a); // 创建变量 $a,值为 NULL var_dump($a); // NULL foo($b['b']); // 创建数组 $b = ['b' => NULL] var_dump(array_key_exists('b', $b)); // bool(true) $c = new StdClass; foo($c->d); // 创建对象属性 $c->d = NULL var_dump(property_exists($c, 'd')); // bool(true)
関数内でグローバルとして宣言された変数に参照が割り当てられている場合、その参照は関数内でのみ表示されます。これは、$GLOBALS 配列を使用することで回避できます。
$var1 = 'var1'; $var2 = 'var2'; function global_references($use_globals) { global $var1, $var2; if (!$use_globals) { $var2 = & $var1; // $var2 只在函数内部可见 } else { $GLOBALS["var2"] = & $var1; // $GLOBALS["var2"]在全球范围内也可见 } } global_references(false); echo "var2 is set to '$var2'\n"; // var2 is set to 'var2' global_references(true); echo "var2 is set to '$var2'\n"; // var2 is set to 'var1'
global $var; は $var =& $GLOBALS['var']; の略称と考えることができます。したがって、別の参照を $var に代入しても、ローカル変数への参照が変更されるだけです。
foreach ステートメントで参照を使用して変数に値を代入すると、参照されたオブジェクトも変更されます。
$ref = 0; $row = & $ref; foreach ([1, 2, 3] as $row) { // do something } echo $ref; // 3 - 遍历数组的最后一个元素
3. 参照渡し
関数がそのパラメーターの値を変更できるように、変数を参照によって関数に渡すことができます。
function foo(&$var) { $var++; } $a=5; foo($a); echo $a; // 6
関数呼び出しには参照シンボルはなく、関数定義のみにあることに注意してください。パラメーターを参照によって正しく渡すには、関数定義だけで十分です。
変数
関数から返される参照
変数の参照渡し
function foo(&$var) { $var++; } $a=5; foo($a); echo $a; // 6
参照渡し 関数からの参照 返された参照
function foo(&$var) { $var++; echo $var; // 6 } function &bar() { $a = 5; return $a; } foo(bar());
関数、式、値などを参照によって渡すことはできません
function foo(&$var) { $var++; } function bar() // 注意,这个函数不返回引用 { $a = 5; return $a; } foo(bar()); // 自 PHP 5.0.5 起导致致命错误,自 PHP 5.1.1 起导致严格模式错误,自 PHP 7.0 起导致 notice 信息 foo($a = 5); // 表达式,不是变量。PHP Notice: Only variables should be passed by reference foo(5); // PHP Fatal error: Only variables can be passed by reference
4. 参照によって返す
Return by Reference は、参照をバインドする必要がある変数を見つけるために関数を使用する場合に使用できます。
パフォーマンスを向上させるために戻り参照を使用しないでください。エンジンはそれ自体を最適化するのに十分な機能を備えています。正当な技術的理由がある場合にのみ参照を返してください。
class Foo { public $value = 42; public function &getValue() { return $this->value; } } $foo = new Foo; // $myValue 是 $obj->value 的引用. $myValue = &$foo->getValue(); // 将 $foo->value 修改为 2 $foo->value = 2; echo $myValue; // 2
参照リターンは変数のみを返すことができます。 return intval($this->value); のように関数から参照を返そうとすると、関数は参照される変数ではなく式の結果を返そうとするため、エラーが発生します。参照変数を返すことができるのは関数からのみであり、他に方法はありません。
class Foo { public $value = 42; public function &getValue() { return intval($this->value); // PHP Notice: Only variable references should be returned by reference } } $foo = new Foo; // $myValue 是 $obj->value 的引用. $myValue = &$foo->getValue();
5. 参照の解除
参照の設定を解除すると、変数名と変数の内容の間のバインドが解除されるだけです。これは、変数の内容が破壊されることを意味するものではありません。
$a = 1; $b = & $a; unset($a); echo $b; // 1
6.
多くの PHP 構文構造は参照メカニズムを通じて実装されているため、参照バインディングに関する上記の内容はすべてこれらの構造にも当てはまります。
グローバル参照
グローバル $var を使用して変数を宣言すると、実際には関数内でグローバル変数への参照が作成されます。つまり、これを実行した場合の効果は同じです。
global $var; $var =& $GLOBALS["var"];
これは、$var を unset してもグローバル変数 $GLOBALS["var"] の設定が解除されないことを意味します。
#$this
オブジェクトのメソッドでは、$this は常に、それを呼び出すオブジェクトへの参照になります。以上がPHP 引用符とは何ですか? PHP での引用の紹介 (コード例)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。