Sophie

Sophie

distrib > Mageia > 4 > x86_64 > by-pkgid > f800694edefe91adea2624f711a41a2d > files > 10078

php-manual-en-5.5.7-1.mga4.noarch.rpm

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
 <head>
  <meta http-equiv="content-type" content="text/html; charset=UTF-8">
  <title>References inside the constructor</title>

 </head>
 <body><div class="manualnavbar" style="text-align: center;">
 <div class="prev" style="text-align: left; float: left;"><a href="oop4.magic-functions.html">The magic functions __sleep and __wakeup</a></div>
 <div class="next" style="text-align: right; float: right;"><a href="oop4.object-comparison.html">Comparing objects</a></div>
 <div class="up"><a href="oop4.html">Classes and Objects (PHP 4)</a></div>
 <div class="home"><a href="index.html">PHP Manual</a></div>
</div><hr /><div id="oop4.newref" class="sect1">
   <h2 class="title">References inside the constructor</h2>
   <p class="para">
    Creating references within the constructor can lead to confusing
    results. This tutorial-like section helps you to avoid problems.
 
    <div class="informalexample">
     <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000">
<span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">class&nbsp;</span><span style="color: #0000BB">Foo&nbsp;</span><span style="color: #007700">{<br />&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;</span><span style="color: #0000BB">Foo</span><span style="color: #007700">(</span><span style="color: #0000BB">$name</span><span style="color: #007700">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">//&nbsp;create&nbsp;a&nbsp;reference&nbsp;inside&nbsp;the&nbsp;global&nbsp;array&nbsp;$globalref<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #007700">global&nbsp;</span><span style="color: #0000BB">$globalref</span><span style="color: #007700">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">$globalref</span><span style="color: #007700">[]&nbsp;=&nbsp;&amp;</span><span style="color: #0000BB">$this</span><span style="color: #007700">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">//&nbsp;set&nbsp;name&nbsp;to&nbsp;passed&nbsp;value<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">setName</span><span style="color: #007700">(</span><span style="color: #0000BB">$name</span><span style="color: #007700">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">//&nbsp;and&nbsp;put&nbsp;it&nbsp;out<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">echoName</span><span style="color: #007700">();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;</span><span style="color: #0000BB">echoName</span><span style="color: #007700">()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;</span><span style="color: #DD0000">"&lt;br&nbsp;/&gt;"</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">name</span><span style="color: #007700">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;</span><span style="color: #0000BB">setName</span><span style="color: #007700">(</span><span style="color: #0000BB">$name</span><span style="color: #007700">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">name&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">$name</span><span style="color: #007700">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /></span><span style="color: #0000BB">?&gt;</span>
</span>
</code></div>
    </div>

   </div>
  </p>
    
   <p class="para">
    Let us check out if there is a difference between
    <var class="varname"><var class="varname">$bar1</var></var> which has been created using
    the copy <em>=</em> operator and
    <var class="varname"><var class="varname">$bar2</var></var> which has been created using
    the reference <em>=&amp;</em> operator...

    <div class="informalexample">
     <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000">
