📄 language.references.whatdo.html
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html> <head> <title>What References Do</title> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> </head> <body><div style="text-align: center;"> <div class="prev" style="text-align: left; float: left;"><a href="language.references.html">References Explained</a></div> <div class="next" style="text-align: right; float: right;"><a href="language.references.arent.html">What References Are Not</a></div> <div class="up"><a href="language.references.html">References Explained</a></div> <div class="home"><a href="index.html">PHP Manual</a></div></div><hr /><div id="language.references.whatdo" class="sect1"> <h2 class="title">What References Do</h2> <p class="para"> PHP references allow you to make two variables to refer to the same content. Meaning, when you do: <div class="informalexample"> <div class="example-contents"><div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB"><?php<br />$a </span><span style="color: #007700">=& </span><span style="color: #0000BB">$b</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">?></span></span></code></div> </div> </div> it means that <var class="varname">$a</var> and <var class="varname">$b</var> point to the same content. <blockquote><p><b class="note">Note</b>: <var class="varname">$a</var> and <var class="varname">$b</var> are completely equal here, that's not <var class="varname">$a</var> is pointing to <var class="varname">$b</var> or vice versa, that's <var class="varname">$a</var> and <var class="varname">$b</var> pointing to the same place. <br /> </p></blockquote> </p> <blockquote><p><b class="note">Note</b>: If array with references is copied, its values are not dereferenced. This is valid also for arrays passed by value to functions. <br /> </p></blockquote> <blockquote><p><b class="note">Note</b>: If you assign, pass or return an undefined variable by reference, it will get created. <div class="example"> <p><b>Example #1 Using references with undefined variables</b></p> <div class="example-contents"><div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB"><?php<br /></span><span style="color: #007700">function </span><span style="color: #0000BB">foo</span><span style="color: #007700">(&</span><span style="color: #0000BB">$var</span><span style="color: #007700">) { }<br /><br /></span><span style="color: #0000BB">foo</span><span style="color: #007700">(</span><span style="color: #0000BB">$a</span><span style="color: #007700">); </span><span style="color: #FF8000">// $a is "created" and assigned to null<br /><br /></span><span style="color: #0000BB">$b </span><span style="color: #007700">= array();<br /></span><span style="color: #0000BB">foo</span><span style="color: #007700">(</span><span style="color: #0000BB">$b</span><span style="color: #007700">[</span><span style="color: #DD0000">'b'</span><span style="color: #007700">]);<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">array_key_exists</span><span style="color: #007700">(</span><span style="color: #DD0000">'b'</span><span style="color: #007700">, </span><span style="color: #0000BB">$b</span><span style="color: #007700">)); </span><span style="color: #FF8000">// bool(true)<br /><br /></span><span style="color: #0000BB">$c </span><span style="color: #007700">= new </span><span style="color: #0000BB">StdClass</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">foo</span><span style="color: #007700">(</span><span style="color: #0000BB">$c</span><span style="color: #007700">-></span><span style="color: #0000BB">d</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">property_exists</span><span style="color: #007700">(</span><span style="color: #0000BB">$c</span><span style="color: #007700">, </span><span style="color: #DD0000">'d'</span><span style="color: #007700">)); </span><span style="color: #FF8000">// bool(true)<br /></span><span style="color: #0000BB">?></span></span></code></div> </div> </div> <br /> </p></blockquote> <p class="para"> The same syntax can be used with functions, that return references, and with <i>new</i> operator (in PHP 4.0.4 and later): <div class="informalexample"> <div class="example-contents"><div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB"><?php<br />$bar </span><span style="color: #007700">=& new </span><span style="color: #0000BB">fooclass</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">$foo </span><span style="color: #007700">=& </span><span style="color: #0000BB">find_var</span><span style="color: #007700">(</span><span style="color: #0000BB">$bar</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?></span></span></code></div> </div> </div> Since PHP 5, <a href="language.oop5.basic.html#language.oop5.basic.new" class="link">new</a> return reference automatically so using <i>=&</i> in this context is deprecated and produces E_STRICT level message. </p> <blockquote><p><b class="note">Note</b>: Not using the <i>&</i> operator causes a copy of the object to be made. If you use <i>$this</i> in the class it will operate on the current instance of the class. The assignment without <i>&</i> will copy the instance (i.e. the object) and <i>$this</i> will operate on the copy, which is not always what is desired. Usually you want to have a single instance to work with, due to performance and memory consumption issues. <br /> While you can use the <i>@</i> operator to <em class="emphasis">mute</em> any errors in the constructor when using it as <i>@new</i>, this does not work when using the <i>&new</i> statement. This is a limitation of the Zend Engine and will therefore result in a parser error. <br /> </p></blockquote> <div class="warning"><b class="warning">Warning</b> <p class="para"> If you assign a reference to a variable declared <i>global</i> inside a function, the reference will be visible only inside the function. You can avoid this by using the <var class="varname"><a href="reserved.variables.globals.html" class="classname">$GLOBALS</a></var> array. <div class="example"> <p><b>Example #2 Referencing global variables inside function</b></p> <div class="example-contents"><div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB"><?php<br />$var1 </span><span style="color: #007700">= </span><span style="color: #DD0000">"Example variable"</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$var2 </span><span style="color: #007700">= </span><span style="color: #DD0000">""</span><span style="color: #007700">;<br /><br />function </span><span style="color: #0000BB">global_references</span><span style="color: #007700">(</span><span style="color: #0000BB">$use_globals</span><span style="color: #007700">)<br />{<br /> global </span><span style="color: #0000BB">$var1</span><span style="color: #007700">, </span><span style="color: #0000BB">$var2</span><span style="color: #007700">;<br /> if (!</span><span style="color: #0000BB">$use_globals</span><span style="color: #007700">) {<br /> </span><span style="color: #0000BB">$var2 </span><span style="color: #007700">=& </span><span style="color: #0000BB">$var1</span><span style="color: #007700">; </span><span style="color: #FF8000">// visible only inside the function<br /> </span><span style="color: #007700">} else {<br /> </span><span style="color: #0000BB">$GLOBALS</span><span style="color: #007700">[</span><span style="color: #DD0000">"var2"</span><span style="color: #007700">] =& </span><span style="color: #0000BB">$var1</span><span style="color: #007700">; </span><span style="color: #FF8000">// visible also in global context<br /> </span><span style="color: #007700">}<br />}<br /><br /></span><span style="color: #0000BB">global_references</span><span style="color: #007700">(</span><span style="color: #0000BB">false</span><span style="color: #007700">);<br />echo </span><span style="color: #DD0000">"var2 is set to '$var2'\n"</span><span style="color: #007700">; </span><span style="color: #FF8000">// var2 is set to ''<br /></span><span style="color: #0000BB">global_references</span><span style="color: #007700">(</span><span style="color: #0000BB">true</span><span style="color: #007700">);<br />echo </span><span style="color: #DD0000">"var2 is set to '$var2'\n"</span><span style="color: #007700">; </span><span style="color: #FF8000">// var2 is set to 'Example variable'<br /></span><span style="color: #0000BB">?></span></span></code></div> </div> </div> Think about <i>global $var;</i> as a shortcut to <i>$var =& $GLOBALS['var'];</i>. Thus assigning other reference to <i>$var</i> only changes the local variable's reference. </p> </div> <blockquote><p><b class="note">Note</b>: If you assign a value to a variable with references in a <a href="control-structures.foreach.html" class="link">foreach</a> statement, the references are modified too. <div class="example"> <p><b>Example #3 References and foreach statement</b></p> <div class="example-contents"><div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB"><?php<br />$ref </span><span style="color: #007700">= </span><span style="color: #0000BB">0</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$row </span><span style="color: #007700">=& </span><span style="color: #0000BB">$ref</span><span style="color: #007700">;<br />foreach (array(</span><span style="color: #0000BB">1</span><span style="color: #007700">, </span><span style="color: #0000BB">2</span><span style="color: #007700">, </span><span style="color: #0000BB">3</span><span style="color: #007700">) as </span><span style="color: #0000BB">$row</span><span style="color: #007700">) {<br /> </span><span style="color: #FF8000">// do something<br /></span><span style="color: #007700">}<br />echo </span><span style="color: #0000BB">$ref</span><span style="color: #007700">; </span><span style="color: #FF8000">// 3 - last element of the iterated array<br /></span><span style="color: #0000BB">?></span></span></code></div> </div> </div> <br /> </p></blockquote> <p class="para"> The second thing references do is to pass variables by-reference. This is done by making a local variable in a function and a variable in the calling scope reference to the same content. Example: <div class="informalexample"> <div class="example-contents"><div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB"><?php<br /></span><span style="color: #007700">function </span><span style="color: #0000BB">foo</span><span style="color: #007700">(&</span><span style="color: #0000BB">$var</span><span style="color: #007700">)<br />{<br /> </span><span style="color: #0000BB">$var</span><span style="color: #007700">++;<br />}<br /><br /></span><span style="color: #0000BB">$a</span><span style="color: #007700">=</span><span style="color: #0000BB">5</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">foo</span><span style="color: #007700">(</span><span style="color: #0000BB">$a</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?></span></span></code></div> </div> </div> will make <var class="varname">$a</var> to be 6. This happens because in the function <var class="varname">foo</var> the variable <var class="varname">$var</var> refers to the same content as <var class="varname">$a</var>. See also more detailed explanations about <a href="language.references.pass.html" class="link">passing by reference</a>. </p> <p class="simpara"> The third thing reference can do is <a href="language.references.return.html" class="link">return by reference</a>. </p> </div><hr /><div style="text-align: center;"> <div class="prev" style="text-align: left; float: left;"><a href="language.references.html">References Explained</a></div> <div class="next" style="text-align: right; float: right;"><a href="language.references.arent.html">What References Are Not</a></div> <div class="up"><a href="language.references.html">References Explained</a></div> <div class="home"><a href="index.html">PHP Manual</a></div></div></body></html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -