Sophie

Sophie

distrib > Mandriva > 2008.1 > x86_64 > by-pkgid > 05cd670d8a02b2b4a0ffb1756f2e8308 > files > 12013

php-manual-zh-5.2.4-1mdv2008.1.noarch.rpm

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<HTML
><HEAD
><TITLE
>引用做什么</TITLE
><META
NAME="GENERATOR"
CONTENT="Modular DocBook HTML Stylesheet Version 1.79"><LINK
REL="HOME"
TITLE="PHP 手册"
HREF="index.html"><LINK
REL="UP"
TITLE="引用的解释"
HREF="language.references.html"><LINK
REL="PREVIOUS"
TITLE="引用的解释"
HREF="language.references.html"><LINK
REL="NEXT"
TITLE="引用不是什么"
HREF="language.references.arent.html"><META
HTTP-EQUIV="Content-type"
CONTENT="text/html; charset=UTF-8"></HEAD
><BODY
CLASS="sect1"
BGCOLOR="#FFFFFF"
TEXT="#000000"
LINK="#0000FF"
VLINK="#840084"
ALINK="#0000FF"
><DIV
CLASS="NAVHEADER"
><TABLE
SUMMARY="Header navigation table"
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TH
COLSPAN="3"
ALIGN="center"
>PHP 手册</TH
></TR
><TR
><TD
WIDTH="10%"
ALIGN="left"
VALIGN="bottom"
><A
HREF="language.references.html"
ACCESSKEY="P"
>上一页</A
></TD
><TD
WIDTH="80%"
ALIGN="center"
VALIGN="bottom"
>章 21. 引用的解释</TD
><TD
WIDTH="10%"
ALIGN="right"
VALIGN="bottom"
><A
HREF="language.references.arent.html"
ACCESSKEY="N"
>下一页</A
></TD
></TR
></TABLE
><HR
ALIGN="LEFT"
WIDTH="100%"></DIV
><DIV
CLASS="sect1"
><H1
CLASS="sect1"
><A
NAME="language.references.whatdo"
>引用做什么</A
></H1
><P
>&#13;   PHP 的引用允许用两个变量来指向同一个内容。意思是,当这样做时:
   <DIV
CLASS="informalexample"
><P
></P
><A
NAME="AEN6324"
></A
><TABLE
BORDER="0"
BGCOLOR="#E0E0E0"
CELLPADDING="5"
><TR
><TD
><code><font color="#000000">
<font color="#0000BB">&lt;?php<br />$a </font><font color="#007700">=&amp; </font><font color="#0000BB">$b</font><font color="#007700">;<br /></font><font color="#0000BB">?&gt;</font>
</font>
</code></TD
></TR
></TABLE
><P
></P
></DIV
>
   这意味着 <CODE
CLASS="varname"
>$a</CODE
> 和 <CODE
CLASS="varname"
>$b</CODE
> 指向了同一个变量。
   <DIV
CLASS="note"
><BLOCKQUOTE
CLASS="note"
><P
><B
>注意: </B
>
     <CODE
CLASS="varname"
>$a</CODE
> 和 <CODE
CLASS="varname"
>$b</CODE
> 在这里是完全相同的,这并不是
     <CODE
CLASS="varname"
>$a</CODE
> 指向了 <CODE
CLASS="varname"
>$b</CODE
> 或者相反,而是
     <CODE
CLASS="varname"
>$a</CODE
> 和 <CODE
CLASS="varname"
>$b</CODE
> 指向了同一个地方。
    </P
></BLOCKQUOTE
></DIV
>
  </P
><DIV
CLASS="note"
><BLOCKQUOTE
CLASS="note"
><P
><B
>注意: </B
>
    如果具有引用的数组被拷贝,其值不会解除引用。对于数组传值给函数也是如此。
   </P
></BLOCKQUOTE
></DIV
><P
>&#13;   同样的语法可以用在函数中,它返回引用,以及用在 <TT
CLASS="literal"
>new</TT
>
   运算符中(PHP 4.0.4 以及以后版本):
   <DIV
