<!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.functions.html"><LINK REL="PREVIOUS" TITLE="函数" HREF="language.functions.html"><LINK REL="NEXT" TITLE="返回值" HREF="functions.returning-values.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.functions.html" ACCESSKEY="P" >上一页</A ></TD ><TD WIDTH="80%" ALIGN="center" VALIGN="bottom" >章 17. 函数</TD ><TD WIDTH="10%" ALIGN="right" VALIGN="bottom" ><A HREF="functions.returning-values.html" ACCESSKEY="N" >下一页</A ></TD ></TR ></TABLE ><HR ALIGN="LEFT" WIDTH="100%"></DIV ><DIV CLASS="sect1" ><H1 CLASS="sect1" ><A NAME="functions.arguments" >函数的参数</A ></H1 ><P > 通过参数列表可以传递信息到函数,即以逗号作为分隔符的表达式列表。 </P ><P > PHP 支持按值传递参数(默认),<A HREF="functions.arguments.html#functions.arguments.by-reference" >通过引用传递</A >以及<A HREF="functions.arguments.html#functions.arguments.default" >默认参数</A >。可变长度参数列表仅在 PHP 4 和后续版本中支持;更多信息请参照<A HREF="functions.arguments.html#functions.variable-arg-list" >可变长度参数列表</A >和涉及到的相关函数 <A HREF="function.func-num-args.html" ><B CLASS="function" >func_num_args()</B ></A >,<A HREF="function.func-get-arg.html" ><B CLASS="function" >func_get_arg()</B ></A > 以及 <A HREF="function.func-get-args.html" ><B CLASS="function" >func_get_args()</B ></A >。PHP 3 中通过传递一个数组参数可以达到类似的效果: </P ><P > <TABLE WIDTH="100%" BORDER="0" CELLPADDING="0" CELLSPACING="0" CLASS="EXAMPLE" ><TR ><TD ><DIV CLASS="example" ><A NAME="AEN5329" ></A ><P ><B >例 17-5. 向函数传递数组</B ></P ><TABLE BORDER="0" BGCOLOR="#E0E0E0" CELLPADDING="5" ><TR ><TD ><code><font color="#000000"> <font color="#0000BB"><?php<br /></font><font color="#007700">function </font><font color="#0000BB">takes_array</font><font color="#007700">(</font><font color="#0000BB">$input</font><font color="#007700">)<br />{<br /> echo </font><font color="#DD0000">"$input</font><font color="#007700">[</font><font color="#DD0000">0</font><font color="#007700">]</font><font color="#DD0000"> + $input</font><font color="#007700">[</font><font color="#DD0000">1</font><font color="#007700">]</font><font color="#DD0000"> = "</font><font color="#007700">, </font><font color="#0000BB">$input</font><font color="#007700">[</font><font color="#0000BB">0</font><font color="#007700">]+</font><font color="#0000BB">$input</font><font color="#007700">[</font><font color="#0000BB">1</font><font color="#007700">];<br />}<br /></font><font color="#0000BB">?></font> </font> </code></TD ></TR ></TABLE ></DIV ></TD ></TR ></TABLE > </P ><DIV CLASS="sect2" ><H2 CLASS="sect2" ><A NAME="functions.arguments.by-reference" >通过引用传递参数</A ></H2 ><P > 缺省情况下,函数参数通过值传递(因而即使在函数内部改变参数的值,它并不会改变函数外部的值)。如果希望允许函数修改它的参数值,必须通过引用传递参数。 </P ><P > 如果想要函数的一个参数总是通过引用传递,可以在函数定义中该参数的前面预先加上符号 &: </P ><P > <TABLE WIDTH="100%" BORDER="0" CELLPADDING="0" CELLSPACING="0" CLASS="EXAMPLE" ><TR ><TD ><DIV CLASS="example" ><A NAME="AEN5337" ></A ><P ><B >例 17-6. 用引用传递函数参数</B ></P ><TABLE BORDER="0" BGCOLOR="#E0E0E0" CELLPADDING="5" ><TR ><TD ><code><font color="#000000"> <font color="#0000BB"><?php<br /></font><font color="#007700">function </font><font color="#0000BB">add_some_extra</font><font color="#007700">(&</font><font color="#0000BB">$string</font><font color="#007700">)<br />{<br /> </font><font color="#0000BB">$string </font><font color="#007700">.= </font><font color="#DD0000">'and something extra.'</font><font color="#007700">;<br />}<br /></font><font color="#0000BB">$str </font><font color="#007700">= </font><font color="#DD0000">'This is a string, '</font><font color="#007700">;<br /></font><font color="#0000BB">add_some_extra</font><font color="#007700">(</font><font color="#0000BB">$str</font><font color="#007700">);<br />echo </font><font color="#0000BB">$str</font><font color="#007700">; </font><font color="#FF8000">// outputs 'This is a string, and something extra.'<br /></font><font color="#0000BB">?></font> </font> </code></TD ></TR ></TABLE ></DIV ></TD ></TR ></TABLE > </P ></DIV ><DIV CLASS="sect2" ><H2 CLASS="sect2" ><A NAME="functions.arguments.default" >默认参数的值</A ></H2 ><P > 函数可以定义 C++ 风格的标量参数默认值,如下: </P ><P > <TABLE WIDTH="100%" BORDER="0" CELLPADDING="0" CELLSPACING="0" CLASS="EXAMPLE" ><TR ><TD ><DIV CLASS="example" ><A NAME="AEN5344" ></A ><P ><B >例 17-7. 函数中默认参数的用途</B ></P ><TABLE BORDER="0" BGCOLOR="#E0E0E0" CELLPADDING="5" ><TR ><TD ><code><font color="#000000"> <font color="#0000BB"><?php<br /></font><font color="#007700">function </font><font color="#0000BB">makecoffee</font><font color="#007700">(</font><font color="#0000BB">$type </font><font color="#007700">= </font><font color="#DD0000">"cappuccino"</font><font color="#007700">)<br />{<br /> return </font><font color="#DD0000">"Making a cup of $type.</font><font color="#007700">\n</font><font color="#DD0000">"</font><font color="#007700">;<br />}<br />echo </font><font color="#0000BB">makecoffee</font><font color="#007700">();<br />echo </font><font color="#0000BB">makecoffee</font><font color="#007700">(</font><font color="#DD0000">"espresso"</font><font color="#007700">);<br /></font><font color="#0000BB">?></font> </font> </code></TD ></TR ></TABLE ></DIV ></TD ></TR ></TABLE > </P ><P > 上面代码段的输出是: </P ><P > <TABLE BORDER="0" BGCOLOR="#E0E0E0" CELLPADDING="5" ><TR ><TD ><PRE CLASS="screen" >Making a cup of cappuccino. Making a cup of espresso.</PRE ></TD ></TR ></TABLE > </P ><P > PHP 还允许使用数组和特殊类型 NULL 作为默认参数,例如: </P ><P > <TABLE WIDTH="100%" BORDER="0" CELLPADDING="0" CELLSPACING="0" CLASS="EXAMPLE" ><TR ><TD ><DIV CLASS="example" ><A NAME="AEN5352" ></A ><P ><B >例 17-8. 使用非标量类型作为默认参数</B ></P ><TABLE BORDER="0" BGCOLOR="#E0E0E0" CELLPADDING="5" ><TR ><TD ><code><font color="#000000"> <font color="#0000BB"><?php<br /></font><font color="#007700">function </font><font color="#0000BB">makecoffee</font><font color="#007700">(</font><font color="#0000BB">$types </font><font color="#007700">= array(</font><font color="#DD0000">"cappuccino"</font><font color="#007700">), </font><font color="#0000BB">$coffeeMaker </font><font color="#007700">= </font><font color="#0000BB">NULL</font><font color="#007700">)<br />{<br /> </font><font color="#0000BB">$device </font><font color="#007700">= </font><font color="#0000BB">is_null</font><font color="#007700">(</font><font color="#0000BB">$coffeeMaker</font><font color="#007700">) ? </font><font color="#DD0000">"hands" </font><font color="#007700">: </font><font color="#0000BB">$coffeeMaker</font><font color="#007700">;<br /> return </font><font color="#DD0000">"Making a cup of "</font><font color="#007700">.</font><font color="#0000BB">join</font><font color="#007700">(</font><font color="#DD0000">", "</font><font color="#007700">, </font><font color="#0000BB">$types</font><font color="#007700">).</font><font color="#DD0000">" with $device.</font><font color="#007700">\n</font><font color="#DD0000">"</font><font color="#007700">;<br />}<br />echo </font><font color="#0000BB">makecoffee</font><font color="#007700">();<br />echo </font><font color="#0000BB">makecoffee</font><font color="#007700">(array(</font><font color="#DD0000">"cappuccino"</font><font color="#007700">, </font><font color="#DD0000">"lavazza"</font><font color="#007700">), </font><font color="#DD0000">"teapot"</font><font color="#007700">);<br /></font><font color="#0000BB">?></font> </font> </code></TD ></TR ></TABLE ></DIV ></TD ></TR ></TABLE > </P ><P > 默认值必须是常量表达式,不是(例如)变量,类成员,或者函数调用。 </P ><P > 请注意当使用默认参数时,任何默认参数必须放在任何非默认参数的右侧;否则,可能函数将不会按照预期的情况工作。考虑下面的代码片断: </P ><P > <TABLE WIDTH="100%" BORDER="0" CELLPADDING="0" CELLSPACING="0" CLASS="EXAMPLE" ><TR ><TD ><DIV CLASS="example" ><A NAME="AEN5358" ></A ><P ><B >例 17-9. 函数默认参数不正确的用法</B ></P ><TABLE BORDER="0" BGCOLOR="#E0E0E0" CELLPADDING="5" ><TR ><TD ><code><font color="#000000"> <font color="#0000BB"><?php<br /></font><font color="#007700">function </font><font color="#0000BB">makeyogurt</font><font color="#007700">(</font><font color="#0000BB">$type </font><font color="#007700">= </font><font color="#DD0000">"acidophilus"</font><font color="#007700">, </font><font color="#0000BB">$flavour</font><font color="#007700">)<br />{<br /> return </font><font color="#DD0000">"Making a bowl of $type $flavour.</font><font color="#007700">\n</font><font color="#DD0000">"</font><font color="#007700">;<br />}<br /><br />echo </font><font color="#0000BB">makeyogurt</font><font color="#007700">(</font><font color="#DD0000">"raspberry"</font><font color="#007700">); </font><font color="#FF8000">// won't work as expected<br /></font><font color="#0000BB">?></font> </font> </code></TD ></TR ></TABLE ></DIV ></TD ></TR ></TABLE > </P ><P > 上述例子的输出是: </P ><P > <TABLE BORDER="0" BGCOLOR="#E0E0E0" CELLPADDING="5" ><TR ><TD ><PRE CLASS="screen" >Warning: Missing argument 2 in call to makeyogurt() in /usr/local/etc/httpd/htdocs/php3test/functest.html on line 41 Making a bowl of raspberry .</PRE ></TD ></TR ></TABLE > </P ><P > 现在,比较上面的例子和这个例子: </P ><P > <TABLE WIDTH="100%" BORDER="0" CELLPADDING="0" CELLSPACING="0" CLASS="EXAMPLE" ><TR ><TD ><DIV CLASS="example" ><A NAME="AEN5366" ></A ><P ><B >例 17-10. 函数默认参数正确的用法</B ></P ><TABLE BORDER="0" BGCOLOR="#E0E0E0" CELLPADDING="5" ><TR ><TD ><code><font color="#000000"> <font color="#0000BB"><?php<br /></font><font color="#007700">function </font><font color="#0000BB">makeyogurt</font><font color="#007700">(</font><font color="#0000BB">$flavour</font><font color="#007700">, </font><font color="#0000BB">$type </font><font color="#007700">= </font><font color="#DD0000">"acidophilus"</font><font color="#007700">)<br />{<br /> return </font><font color="#DD0000">"Making a bowl of $type $flavour.</font><font color="#007700">\n</font><font color="#DD0000">"</font><font color="#007700">;<br />}<br /><br />echo </font><font color="#0000BB">makeyogurt</font><font color="#007700">(</font><font color="#DD0000">"raspberry"</font><font color="#007700">); </font><font color="#FF8000">// works as expected<br /></font><font color="#0000BB">?></font> </font> </code></TD ></TR ></TABLE ></DIV ></TD ></TR ></TABLE > </P ><P > 这个例子的输出是: </P ><P > <TABLE BORDER="0" BGCOLOR="#E0E0E0" CELLPADDING="5" ><TR ><TD ><PRE CLASS="screen" >Making a bowl of acidophilus raspberry.</PRE ></TD ></TR ></TABLE > </P ><DIV CLASS="note" ><BLOCKQUOTE CLASS="note" ><P ><B >注意: </B > 自 PHP 5 起,默认值可以通过引用传递。 </P ></BLOCKQUOTE ></DIV ></DIV ><DIV CLASS="sect2" ><H2 CLASS="sect2" ><A NAME="functions.variable-arg-list" >可变长度参数列表</A ></H2 ><P > PHP 4 及更高版本已经在用户自定义函数中支持可变长度参数列表。这个真的很简单,用 <A HREF="function.func-num-args.html" ><B CLASS="function" >func_num_args()</B ></A >,<A HREF="function.func-get-arg.html" ><B CLASS="function" >func_get_arg()</B ></A >,和 <A HREF="function.func-get-args.html" ><B CLASS="function" >func_get_args()</B ></A > 函数。 </P ><P > 无需特别的语法,参数列表仍然能够被明确无误的传递给函数并且正常运转。 </P ></DIV ></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.functions.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="functions.returning-values.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.functions.html" ACCESSKEY="U" >上一级</A ></TD ><TD WIDTH="33%" ALIGN="right" VALIGN="top" >返回值</TD ></TR ></TABLE ></DIV ></BODY ></HTML >