📄 language.oop.html
字号:
</p> <div class="informalexample"> <div class="example-contents"><div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB"><?php<br />$cart </span><span style="color: #007700">= new </span><span style="color: #0000BB">Cart</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$cart</span><span style="color: #007700">-></span><span style="color: #0000BB">add_item</span><span style="color: #007700">(</span><span style="color: #DD0000">"10"</span><span style="color: #007700">, </span><span style="color: #0000BB">1</span><span style="color: #007700">);<br /><br /></span><span style="color: #0000BB">$another_cart </span><span style="color: #007700">= new </span><span style="color: #0000BB">Cart</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$another_cart</span><span style="color: #007700">-></span><span style="color: #0000BB">add_item</span><span style="color: #007700">(</span><span style="color: #DD0000">"0815"</span><span style="color: #007700">, </span><span style="color: #0000BB">3</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?></span></span></code></div> </div> </div> <p class="para"> This creates the objects <var class="varname">$cart</var> and <var class="varname">$another_cart</var>, both of the class Cart. The function add_item() of the <var class="varname">$cart</var> object is being called to add 1 item of article number 10 to the <var class="varname">$cart</var>. 3 items of article number 0815 are being added to <var class="varname">$another_cart</var>. </p> <p class="para"> Both, <var class="varname">$cart</var> and <var class="varname">$another_cart</var>, have functions add_item(), remove_item() and a variable items. These are distinct functions and variables. You can think of the objects as something similar to directories in a filesystem. In a filesystem you can have two different files <var class="filename">README.TXT</var>, as long as they are in different directories. Just like with directories where you'll have to type the full pathname in order to reach each file from the toplevel directory, you have to specify the complete name of the function you want to call: in PHP terms, the toplevel directory would be the global namespace, and the pathname separator would be <i>-></i>. Thus, the names <var class="varname">$cart->items</var> and <var class="varname">$another_cart->items</var> name two different variables. Note that the variable is named <var class="varname">$cart->items</var>, not <var class="varname">$cart->$items</var>, that is, a variable name in PHP has only a single dollar sign. </p> <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">// correct, single $<br /></span><span style="color: #0000BB">$cart</span><span style="color: #007700">-></span><span style="color: #0000BB">items </span><span style="color: #007700">= array(</span><span style="color: #DD0000">"10" </span><span style="color: #007700">=> </span><span style="color: #0000BB">1</span><span style="color: #007700">); <br /><br /></span><span style="color: #FF8000">// invalid, because $cart->$items becomes $cart->""<br /></span><span style="color: #0000BB">$cart</span><span style="color: #007700">-></span><span style="color: #0000BB">$items </span><span style="color: #007700">= array(</span><span style="color: #DD0000">"10" </span><span style="color: #007700">=> </span><span style="color: #0000BB">1</span><span style="color: #007700">);<br /><br /></span><span style="color: #FF8000">// correct, but may or may not be what was intended:<br />// $cart->$myvar becomes $cart->items<br /></span><span style="color: #0000BB">$myvar </span><span style="color: #007700">= </span><span style="color: #DD0000">'items'</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$cart</span><span style="color: #007700">-></span><span style="color: #0000BB">$myvar </span><span style="color: #007700">= array(</span><span style="color: #DD0000">"10" </span><span style="color: #007700">=> </span><span style="color: #0000BB">1</span><span style="color: #007700">); <br /></span><span style="color: #0000BB">?></span></span></code></div> </div> </div> <p class="para"> Within a class definition, you do not know under which name the object will be accessible in your program: at the time the Cart class was written, it was unknown whether the object would be named <var class="varname">$cart</var>, <var class="varname">$another_cart</var>, or something else later. Thus, you cannot write <var class="varname">$cart->items</var> within the Cart class itself. Instead, in order to be able to access its own functions and variables from within a class, one can use the pseudo-variable <var class="varname">$this</var> which can be read as 'my own' or 'current object'. Thus, '<var class="varname">$this->items[$artnr]</var> += <var class="varname">$num</var>' can be read as 'add <var class="varname">$num</var> to the <var class="varname">$artnr</var> counter of my own items array' or 'add <var class="varname">$num</var> to the <var class="varname">$artnr</var> counter of the items array within the current object'. </p> <blockquote><p><b class="note">Note</b>: The <var class="varname">$this</var> pseudo-variable is not usually defined if the method in which it is hosted is called statically. This is not, however, a strict rule: <var class="varname">$this</var> is defined if a method is called statically from within another object. In this case, the value of <var class="varname">$this</var> is that of the calling object. This is illustrated in the following 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">class </span><span style="color: #0000BB">A<br /></span><span style="color: #007700">{<br /> function </span><span style="color: #0000BB">foo</span><span style="color: #007700">()<br /> {<br /> if (isset(</span><span style="color: #0000BB">$this</span><span style="color: #007700">)) {<br /> echo </span><span style="color: #DD0000">'$this is defined ('</span><span style="color: #007700">;<br /> echo </span><span style="color: #0000BB">get_class</span><span style="color: #007700">(</span><span style="color: #0000BB">$this</span><span style="color: #007700">);<br /> echo </span><span style="color: #DD0000">")\n"</span><span style="color: #007700">;<br /> } else {<br /> echo </span><span style="color: #DD0000">"\$this is not defined.\n"</span><span style="color: #007700">;<br /> }<br /> }<br />}<br /><br />class </span><span style="color: #0000BB">B<br /></span><span style="color: #007700">{<br /> function </span><span style="color: #0000BB">bar</span><span style="color: #007700">()<br /> {<br /> </span><span style="color: #0000BB">A</span><span style="color: #007700">::</span><span style="color: #0000BB">foo</span><span style="color: #007700">();<br /> }<br />}<br /><br /></span><span style="color: #0000BB">$a </span><span style="color: #007700">= new </span><span style="color: #0000BB">A</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">$a</span><span style="color: #007700">-></span><span style="color: #0000BB">foo</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">A</span><span style="color: #007700">::</span><span style="color: #0000BB">foo</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">$b </span><span style="color: #007700">= new </span><span style="color: #0000BB">B</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">$b</span><span style="color: #007700">-></span><span style="color: #0000BB">bar</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">B</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> <p class="para">The above example will output:</p> <div class="example-contents"><pre><div class="cdata"><pre>$this is defined (a)$this is not defined.$this is defined (b)$this is not defined.</pre></div> </pre></div> </div> <br /> </p></blockquote> <blockquote><p><b class="note">Note</b>: There are some nice functions to handle classes and objects. You might want to take a look at the <a href="ref.classobj.html" class="link">Class/Object Functions</a>. <br /> </p></blockquote> </div> </div><hr /><div style="text-align: center;"> <div class="prev" style="text-align: left; float: left;"><a href="functions.internal.html">Internal (built-in) functions</a></div> <div class="next" style="text-align: right; float: right;"><a href="keyword.extends.html">extends</a></div> <div class="up"><a href="langref.html">Language Reference</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 + -