haidong 发表于 2010-2-24 13:38:53

PHP语言参考 - 类与对象(PHP 4)

<DIV class=chapter lang=zh-cn><DIV class=titlepage><DIV><DIV><H1><A name=language.oop></A>第 18 章 类与对象(PHP 4)</H1></DIV></DIV></DIV><H2>目录</H2><DL><DT><A href="http://www.php.net/manual/zh/language.oop.php#keyword.class"><VAR><U><FONT color=#000099>类</FONT></U></VAR></A><DT><A href="http://www.php.net/manual/zh/keyword.extends.php"><VAR><U><FONT color=#000099>继承</FONT></U></VAR></A><DT><A href="http://www.php.net/manual/zh/language.oop.constructor.php"><U><FONT color=#000099>构造函数</FONT></U></A><DT><A href="http://www.php.net/manual/zh/keyword.paamayim-nekudotayim.php"><U><FONT color=#000099>范围解析操作符(<VAR>::</VAR>)</FONT></U></A><DT><A href="http://www.php.net/manual/zh/keyword.parent.php"><VAR><U><FONT color=#000099>parent</FONT></U></VAR></A><DT><A href="http://www.php.net/manual/zh/language.oop.serialization.php"><U><FONT color=#000099>序列化对象 - 会话中的对象</FONT></U></A><DT><A href="http://www.php.net/manual/zh/language.oop.magic-functions.php"><U><FONT color=#000099>魔术函数 <VAR>__sleep</VAR> 和 <VAR>__wakeup</VAR></FONT></U></A><DT><A href="http://www.php.net/manual/zh/language.oop.newref.php"><U><FONT color=#000099>构造函数中的引用</FONT></U></A><DT><A href="http://www.php.net/manual/zh/language.oop.object-comparison.php"><U><FONT color=#000099>对象的比较</FONT></U></A></DT></DL><DIV class=sect1 lang=zh-cn><DIV class=titlepage><DIV><DIV><H1><A name=keyword.class></A><VAR>类</VAR></H1></DIV></DIV></DIV><P>类是变量与作用于这些变量的函数的集合。使用下面的语法定义一个类: <DIV class=informalexample><DIV class=phpcode><CODE><SPAN class=html><FONT face=Courier><SPAN class=default><FONT color=#0000bb>&lt;?php<BR></FONT></SPAN><SPAN class=keyword><FONT color=#007700>class </FONT></SPAN><SPAN class=default><FONT color=#0000bb>Cart </FONT></SPAN></FONT><FONT face=Courier><SPAN class=keyword><FONT color=#007700>{<BR>    var </FONT></SPAN><SPAN class=default><FONT color=#0000bb>$items</FONT></SPAN><SPAN class=keyword><FONT color=#007700>;</FONT></SPAN></FONT><FONT face=Courier><SPAN class=comment><FONT color=#ff8000>// 购物车中的物品<BR><BR>    // 将 $num 个 $artnr 物品加入购物车<BR><BR>    </FONT></SPAN><SPAN class=keyword><FONT color=#007700>function </FONT></SPAN><SPAN class=default><FONT color=#0000bb>add_item</FONT></SPAN><SPAN class=keyword><FONT color=#007700>(</FONT></SPAN><SPAN class=default><FONT color=#0000bb>$artnr</FONT></SPAN><SPAN class=keyword><FONT color=#007700>, </FONT></SPAN><SPAN class=default><FONT color=#0000bb>$num</FONT></SPAN></FONT><FONT face=Courier><SPAN class=keyword><FONT color=#007700>) {<BR>      </FONT></SPAN><SPAN class=default><FONT color=#0000bb>$this</FONT></SPAN><SPAN class=keyword><FONT color=#007700>-&gt;</FONT></SPAN><SPAN class=default><FONT color=#0000bb>items</FONT></SPAN><SPAN class=keyword><FONT color=#007700>[</FONT></SPAN><SPAN class=default><FONT color=#0000bb>$artnr</FONT></SPAN><SPAN class=keyword><FONT color=#007700>] += </FONT></SPAN><SPAN class=default><FONT color=#0000bb>$num</FONT></SPAN></FONT><SPAN class=keyword><FONT face=Courier color=#007700>;<BR>    }<BR><BR>    </FONT></SPAN><FONT face=Courier><SPAN class=comment><FONT color=#ff8000>// 将 $num 个 $artnr 物品从购物车中取出<BR><BR>    </FONT></SPAN><SPAN class=keyword><FONT color=#007700>function </FONT></SPAN><SPAN class=default><FONT color=#0000bb>remove_item</FONT></SPAN><SPAN class=keyword><FONT color=#007700>(</FONT></SPAN><SPAN class=default><FONT color=#0000bb>$artnr</FONT></SPAN><SPAN class=keyword><FONT color=#007700>, </FONT></SPAN><SPAN class=default><FONT color=#0000bb>$num</FONT></SPAN></FONT><FONT face=Courier><SPAN class=keyword><FONT color=#007700>) {<BR>      if (</FONT></SPAN><SPAN class=default><FONT color=#0000bb>$this</FONT></SPAN><SPAN class=keyword><FONT color=#007700>-&gt;</FONT></SPAN><SPAN class=default><FONT color=#0000bb>items</FONT></SPAN><SPAN class=keyword><FONT color=#007700>[</FONT></SPAN><SPAN class=default><FONT color=#0000bb>$artnr</FONT></SPAN><SPAN class=keyword><FONT color=#007700>] &gt; </FONT></SPAN><SPAN class=default><FONT color=#0000bb>$num</FONT></SPAN></FONT><FONT face=Courier><SPAN class=keyword><FONT color=#007700>) {<BR>            </FONT></SPAN><SPAN class=default><FONT color=#0000bb>$this</FONT></SPAN><SPAN class=keyword><FONT color=#007700>-&gt;</FONT></SPAN><SPAN class=default><FONT color=#0000bb>items</FONT></SPAN><SPAN class=keyword><FONT color=#007700>[</FONT></SPAN><SPAN class=default><FONT color=#0000bb>$artnr</FONT></SPAN><SPAN class=keyword><FONT color=#007700>] -= </FONT></SPAN><SPAN class=default><FONT color=#0000bb>$num</FONT></SPAN></FONT><FONT face=Courier><SPAN class=keyword><FONT color=#007700>;<BR>            return </FONT></SPAN><SPAN class=default><FONT color=#0000bb>true</FONT></SPAN></FONT><FONT face=Courier><SPAN class=keyword><FONT color=#007700>;<BR>      } elseif (</FONT></SPAN><SPAN class=default><FONT color=#0000bb>$this</FONT></SPAN><SPAN class=keyword><FONT color=#007700>-&gt;</FONT></SPAN><SPAN class=default><FONT color=#0000bb>items</FONT></SPAN><SPAN class=keyword><FONT color=#007700>[</FONT></SPAN><SPAN class=default><FONT color=#0000bb>$artnr</FONT></SPAN><SPAN class=keyword><FONT color=#007700>] == </FONT></SPAN><SPAN class=default><FONT color=#0000bb>$num</FONT></SPAN></FONT><FONT face=Courier><SPAN class=keyword><FONT color=#007700>) {<BR>            unset(</FONT></SPAN><SPAN class=default><FONT color=#0000bb>$this</FONT></SPAN><SPAN class=keyword><FONT color=#007700>-&gt;</FONT></SPAN><SPAN class=default><FONT color=#0000bb>items</FONT></SPAN><SPAN class=keyword><FONT color=#007700>[</FONT></SPAN><SPAN class=default><FONT color=#0000bb>$artnr</FONT></SPAN></FONT><FONT face=Courier><SPAN class=keyword><FONT color=#007700>]);<BR>            return </FONT></SPAN><SPAN class=default><FONT color=#0000bb>true</FONT></SPAN></FONT><FONT face=Courier><SPAN class=keyword><FONT color=#007700>;<BR>      } else {<BR>            return </FONT></SPAN><SPAN class=default><FONT color=#0000bb>false</FONT></SPAN></FONT><FONT face=Courier><SPAN class=keyword><FONT color=#007700>;<BR>      }<BR>    }<BR>}<BR></FONT></SPAN><SPAN class=default><FONT color=#0000bb>?&gt;</FONT></SPAN></FONT></SPAN></CODE></DIV></DIV><P><FONT face=Courier></FONT></P><P>上面的例子定义了一个 Cart 类,这个类由购物车中的商品构成的数组和两个用于从购物车中添加和删除商品的函数组成。 </P><DIV class=warning><B class=warning>警告</B><P><SPAN class=emphasis><EM><STRONG>不能</STRONG></EM></SPAN>将一个类的定义分割到多个文件中。也<SPAN class=emphasis><EM><STRONG>不能</STRONG></EM></SPAN>将一个类的定义分割到多个 PHP 块中,除非该分割是在一个方法声明内部。以下用法将不起作用: </P><P><DIV class=informalexample><DIV class=phpcode><CODE><SPAN class=html><FONT face=Courier><SPAN class=default><FONT color=#0000bb>&lt;?php<BR></FONT></SPAN><SPAN class=keyword><FONT color=#007700>class </FONT></SPAN><SPAN class=default><FONT color=#0000bb>test </FONT></SPAN></FONT><SPAN class=keyword><FONT face=Courier color=#007700>{<BR></FONT></SPAN><FONT face=Courier><SPAN class=default><FONT color=#0000bb>?&gt;<BR>&lt;?php<BR>    </FONT></SPAN><SPAN class=keyword><FONT color=#007700>function </FONT></SPAN><SPAN class=default><FONT color=#0000bb>test</FONT></SPAN></FONT><FONT face=Courier><SPAN class=keyword><FONT color=#007700>() {<BR>      print </FONT></SPAN><SPAN class=string><FONT color=#dd0000>'OK'</FONT></SPAN></FONT><FONT face=Courier><SPAN class=keyword><FONT color=#007700>;<BR>    }<BR>}<BR></FONT></SPAN><SPAN class=default><FONT color=#0000bb>?&gt;</FONT></SPAN></FONT></SPAN></CODE></DIV></DIV><P><FONT face=Courier></FONT></P><P>但是以下用法是可以的: </P><P><DIV class=informalexample><DIV class=phpcode><CODE><SPAN class=html><FONT face=Courier><SPAN class=default><FONT color=#0000bb>&lt;?php<BR></FONT></SPAN><SPAN class=keyword><FONT color=#007700>class </FONT></SPAN><SPAN class=default><FONT color=#0000bb>test </FONT></SPAN></FONT><FONT face=Courier><SPAN class=keyword><FONT color=#007700>{<BR>    function </FONT></SPAN><SPAN class=default><FONT color=#0000bb>test</FONT></SPAN></FONT><SPAN class=keyword><FONT face=Courier color=#007700>() {<BR>      </FONT></SPAN><FONT face=Courier><SPAN class=default><FONT color=#0000bb>?&gt;<BR></FONT></SPAN>      </FONT><FONT face=Courier><SPAN class=default><FONT color=#0000bb>&lt;?php<BR>      </FONT></SPAN><SPAN class=keyword><FONT color=#007700>print </FONT></SPAN><SPAN class=string><FONT color=#dd0000>'OK'</FONT></SPAN></FONT><FONT face=Courier><SPAN class=keyword><FONT color=#007700>;<BR>    }<BR>}<BR></FONT></SPAN><SPAN class=default><FONT color=#0000bb>?&gt;</FONT></SPAN></FONT></SPAN></CODE></DIV></DIV><P><FONT face=Courier></FONT></P></DIV><P>以下警告仅用于 PHP 4。 </P><DIV class=caution><B class=caution>小心</B><P>名称 <VAR>stdClass</VAR> 已经被 Zend 使用并保留。不能在 PHP 代码中定义名为 <VAR>stdClass</VAR> 的类。 </P><P></P></DIV><DIV class=caution><B class=caution>小心</B><P>函数名 <VAR>__sleep</VAR> 和 <VAR>__wakeup</VAR> 在 PHP 类中是魔术函数。除非想要与之联系的魔术功能,否则在任何类中都不能以此命名函数。 </P><P></P></DIV><DIV class=caution><B class=caution>小心</B><P>PHP 将所有以 __ 开头的函数名保留为魔术函数。除非想要使用一些见于文档中的魔术功能,否则建议不要在 PHP 中将函数名以 __ 开头。 </P><P></P></DIV><P>在 PHP 4 中,<VAR>var</VAR> 变量的值只能初始化为常量。用非常量值初始化变量,需要一个初始化函数,该函数在对象被创建时自动被调用。这样一个函数被称之为构造函数(见下面)。 </P><DIV class=informalexample><DIV class=phpcode><CODE><SPAN class=html><SPAN class=default><FONT face=Courier color=#0000bb>&lt;?php<BR></FONT></SPAN><FONT face=Courier><SPAN class=comment><FONT color=#ff8000>/* PHP 4 中不能这样用 */<BR></FONT></SPAN><SPAN class=keyword><FONT color=#007700>class </FONT></SPAN><SPAN class=default><FONT color=#0000bb>Cart </FONT></SPAN></FONT><FONT face=Courier><SPAN class=keyword><FONT color=#007700>{<BR>    var </FONT></SPAN><SPAN class=default><FONT color=#0000bb>$todays_date </FONT></SPAN><SPAN class=keyword><FONT color=#007700>= </FONT></SPAN><SPAN class=default><FONT color=#0000bb>date</FONT></SPAN><SPAN class=keyword><FONT color=#007700>(</FONT></SPAN><SPAN class=string><FONT color=#dd0000>"Y-m-d"</FONT></SPAN></FONT><FONT face=Courier><SPAN class=keyword><FONT color=#007700>);<BR>    var </FONT></SPAN><SPAN class=default><FONT color=#0000bb>$name </FONT></SPAN><SPAN class=keyword><FONT color=#007700>= </FONT></SPAN><SPAN class=default><FONT color=#0000bb>$firstname</FONT></SPAN></FONT><FONT face=Courier><SPAN class=keyword><FONT color=#007700>;<BR>    var </FONT></SPAN><SPAN class=default><FONT color=#0000bb>$owner </FONT></SPAN><SPAN class=keyword><FONT color=#007700>= </FONT></SPAN><SPAN class=string><FONT color=#dd0000>'Fred ' </FONT></SPAN><SPAN class=keyword><FONT color=#007700>. </FONT></SPAN><SPAN class=string><FONT color=#dd0000>'Jones'</FONT></SPAN></FONT><SPAN class=keyword><FONT face=Courier color=#007700>;<BR>    </FONT></SPAN><FONT face=Courier><SPAN class=comment><FONT color=#ff8000>/* 不过包含有常量的数组可以 */<BR>    </FONT></SPAN><SPAN class=keyword><FONT color=#007700>var </FONT></SPAN><SPAN class=default><FONT color=#0000bb>$items </FONT></SPAN><SPAN class=keyword><FONT color=#007700>= array(</FONT></SPAN><SPAN class=string><FONT color=#dd0000>"VCR"</FONT></SPAN><SPAN class=keyword><FONT color=#007700>, </FONT></SPAN><SPAN class=string><FONT color=#dd0000>"TV"</FONT></SPAN></FONT><SPAN class=keyword><FONT face=Courier color=#007700>);<BR>}<BR><BR></FONT></SPAN><FONT face=Courier><SPAN class=comment><FONT color=#ff8000>/* 应该这样进行 */<BR></FONT></SPAN><SPAN class=keyword><FONT color=#007700>class </FONT></SPAN><SPAN class=default><FONT color=#0000bb>Cart </FONT></SPAN></FONT><FONT face=Courier><SPAN class=keyword><FONT color=#007700>{<BR>    var </FONT></SPAN><SPAN class=default><FONT color=#0000bb>$todays_date</FONT></SPAN></FONT><FONT face=Courier><SPAN class=keyword><FONT color=#007700>;<BR>    var </FONT></SPAN><SPAN class=default><FONT color=#0000bb>$name</FONT></SPAN></FONT><FONT face=Courier><SPAN class=keyword><FONT color=#007700>;<BR>    var </FONT></SPAN><SPAN class=default><FONT color=#0000bb>$owner</FONT></SPAN></FONT><FONT face=Courier><SPAN class=keyword><FONT color=#007700>;<BR>    var </FONT></SPAN><SPAN class=default><FONT color=#0000bb>$items </FONT></SPAN><SPAN class=keyword><FONT color=#007700>= array(</FONT></SPAN><SPAN class=string><FONT color=#dd0000>"VCR"</FONT></SPAN><SPAN class=keyword><FONT color=#007700>, </FONT></SPAN><SPAN class=string><FONT color=#dd0000>"TV"</FONT></SPAN></FONT><FONT face=Courier><SPAN class=keyword><FONT color=#007700>);<BR>    function </FONT></SPAN><SPAN class=default><FONT color=#0000bb>Cart</FONT></SPAN></FONT><FONT face=Courier><SPAN class=keyword><FONT color=#007700>() {<BR>      </FONT></SPAN><SPAN class=default><FONT color=#0000bb>$this</FONT></SPAN><SPAN class=keyword><FONT color=#007700>-&gt;</FONT></SPAN><SPAN class=default><FONT color=#0000bb>todays_date </FONT></SPAN><SPAN class=keyword><FONT color=#007700>= </FONT></SPAN><SPAN class=default><FONT color=#0000bb>date</FONT></SPAN><SPAN class=keyword><FONT color=#007700>(</FONT></SPAN><SPAN class=string><FONT color=#dd0000>"Y-m-d"</FONT></SPAN></FONT><FONT face=Courier><SPAN class=keyword><FONT color=#007700>);<BR>      </FONT></SPAN><SPAN class=default><FONT color=#0000bb>$this</FONT></SPAN><SPAN class=keyword><FONT color=#007700>-&gt;</FONT></SPAN><SPAN class=default><FONT color=#0000bb>name </FONT></SPAN><SPAN class=keyword><FONT color=#007700>= </FONT></SPAN><SPAN class=default><FONT color=#0000bb>$GLOBALS</FONT></SPAN><SPAN class=keyword><FONT color=#007700>[</FONT></SPAN><SPAN class=string><FONT color=#dd0000>'firstname'</FONT></SPAN></FONT><SPAN class=keyword><FONT face=Courier color=#007700>];<BR>      </FONT></SPAN><SPAN class=comment><FONT face=Courier color=#ff8000>/* etc. . . */<BR>    </FONT></SPAN><FONT face=Courier><SPAN class=keyword><FONT color=#007700>}<BR>}<BR></FONT></SPAN><SPAN class=default><FONT color=#0000bb>?&gt;</FONT></SPAN></FONT></SPAN></CODE></DIV></DIV><P>类也是一种类型,就是说,它们是实际变量的蓝图。必须用 <VAR>new</VAR> 运算符来创建相应类型的变量。 </P><DIV class=informalexample><DIV class=phpcode><CODE><SPAN class=html><FONT face=Courier><SPAN class=default><FONT color=#0000bb>&lt;?php<BR>$cart </FONT></SPAN><SPAN class=keyword><FONT color=#007700>= new </FONT></SPAN><SPAN class=default><FONT color=#0000bb>Cart</FONT></SPAN></FONT><FONT face=Courier><SPAN class=keyword><FONT color=#007700>;<BR></FONT></SPAN><SPAN class=default><FONT color=#0000bb>$cart</FONT></SPAN><SPAN class=keyword><FONT color=#007700>-&gt;</FONT></SPAN><SPAN class=default><FONT color=#0000bb>add_item</FONT></SPAN><SPAN class=keyword><FONT color=#007700>(</FONT></SPAN><SPAN class=string><FONT color=#dd0000>"10"</FONT></SPAN><SPAN class=keyword><FONT color=#007700>, </FONT></SPAN><SPAN class=default><FONT color=#0000bb>1</FONT></SPAN></FONT><FONT face=Courier><SPAN class=keyword><FONT color=#007700>);<BR><BR></FONT></SPAN><SPAN class=default><FONT color=#0000bb>$another_cart </FONT></SPAN><SPAN class=keyword><FONT color=#007700>= new </FONT></SPAN><SPAN class=default><FONT color=#0000bb>Cart</FONT></SPAN></FONT><FONT face=Courier><SPAN class=keyword><FONT color=#007700>;<BR></FONT></SPAN><SPAN class=default><FONT color=#0000bb>$another_cart</FONT></SPAN><SPAN class=keyword><FONT color=#007700>-&gt;</FONT></SPAN><SPAN class=default><FONT color=#0000bb>add_item</FONT></SPAN><SPAN class=keyword><FONT color=#007700>(</FONT></SPAN><SPAN class=string><FONT color=#dd0000>"0815"</FONT></SPAN><SPAN class=keyword><FONT color=#007700>, </FONT></SPAN><SPAN class=default><FONT color=#0000bb>3</FONT></SPAN></FONT><FONT face=Courier><SPAN class=keyword><FONT color=#007700>);<BR></FONT></SPAN><SPAN class=default><FONT color=#0000bb>?&gt;</FONT></SPAN></FONT></SPAN></CODE></DIV></DIV><P>上述代码创建了两个 Cart 类的对象 <VAR>$cart</VAR> 和 <VAR>$another_cart</VAR>,对象 <VAR>$cart</VAR> 的方法 add_item() 被调用时,添加了 1 件 10 号商品。对于对象 <VAR>$another_cart</VAR>,3 件 0815 号商品被添加到购物车中。 </P><P><VAR>$cart</VAR> 和 <VAR>$another_cart</VAR> 都有方法 add_item(),remove_item() 和一个 items 变量。它们都是明显的函数和变量。可以把它们当作文件系统中的某些类似目录的东西来考虑。在文件系统中,可以拥有两个不同的 <VAR>README.TXT</VAR> 文件,只要不在相同的目录中。正如从为了根目录访问每个文件需要输入该文件的完整的路径名一样,必须指定需要调用的函数的完整名称:在 PHP 术语中,根目录将是全局名字空间,路径名符号将是 <VAR>-&gt;</VAR>。因而,名称 <VAR>$cart-&gt;items</VAR> 和 <VAR>$another_cart-&gt;items</VAR> 命名了两个不同的变量。注意变量名为 <VAR>$cart-&gt;items</VAR>,不是 <VAR>$cart-&gt;$items</VAR>,那是因为在 PHP 中一个变量名只有一个单独的美元符号。 </P><DIV class=informalexample><DIV class=phpcode><CODE><SPAN class=html><SPAN class=default><FONT face=Courier color=#0000bb>&lt;?php<BR></FONT></SPAN><FONT face=Courier><SPAN class=comment><FONT color=#ff8000>// 正确,只有一个 $<BR></FONT></SPAN><SPAN class=default><FONT color=#0000bb>$cart</FONT></SPAN><SPAN class=keyword><FONT color=#007700>-&gt;</FONT></SPAN><SPAN class=default><FONT color=#0000bb>items </FONT></SPAN><SPAN class=keyword><FONT color=#007700>= array(</FONT></SPAN><SPAN class=string><FONT color=#dd0000>"10" </FONT></SPAN><SPAN class=keyword><FONT color=#007700>=&gt; </FONT></SPAN><SPAN class=default><FONT color=#0000bb>1</FONT></SPAN></FONT><SPAN class=keyword><FONT face=Courier color=#007700>);<BR><BR></FONT></SPAN><FONT face=Courier><SPAN class=comment><FONT color=#ff8000>// 不正确,因为 $cart-&gt;$items 变成了 $cart-&gt;""<BR></FONT></SPAN><SPAN class=default><FONT color=#0000bb>$cart</FONT></SPAN><SPAN class=keyword><FONT color=#007700>-&gt;</FONT></SPAN><SPAN class=default><FONT color=#0000bb>$items </FONT></SPAN><SPAN class=keyword><FONT color=#007700>= array(</FONT></SPAN><SPAN class=string><FONT color=#dd0000>"10" </FONT></SPAN><SPAN class=keyword><FONT color=#007700>=&gt; </FONT></SPAN><SPAN class=default><FONT color=#0000bb>1</FONT></SPAN></FONT><SPAN class=keyword><FONT face=Courier color=#007700>);<BR><BR></FONT></SPAN><FONT face=Courier><SPAN class=comment><FONT color=#ff8000>// 正确,但可能不是想要的结果:<BR>// $cart-&gt;$myvar 变成了 $cart-&gt;items<BR></FONT></SPAN><SPAN class=default><FONT color=#0000bb>$myvar </FONT></SPAN><SPAN class=keyword><FONT color=#007700>= </FONT></SPAN><SPAN class=string><FONT color=#dd0000>'items'</FONT></SPAN></FONT><FONT face=Courier><SPAN class=keyword><FONT color=#007700>;<BR></FONT></SPAN><SPAN class=default><FONT color=#0000bb>$cart</FONT></SPAN><SPAN class=keyword><FONT color=#007700>-&gt;</FONT></SPAN><SPAN class=default><FONT color=#0000bb>$myvar </FONT></SPAN><SPAN class=keyword><FONT color=#007700>= array(</FONT></SPAN><SPAN class=string><FONT color=#dd0000>"10" </FONT></SPAN><SPAN class=keyword><FONT color=#007700>=&gt; </FONT></SPAN><SPAN class=default><FONT color=#0000bb>1</FONT></SPAN></FONT><FONT face=Courier><SPAN class=keyword><FONT color=#007700>);<BR></FONT></SPAN><SPAN class=default><FONT color=#0000bb>?&gt;</FONT></SPAN></FONT></SPAN></CODE></DIV></DIV><P>在定义类的时候,无法得知将使什么名字的对象来访问:在编写 Cart 类时,并不知道之后对象的名称将会命名为 <VAR>$cart</VAR> 或者 <VAR>$another_cart</VAR>。因而你不能在类中使用 <VAR>$cart-&gt;items</VAR>。然而为了类定义的内部访问自身的函数和变量,可以使用伪变量 <VAR>$this</VAR> 来达到这个目的。<VAR>$this</VAR> 变量可以理解为“我自己的”或者“当前对象”。因而 '<VAR>$this-&gt;items[$artnr]</VAR> += <VAR>$num</VAR>' 可以理解为“我自己的物品数组的 <VAR>$artnr</VAR> 计数器加 <VAR>$num</VAR>”或者“在当前对象的物品数组的 <VAR>$artnr</VAR> 计数器加 <VAR>$num</VAR>”。 </P><BLOCKQUOTE><P><B>注意: </B>伪变量 <VAR>$this</VAR> 通常未定义,如果其所在的方法是被静态调用的话。但这不是个严格规定:如果一个方法被从另一个对象内静态调用的话,则 <VAR>$this</VAR> 会被定义。此时 <VAR>$this</VAR> 的值是那个发出调用的对象。用下例演示: <DIV class=informalexample><DIV class=phpcode><CODE><SPAN class=html><FONT face=Courier><SPAN class=default><FONT color=#0000bb>&lt;?php<BR></FONT></SPAN><SPAN class=keyword><FONT color=#007700>class </FONT></SPAN></FONT><SPAN class=default><FONT face=Courier color=#0000bb>A<BR></FONT></SPAN><FONT face=Courier><SPAN class=keyword><FONT color=#007700>{<BR>    function </FONT></SPAN><SPAN class=default><FONT color=#0000bb>foo</FONT></SPAN></FONT><FONT face=Courier><SPAN class=keyword><FONT color=#007700>()<BR>    {<BR>      if (isset(</FONT></SPAN><SPAN class=default><FONT color=#0000bb>$this</FONT></SPAN></FONT><FONT face=Courier><SPAN class=keyword><FONT color=#007700>)) {<BR>            echo </FONT></SPAN><SPAN class=string><FONT color=#dd0000>'$this is defined ('</FONT></SPAN></FONT><FONT face=Courier><SPAN class=keyword><FONT color=#007700>;<BR>            echo </FONT></SPAN><SPAN class=default><FONT color=#0000bb>get_class</FONT></SPAN><SPAN class=keyword><FONT color=#007700>(</FONT></SPAN><SPAN class=default><FONT color=#0000bb>$this</FONT></SPAN></FONT><FONT face=Courier><SPAN class=keyword><FONT color=#007700>);<BR>            echo </FONT></SPAN><SPAN class=string><FONT color=#dd0000>")\n"</FONT></SPAN></FONT><FONT face=Courier><SPAN class=keyword><FONT color=#007700>;<BR>      } else {<BR>            echo </FONT></SPAN><SPAN class=string><FONT color=#dd0000>"\$this is not defined.\n"</FONT></SPAN></FONT><SPAN class=keyword><FONT face=Courier color=#007700>;<BR>      }<BR>    }<BR>}<BR><BR>class </FONT></SPAN><SPAN class=default><FONT face=Courier color=#0000bb>B<BR></FONT></SPAN><FONT face=Courier><SPAN class=keyword><FONT color=#007700>{<BR>    function </FONT></SPAN><SPAN class=default><FONT color=#0000bb>bar</FONT></SPAN></FONT><FONT face=Courier><SPAN class=keyword><FONT color=#007700>()<BR>    {<BR>      </FONT></SPAN><SPAN class=default><FONT color=#0000bb>A</FONT></SPAN><SPAN class=keyword><FONT color=#007700>::</FONT></SPAN><SPAN class=default><FONT color=#0000bb>foo</FONT></SPAN></FONT><FONT face=Courier><SPAN class=keyword><FONT color=#007700>();<BR>    }<BR>}<BR><BR></FONT></SPAN><SPAN class=default><FONT color=#0000bb>$a </FONT></SPAN><SPAN class=keyword><FONT color=#007700>= new </FONT></SPAN><SPAN class=default><FONT color=#0000bb>A</FONT></SPAN></FONT><FONT face=Courier><SPAN class=keyword><FONT color=#007700>();<BR></FONT></SPAN><SPAN class=default><FONT color=#0000bb>$a</FONT></SPAN><SPAN class=keyword><FONT color=#007700>-&gt;</FONT></SPAN><SPAN class=default><FONT color=#0000bb>foo</FONT></SPAN></FONT><FONT face=Courier><SPAN class=keyword><FONT color=#007700>();<BR></FONT></SPAN><SPAN class=default><FONT color=#0000bb>A</FONT></SPAN><SPAN class=keyword><FONT color=#007700>::</FONT></SPAN><SPAN class=default><FONT color=#0000bb>foo</FONT></SPAN></FONT><FONT face=Courier><SPAN class=keyword><FONT color=#007700>();<BR></FONT></SPAN><SPAN class=default><FONT color=#0000bb>$b </FONT></SPAN><SPAN class=keyword><FONT color=#007700>= new </FONT></SPAN><SPAN class=default><FONT color=#0000bb>B</FONT></SPAN></FONT><FONT face=Courier><SPAN class=keyword><FONT color=#007700>();<BR></FONT></SPAN><SPAN class=default><FONT color=#0000bb>$b</FONT></SPAN><SPAN class=keyword><FONT color=#007700>-&gt;</FONT></SPAN><SPAN class=default><FONT color=#0000bb>bar</FONT></SPAN></FONT><FONT face=Courier><SPAN class=keyword><FONT color=#007700>();<BR></FONT></SPAN><SPAN class=default><FONT color=#0000bb>B</FONT></SPAN><SPAN class=keyword><FONT color=#007700>::</FONT></SPAN><SPAN class=default><FONT color=#0000bb>bar</FONT></SPAN></FONT><FONT face=Courier><SPAN class=keyword><FONT color=#007700>();<BR></FONT></SPAN><SPAN class=default><FONT color=#0000bb>?&gt;</FONT></SPAN></FONT></SPAN></CODE></DIV><P>上例将输出:</P><PRE class="">$this is defined (a)$this is not defined.$this is defined (b)$this is not defined.   </PRE></DIV><P></P></BLOCKQUOTE><BLOCKQUOTE><P><B>注意: </B>有一些不错的函数用来处理类和对象。应该关注一下<A title="Classes/Objects 类/对象函数" href="http://www.php.net/manual/zh/ref.classobj.php"><U><FONT color=#000099>类/对象函数</FONT></U></A>。 </P></BLOCKQUOTE></DIV></DIV>
页: [1]
查看完整版本: PHP语言参考 - 类与对象(PHP 4)