CLASS="informalexample"
><P
></P
><A
NAME="AEN6340"
></A
><TABLE
BORDER="0"
BGCOLOR="#E0E0E0"
CELLPADDING="5"
><TR
><TD
><code><font color="#000000">
<font color="#0000BB">&lt;?php<br />$bar </font><font color="#007700">=&amp; new </font><font color="#0000BB">fooclass</font><font color="#007700">();<br /></font><font color="#0000BB">$foo </font><font color="#007700">=&amp; </font><font color="#0000BB">find_var</font><font color="#007700">(</font><font color="#0000BB">$bar</font><font color="#007700">);<br /></font><font color="#0000BB">?&gt;</font>
</font>
</code></TD
></TR
></TABLE
><P
></P
></DIV
>
   自 PHP 5 起,<A
HREF="language.oop5.basic.html#language.oop5.basic.new"
>new</A
>
   自动返回引用,因此在此使用 <TT
CLASS="literal"
>=&#38;</TT
> 已经过时了并且会产生
   E_STRICT 级别的消息。
  </P
><DIV
CLASS="note"
><BLOCKQUOTE
CLASS="note"
><P
><B
>注意: </B
>
    不用 <TT
CLASS="literal"
>&#38;</TT
> 运算符导致对象生成了一个拷贝。如果在类中用
    <TT
CLASS="literal"
>$this</TT
>,它将作用于该类当前的实例。没有用 <TT
CLASS="literal"
>&#38;</TT
>
    的赋值将拷贝这个实例(例如对象)并且 <TT
CLASS="literal"
>$this</TT
>
    将作用于这个拷贝上,这并不总是想要的结果。由于性能和内存消耗的问题,通常只想工作在一个实例上面。
   </P
><P
>&#13;    尽管可以用 <TT
CLASS="literal"
>@</TT
> 运算符来<SPAN
CLASS="emphasis"
><I
CLASS="emphasis"
>抑制</I
></SPAN
>构造函数中的任何错误信息,例如用
    <TT
CLASS="literal"
>@new</TT
>,但用 <TT
CLASS="literal"
>&#38;new</TT
> 语句时这不起效果。这是
    Zend 引擎的一个限制并且会导致一个解析错误。
   </P
></BLOCKQUOTE
></DIV
><DIV
CLASS="warning"
><P
></P
><TABLE
CLASS="warning"
BORDER="1"
WIDTH="100%"
><TR
><TD
ALIGN="CENTER"
><B
>警告</B
></TD
></TR
><TR
><TD
ALIGN="LEFT"
><P
>&#13;    如果在一个函数内部给一个声明为 <TT
CLASS="literal"
>global</TT
>
    的变量赋于一个引用,该引用只在函数内部可见。可以通过使用
    <CODE
CLASS="varname"
>$GLOBALS</CODE
> 数组避免这一点。
    <TABLE
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
CLASS="EXAMPLE"
><TR
><TD
><DIV
CLASS="example"
><A
NAME="AEN6359"
></A
><P
><B
>例 21-1. 在函数内引用全局变量</B
></P
><TABLE
BORDER="0"
BGCOLOR="#E0E0E0"
CELLPADDING="5"
><TR
><TD
><code><font color="#000000">
<font color="#0000BB">&lt;?php<br />$var1 </font><font color="#007700">= </font><font color="#DD0000">"Example variable"</font><font color="#007700">;<br /></font><font color="#0000BB">$var2 </font><font color="#007700">= </font><font color="#DD0000">""</font><font color="#007700">;<br /><br />function </font><font color="#0000BB">global_references</font><font color="#007700">(</font><font color="#0000BB">$use_globals</font><font color="#007700">)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;global </font><font color="#0000BB">$var1</font><font color="#007700">, </font><font color="#0000BB">$var2</font><font color="#007700">;<br />&nbsp;&nbsp;&nbsp;&nbsp;if (!</font><font color="#0000BB">$use_globals</font><font color="#007700">) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">$var2 </font><font color="#007700">=&amp; </font><font color="#0000BB">$var1</font><font color="#007700">; </font><font color="#FF8000">// visible only inside the function<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#007700">} else {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">$GLOBALS</font><font color="#007700">[</font><font color="#DD0000">"var2"</font><font color="#007700">] =&amp; </font><font color="#0000BB">$var1</font><font color="#007700">; </font><font color="#FF8000">// visible also in global context<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#007700">}<br />}<br /><br /></font><font color="#0000BB">global_references</font><font color="#007700">(</font><font color="#0000BB">false</font><font color="#007700">);<br />echo </font><font color="#DD0000">"var2 is set to '$var2'</font><font color="#007700">\n</font><font color="#DD0000">"</font><font color="#007700">; </font><font color="#FF8000">// var2 is set to ''<br /></font><font color="#0000BB">global_references</font><font color="#007700">(</font><font color="#0000BB">true</font><font color="#007700">);<br />echo </font><font color="#DD0000">"var2 is set to '$var2'</font><font color="#007700">\n</font><font color="#DD0000">"</font><font color="#007700">; </font><font color="#FF8000">// var2 is set to 'Example variable'<br /></font><font color="#0000BB">?&gt;</font>
</font>
</code></TD
></TR
></TABLE
></DIV
></TD
></TR
></TABLE
>
    把 <TT