<span style="color: #0000BB">&lt;?php<br />$bar1&nbsp;</span><span style="color: #007700">=&nbsp;new&nbsp;</span><span style="color: #0000BB">Foo</span><span style="color: #007700">(</span><span style="color: #DD0000">'set&nbsp;in&nbsp;constructor'</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">$bar1</span><span style="color: #007700">-&gt;</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">]-&gt;</span><span style="color: #0000BB">echoName</span><span style="color: #007700">();<br /><br /></span><span style="color: #FF8000">/*&nbsp;output:<br />set&nbsp;in&nbsp;constructor<br />set&nbsp;in&nbsp;constructor<br />set&nbsp;in&nbsp;constructor&nbsp;*/<br /><br /></span><span style="color: #0000BB">$bar2&nbsp;</span><span style="color: #007700">=&amp;&nbsp;new&nbsp;</span><span style="color: #0000BB">Foo</span><span style="color: #007700">(</span><span style="color: #DD0000">'set&nbsp;in&nbsp;constructor'</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">$bar2</span><span style="color: #007700">-&gt;</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">]-&gt;</span><span style="color: #0000BB">echoName</span><span style="color: #007700">();<br /><br /></span><span style="color: #FF8000">/*&nbsp;output:<br />set&nbsp;in&nbsp;constructor<br />set&nbsp;in&nbsp;constructor<br />set&nbsp;in&nbsp;constructor&nbsp;*/<br /></span><span style="color: #0000BB">?&gt;</span>
</span>
</code></div>
     </div>

    </div>
   </p>
   <p class="para">
    Apparently there is no difference, but in fact there is a
    very significant one: <var class="varname"><var class="varname">$bar1</var></var> and
    <var class="varname"><var class="varname">$globalref[0]</var></var> are _NOT_ referenced, they
    are NOT the same variable. This is because &quot;<em>new</em>&quot; does not
    return a reference by default, instead it returns a copy.
    <blockquote class="note"><p><strong class="note">Note</strong>: 
     <span class="simpara">
      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">&lt;?php<br /></span><span style="color: #FF8000">//&nbsp;now&nbsp;we&nbsp;will&nbsp;change&nbsp;the&nbsp;name.&nbsp;what&nbsp;do&nbsp;you&nbsp;expect?<br />//&nbsp;you&nbsp;could&nbsp;expect&nbsp;that&nbsp;both&nbsp;$bar1&nbsp;and&nbsp;$globalref[0]&nbsp;change&nbsp;their&nbsp;names...<br /></span><span style="color: #0000BB">$bar1</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">setName</span><span style="color: #007700">(</span><span style="color: #DD0000">'set&nbsp;from&nbsp;outside'</span><span style="color: #007700">);<br /><br /></span><span style="color: #FF8000">//&nbsp;as&nbsp;mentioned&nbsp;before&nbsp;this&nbsp;is&nbsp;not&nbsp;the&nbsp;case.<br /></span><span style="color: #0000BB">$bar1</span><span style="color: #007700">-&gt;</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">]-&gt;</span><span style="color: #0000BB">echoName</span><span style="color: #007700">();<br /><br /></span><span style="color: #FF8000">/*&nbsp;output:<br />set&nbsp;from&nbsp;outside<br />set&nbsp;in&nbsp;constructor&nbsp;*/<br /><br />//&nbsp;let&nbsp;us&nbsp;see&nbsp;what&nbsp;is&nbsp;different&nbsp;with&nbsp;$bar2&nbsp;and&nbsp;$globalref[1]<br /></span><span style="color: #0000BB">$bar2</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">setName</span><span style="color: #007700">(</span><span style="color: #DD0000">'set&nbsp;from&nbsp;outside'</span><span style="color: #007700">);<br /><br /></span><span style="color: #FF8000">//&nbsp;luckily&nbsp;they&nbsp;are&nbsp;not&nbsp;only&nbsp;equal,&nbsp;they&nbsp;are&nbsp;the&nbsp;same&nbsp;variable<br />//&nbsp;thus&nbsp;$bar2-&gt;name&nbsp;and&nbsp;$globalref[1]-&gt;name&nbsp;are&nbsp;the&nbsp;same&nbsp;too<br /></span><span style="color: #0000BB">$bar2</span><span style="color: #007700">-&gt;</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">]-&gt;</span><span style="color: #0000BB">echoName</span><span style="color: #007700">();<br /><br /></span><span style="color: #FF8000">/*&nbsp;output:<br />set&nbsp;from&nbsp;outside<br />set&nbsp;from&nbsp;outside&nbsp;*/<br /></span><span style="color: #0000BB">?&gt;</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">&lt;?php<br /></span><span style="color: #007700">class&nbsp;</span><span style="color: #0000BB">A&nbsp;</span><span style="color: #007700">{<br />&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;</span><span style="color: #0000BB">A</span><span style="color: #007700">(</span><span style="color: #0000BB">$i</span><span style="color: #007700">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">value&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">$i</span><span style="color: #007700">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">//&nbsp;try&nbsp;to&nbsp;figure&nbsp;out&nbsp;why&nbsp;we&nbsp;do&nbsp;not&nbsp;need&nbsp;a&nbsp;reference&nbsp;here<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">b&nbsp;</span><span style="color: #007700">=&nbsp;new&nbsp;</span><span style="color: #0000BB">B</span><span style="color: #007700">(</span><span style="color: #0000BB">$this</span><span style="color: #007700">);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;</span><span style="color: #0000BB">createRef</span><span style="color: #007700">()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">c&nbsp;</span><span style="color: #007700">=&nbsp;new&nbsp;</span><span style="color: #0000BB">B</span><span style="color: #007700">(</span><span style="color: #0000BB">$this</span><span style="color: #007700">);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;</span><span style="color: #0000BB">echoValue</span><span style="color: #007700">()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;</span><span style="color: #DD0000">"&lt;br&nbsp;/&gt;"</span><span style="color: #007700">,</span><span style="color: #DD0000">"class&nbsp;"</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">':&nbsp;'</span><span style="color: #007700">,</span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">value</span><span style="color: #007700">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br /><br />class&nbsp;</span><span style="color: #0000BB">B&nbsp;</span><span style="color: #007700">{<br />&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;</span><span style="color: #0000BB">B</span><span style="color: #007700">(&amp;</span><span style="color: #0000BB">$a</span><span style="color: #007700">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">a&nbsp;</span><span style="color: #007700">=&nbsp;&amp;</span><span style="color: #0000BB">$a</span><span style="color: #007700">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;</span><span style="color: #0000BB">echoValue</span><span style="color: #007700">()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;</span><span style="color: #DD0000">"&lt;br&nbsp;/&gt;"</span><span style="color: #007700">,</span><span style="color: #DD0000">"class&nbsp;"</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">':&nbsp;'</span><span style="color: #007700">,</span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">a</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">value</span><span style="color: #007700">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br /></span><span style="color: #FF8000">//&nbsp;try&nbsp;to&nbsp;understand&nbsp;why&nbsp;using&nbsp;a&nbsp;simple&nbsp;copy&nbsp;here&nbsp;would&nbsp;yield<br />//&nbsp;in&nbsp;an&nbsp;undesired&nbsp;result&nbsp;in&nbsp;the&nbsp;*-marked&nbsp;line<br /></span><span style="color: #0000BB">$a&nbsp;</span><span style="color: #007700">=&amp;&nbsp;new&nbsp;</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">-&gt;</span><span style="color: #0000BB">createRef</span><span style="color: #007700">();<br /><br /></span><span style="color: #0000BB">$a</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">echoValue</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">$a</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">b</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">echoValue</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">$a</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">c</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">echoValue</span><span style="color: #007700">();<br /><br /></span><span style="color: #0000BB">$a</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">value&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">11</span><span style="color: #007700">;<br /><br /></span><span style="color: #0000BB">$a</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">echoValue</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">$a</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">b</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">echoValue</span><span style="color: #007700">();&nbsp;</span><span style="color: #FF8000">//&nbsp;*<br /></span><span style="color: #0000BB">$a</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">c</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">echoValue</span><span style="color: #007700">();<br /><br /></span><span style="color: #0000BB">?&gt;</span>
</span>
</code></div>
     </div>

     <p class="para">The above example will output:</p>
     <div class="example-contents screen">
<div class="cdata"><pre>
class A: 10
class B: 10
class B: 10
class A: 11
class B: 11
class B: 11
</pre></div>
     </div>
    </div>
   </p>
  </div><hr /><div class="manualnavbar" style="text-align: center;">
 <div class="prev" style="text-align: left; float: left;"><a href="oop4.magic-functions.html">The magic functions __sleep and __wakeup</a></div>
 <div class="next" style="text-align: right; float: right;"><a href="oop4.object-comparison.html">Comparing objects</a></div>
 <div class="up"><a href="oop4.html">Classes and Objects (PHP 4)</a></div>
 <div class="home"><a href="index.html">PHP Manual</a></div>
</div></body></html>