language.oop.newref.html
来自「php的帮助文档,涉及到PHP的案例和基本语法,以及实际应用内容」· HTML 代码 · 共 106 行 · 第 1/2 页
HTML
106 行
There is no performance loss (since PHP 4 and up use reference counting) returning copies instead of references. On the contrary it is most often better to simply work with copies instead of references, because creating references takes some time where creating copies virtually takes no time (unless none of them is a large array or object and one of them gets changed and the other(s) one(s) subsequently, then it would be wise to use references to change them all concurrently). </span> </p></blockquote> To prove what is written above let us watch the code below. <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: #FF8000">// now we will change the name. what do you expect?<br />// you could expect that both $bar1 and $globalref[0] change their names...<br /></span><span style="color: #0000BB">$bar1</span><span style="color: #007700">-></span><span style="color: #0000BB">setName</span><span style="color: #007700">(</span><span style="color: #DD0000">'set from outside'</span><span style="color: #007700">);<br /><br /></span><span style="color: #FF8000">// as mentioned before this is not the case.<br /></span><span style="color: #0000BB">$bar1</span><span style="color: #007700">-></span><span style="color: #0000BB">echoName</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">$globalref</span><span style="color: #007700">[</span><span style="color: #0000BB">0</span><span style="color: #007700">]-></span><span style="color: #0000BB">echoName</span><span style="color: #007700">();<br /><br /></span><span style="color: #FF8000">/* output:<br />set from outside<br />set in constructor */<br /><br />// let us see what is different with $bar2 and $globalref[1]<br /></span><span style="color: #0000BB">$bar2</span><span style="color: #007700">-></span><span style="color: #0000BB">setName</span><span style="color: #007700">(</span><span style="color: #DD0000">'set from outside'</span><span style="color: #007700">);<br /><br /></span><span style="color: #FF8000">// luckily they are not only equal, they are the same variable<br />// thus $bar2->name and $globalref[1]->name are the same too<br /></span><span style="color: #0000BB">$bar2</span><span style="color: #007700">-></span><span style="color: #0000BB">echoName</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">$globalref</span><span style="color: #007700">[</span><span style="color: #0000BB">1</span><span style="color: #007700">]-></span><span style="color: #0000BB">echoName</span><span style="color: #007700">();<br /><br /></span><span style="color: #FF8000">/* output:<br />set from outside<br />set from outside */<br /></span><span style="color: #0000BB">?></span></span></code></div> </div> </div> </p> <p class="para"> Another final example, try to understand it. <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">class </span><span style="color: #0000BB">A </span><span style="color: #007700">{<br /> function </span><span style="color: #0000BB">A</span><span style="color: #007700">(</span><span style="color: #0000BB">$i</span><span style="color: #007700">) {<br /> </span><span style="color: #0000BB">$this</span><span style="color: #007700">-></span><span style="color: #0000BB">value </span><span style="color: #007700">= </span><span style="color: #0000BB">$i</span><span style="color: #007700">;<br /> </span><span style="color: #FF8000">// try to figure out why we do not need a reference here<br /> </span><span style="color: #0000BB">$this</span><span style="color: #007700">-></span><span style="color: #0000BB">b </span><span style="color: #007700">= new </span><span style="color: #0000BB">B</span><span style="color: #007700">(</span><span style="color: #0000BB">$this</span><span style="color: #007700">);<br /> }<br /><br /> function </span><span style="color: #0000BB">createRef</span><span style="color: #007700">() {<br /> </span><span style="color: #0000BB">$this</span><span style="color: #007700">-></span><span style="color: #0000BB">c </span><span style="color: #007700">= new </span><span style="color: #0000BB">B</span><span style="color: #007700">(</span><span style="color: #0000BB">$this</span><span style="color: #007700">);<br /> }<br /><br /> function </span><span style="color: #0000BB">echoValue</span><span style="color: #007700">() {<br /> echo </span><span style="color: #DD0000">"<br />"</span><span style="color: #007700">,</span><span style="color: #DD0000">"class "</span><span style="color: #007700">,</span><span style="color: #0000BB">get_class</span><span style="color: #007700">(</span><span style="color: #0000BB">$this</span><span style="color: #007700">),</span><span style="color: #DD0000">': '</span><span style="color: #007700">,</span><span style="color: #0000BB">$this</span><span style="color: #007700">-></span><span style="color: #0000BB">value</span><span style="color: #007700">;<br /> }<br />}<br /><br /><br />class </span><span style="color: #0000BB">B </span><span style="color: #007700">{<br /> function </span><span style="color: #0000BB">B</span><span style="color: #007700">(&</span><span style="color: #0000BB">$a</span><span style="color: #007700">) {<br /> </span><span style="color: #0000BB">$this</span><span style="color: #007700">-></span><span style="color: #0000BB">a </span><span style="color: #007700">= &</span><span style="color: #0000BB">$a</span><span style="color: #007700">;<br /> }<br /><br /> function </span><span style="color: #0000BB">echoValue</span><span style="color: #007700">() {<br /> echo </span><span style="color: #DD0000">"<br />"</span><span style="color: #007700">,</span><span style="color: #DD0000">"class "</span><span style="color: #007700">,</span><span style="color: #0000BB">get_class</span><span style="color: #007700">(</span><span style="color: #0000BB">$this</span><span style="color: #007700">),</span><span style="color: #DD0000">': '</span><span style="color: #007700">,</span><span style="color: #0000BB">$this</span><span style="color: #007700">-></span><span style="color: #0000BB">a</span><span style="color: #007700">-></span><span style="color: #0000BB">value</span><span style="color: #007700">;<br /> }<br />}<br /><br /></span><span style="color: #FF8000">// try to understand why using a simple copy here would yield<br />// in an undesired result in the *-marked line<br /></span><span style="color: #0000BB">$a </span><span style="color: #007700">=& new </span><span style="color: #0000BB">A</span><span style="color: #007700">(</span><span style="color: #0000BB">10</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">$a</span><span style="color: #007700">-></span><span style="color: #0000BB">createRef</span><span style="color: #007700">();<br /><br /></span><span style="color: #0000BB">$a</span><span style="color: #007700">-></span><span style="color: #0000BB">echoValue</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">$a</span><span style="color: #007700">-></span><span style="color: #0000BB">b</span><span style="color: #007700">-></span><span style="color: #0000BB">echoValue</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">$a</span><span style="color: #007700">-></span><span style="color: #0000BB">c</span><span style="color: #007700">-></span><span style="color: #0000BB">echoValue</span><span style="color: #007700">();<br /><br /></span><span style="color: #0000BB">$a</span><span style="color: #007700">-></span><span style="color: #0000BB">value </span><span style="color: #007700">= </span><span style="color: #0000BB">11</span><span style="color: #007700">;<br /><br /></span><span style="color: #0000BB">$a</span><span style="color: #007700">-></span><span style="color: #0000BB">echoValue</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">$a</span><span style="color: #007700">-></span><span style="color: #0000BB">b</span><span style="color: #007700">-></span><span style="color: #0000BB">echoValue</span><span style="color: #007700">(); </span><span style="color: #FF8000">// *<br /></span><span style="color: #0000BB">$a</span><span style="color: #007700">-></span><span style="color: #0000BB">c</span><span style="color: #007700">-></span><span style="color: #0000BB">echoValue</span><span style="color: #007700">();<br /><br /></span><span style="color: #0000BB">?></span></span></code></div> </div> <p class="para">The above example will output:</p> <div class="example-contents"><pre><div class="cdata"><pre>class A: 10class B: 10class B: 10class A: 11class B: 11class B: 11</pre></div> </pre></div> </div> </p> </div><hr /><div style="text-align: center;"> <div class="prev" style="text-align: left; float: left;"><a href="language.oop.magic-functions.html">The magic functions __sleep and __wakeup</a></div> <div class="next" style="text-align: right; float: right;"><a href="language.oop.object-comparison.html">Comparing objects</a></div> <div class="up"><a href="language.oop.html">Classes and Objects (PHP 4)</a></div> <div class="home"><a href="index.html">PHP Manual</a></div></div></body></html>
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?