CLASS="literal"
>global $var;</TT
> 当成是 <TT
CLASS="literal"
>$var
    =&#38; $GLOBALS['var'];</TT
> 的简写。从而将其它引用赋给
    <TT
CLASS="literal"
>$var</TT
> 只改变了本地变量的引用。
   </P
></TD
></TR
></TABLE
></DIV
><DIV
CLASS="note"
><BLOCKQUOTE
CLASS="note"
><P
><B
>注意: </B
>
    如果在 <A
HREF="control-structures.foreach.html"
>foreach</A
>
    语句中给一个具有引用的变量赋值,被引用的对象也被改变。
    <TABLE
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
CLASS="EXAMPLE"
><TR
><TD
><DIV
CLASS="example"
><A
NAME="AEN6368"
></A
><P
><B
>例 21-2. 引用与 foreach 语句</B
></P
><TABLE
BORDER="0"
BGCOLOR="#E0E0E0"
CELLPADDING="5"
><TR
><TD
><code><font color="#000000">
<font color="#0000BB">&lt;?php<br />$ref </font><font color="#007700">= </font><font color="#0000BB">0</font><font color="#007700">;<br /></font><font color="#0000BB">$row </font><font color="#007700">=&amp; </font><font color="#0000BB">$ref</font><font color="#007700">;<br />foreach (array(</font><font color="#0000BB">1</font><font color="#007700">, </font><font color="#0000BB">2</font><font color="#007700">, </font><font color="#0000BB">3</font><font color="#007700">) as </font><font color="#0000BB">$row</font><font color="#007700">) {<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#FF8000">// do something<br /></font><font color="#007700">}<br />echo </font><font color="#0000BB">$ref</font><font color="#007700">; </font><font color="#FF8000">// 3 - last element of the iterated array<br /></font><font color="#0000BB">?&gt;</font>
</font>
</code></TD
></TR
></TABLE
></DIV
></TD
></TR
></TABLE
>
   </P
></BLOCKQUOTE
></DIV
><DIV
CLASS="warning"
><P
></P
><TABLE
CLASS="warning"
BORDER="1"
WIDTH="100%"
><TR
><TD
ALIGN="CENTER"
><B
>警告</B
></TD
></TR
><TR
><TD
ALIGN="LEFT"
><P
>&#13;    复杂数组最好拷贝而不是引用。下面的例子不会如期望中那样工作。
    <TABLE
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
CLASS="EXAMPLE"
><TR
><TD
><DIV
CLASS="example"
><A
NAME="AEN6373"
></A
><P
><B
>例 21-3. 复杂数组的引用</B
></P
><TABLE
BORDER="0"
BGCOLOR="#E0E0E0"
CELLPADDING="5"
><TR
><TD
><code><font color="#000000">
<font color="#0000BB">&lt;?php<br />$top </font><font color="#007700">= array(<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#DD0000">'A' </font><font color="#007700">=&gt; array(),<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#DD0000">'B' </font><font color="#007700">=&gt; array(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#DD0000">'B_b' </font><font color="#007700">=&gt; array(),<br />&nbsp;&nbsp;&nbsp;&nbsp;),<br />);<br /><br /></font><font color="#0000BB">$top</font><font color="#007700">[</font><font color="#DD0000">'A'</font><font color="#007700">][</font><font color="#DD0000">'parent'</font><font color="#007700">] = &amp;</font><font color="#0000BB">$top</font><font color="#007700">;<br /></font><font color="#0000BB">$top</font><font color="#007700">[</font><font color="#DD0000">'B'</font><font color="#007700">][</font><font color="#DD0000">'parent'</font><font color="#007700">] = &amp;</font><font color="#0000BB">$top</font><font color="#007700">;<br /></font><font color="#0000BB">$top</font><font color="#007700">[</font><font color="#DD0000">'B'</font><font color="#007700">][</font><font color="#DD0000">'B_b'</font><font color="#007700">][</font><font color="#DD0000">'data'</font><font color="#007700">] = </font><font color="#DD0000">'test'</font><font color="#007700">;<br /></font><font color="#0000BB">print_r</font><font color="#007700">(</font><font color="#0000BB">$top</font><font color="#007700">[</font><font color="#DD0000">'A'</font><font color="#007700">][</font><font color="#DD0000">'parent'</font><font color="#007700">][</font><font color="#DD0000">'B'</font><font color="#007700">][</font><font color="#DD0000">'B_b'</font><font color="#007700">]); </font><font color="#FF8000">// array()<br /></font><font color="#0000BB">?&gt;</font>
</font>
</code></TD
></TR
></TABLE
></DIV
></TD
></TR
></TABLE
>
   </P
></TD
></TR
></TABLE
></DIV
><P
>&#13;   引用做的第二件事是用引用传递变量。这是通过在函数内建立一个本地变量并且该变量在呼叫范围内引用了同一个内容来实现的。例如:
   <DIV
CLASS="informalexample"
><P
></P
><A
NAME="AEN6377"
></A
><TABLE
BORDER="0"
BGCOLOR="#E0E0E0"
CELLPADDING="5"
><TR
><TD
><code><font color="#000000">
<font color="#0000BB">&lt;?php<br /></font><font color="#007700">function </font><font color="#0000BB">foo</font><font color="#007700">(&amp;</font><font color="#0000BB">$var</font><font color="#007700">)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">$var</font><font color="#007700">++;<br />}<br /><br /></font><font color="#0000BB">$a</font><font color="#007700">=</font><font color="#0000BB">5</font><font color="#007700">;<br /></font><font color="#0000BB">foo</font><font color="#007700">(</font><font color="#0000BB">$a</font><font color="#007700">);<br /></font><font color="#0000BB">?&gt;</font>
</font>
</code></TD
></TR
></TABLE
><P
></P
></DIV
>
   将使 <CODE
CLASS="varname"
>$a</CODE
> 变成 6。这是因为在 <CODE
CLASS="varname"
>foo</CODE
> 函数中变量
   <CODE
CLASS="varname"
>$var</CODE
> 指向了和 <CODE
CLASS="varname"
>$a</CODE
> 指向的同一个内容。更多详细解释见<A
HREF="language.references.pass.html"
>引用传递</A
>。
  </P
><P
>&#13;   引用做的第三件事是<A
HREF="language.references.return.html"
>引用返回</A
>。
  </P
></DIV
><DIV
CLASS="NAVFOOTER"
><HR
ALIGN="LEFT"
WIDTH="100%"><TABLE
SUMMARY="Footer navigation table"
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
><A
HREF="language.references.html"
ACCESSKEY="P"
>上一页</A
></TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="index.html"
ACCESSKEY="H"
>起始页</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
><A
HREF="language.references.arent.html"
ACCESSKEY="N"
>下一页</A
></TD
></TR
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
>引用的解释</TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="language.references.html"
ACCESSKEY="U"
>上一级</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
>引用不是什么</TD
></TR
></TABLE
></DIV
></BODY
></HTML
>