<!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.types.html"><LINK REL="PREVIOUS" TITLE="本文档中使用的伪类型" HREF="language.pseudo-types.html"><LINK REL="NEXT" TITLE="变量" HREF="language.variables.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.pseudo-types.html" ACCESSKEY="P" >上一页</A ></TD ><TD WIDTH="80%" ALIGN="center" VALIGN="bottom" >章 11. 类型</TD ><TD WIDTH="10%" ALIGN="right" VALIGN="bottom" ><A HREF="language.variables.html" ACCESSKEY="N" >下一页</A ></TD ></TR ></TABLE ><HR ALIGN="LEFT" WIDTH="100%"></DIV ><DIV CLASS="sect1" ><H1 CLASS="sect1" ><A NAME="language.types.type-juggling" >类型戏法</A ></H1 ><P > PHP 在变量定义中不需要(或不支持)明示的类型定义;变量类型是根据使用该变量的上下文所决定的。也就是说,如果把一个字符串值赋给变量 <CODE CLASS="parameter" >var</CODE >,<CODE CLASS="parameter" >var</CODE > 就成了一个字符串。如果又把一个整型值赋给 <CODE CLASS="parameter" >var</CODE >,那它就成了一个整数。 </P ><P > PHP 的自动类型转换的一个例子是加号“+”。如果任何一个运算数是浮点数,则所有的运算数都被当成浮点数,结果也是浮点数。否则运算数会被解释为整数,结果也是整数。注意这并没有改变这些运算数本身的类型;改变的仅是这些运算数如何被求值。 <DIV CLASS="informalexample" ><P ></P ><A NAME="AEN3477" ></A ><TABLE BORDER="0" BGCOLOR="#E0E0E0" CELLPADDING="5" ><TR ><TD ><code><font color="#000000"> <font color="#0000BB"><?php<br />$foo </font><font color="#007700">= </font><font color="#DD0000">"0"</font><font color="#007700">; </font><font color="#FF8000">// $foo is string (ASCII 48)<br /></font><font color="#0000BB">$foo </font><font color="#007700">+= </font><font color="#0000BB">2</font><font color="#007700">; </font><font color="#FF8000">// $foo is now an integer (2)<br /></font><font color="#0000BB">$foo </font><font color="#007700">= </font><font color="#0000BB">$foo </font><font color="#007700">+ </font><font color="#0000BB">1.3</font><font color="#007700">; </font><font color="#FF8000">// $foo is now a float (3.3)<br /></font><font color="#0000BB">$foo </font><font color="#007700">= </font><font color="#0000BB">5 </font><font color="#007700">+ </font><font color="#DD0000">"10 Little Piggies"</font><font color="#007700">; </font><font color="#FF8000">// $foo is integer (15)<br /></font><font color="#0000BB">$foo </font><font color="#007700">= </font><font color="#0000BB">5 </font><font color="#007700">+ </font><font color="#DD0000">"10 Small Pigs"</font><font color="#007700">; </font><font color="#FF8000">// $foo is integer (15)<br /></font><font color="#0000BB">?></font> </font> </code></TD ></TR ></TABLE ><P ></P ></DIV > </P ><P > 如果上面两个例子看上去古怪的话,参见<A HREF="language.types.string.html#language.types.string.conversion" >字符串转换为数值</A >。 </P ><P > 如果要强制将一个变量当作某种类型来求值,参见<A HREF="language.types.type-juggling.html#language.types.typecasting" >类型强制转换</A >一节。如果要改变一个变量的类型,参见 <A HREF="function.settype.html" ><B CLASS="function" >settype()</B ></A >。 </P ><P > 如果想要测试本节中任何例子的话,可以用 <A HREF="function.var-dump.html" ><B CLASS="function" >var_dump()</B ></A > 函数。 </P ><DIV CLASS="note" ><BLOCKQUOTE CLASS="note" ><P ><B >注意: </B > 数组的自动转换行为目前没有定义。 </P ><P > <DIV CLASS="informalexample" ><P ></P ><A NAME="AEN3489" ></A ><TABLE BORDER="0" BGCOLOR="#E0E0E0" CELLPADDING="5" ><TR ><TD ><code><font color="#000000"> <font color="#0000BB"><?php<br />$a </font><font color="#007700">= </font><font color="#DD0000">"1"</font><font color="#007700">; </font><font color="#FF8000">// $a 是字符串<br /></font><font color="#0000BB">$a</font><font color="#007700">[</font><font color="#0000BB">0</font><font color="#007700">] = </font><font color="#DD0000">"f"</font><font color="#007700">; </font><font color="#FF8000">// 是字符串偏移量吗?结果会是什么?<br /></font><font color="#0000BB">?></font> </font> </code></TD ></TR ></TABLE ><P ></P ></DIV > </P ><P > 由于一些历史原因,PHP 支持通过偏移量进行的字符串索引,这和数组索引的语法一样。以上的例子就产生了一个问题:$a 应该变成一个第一个元素是“f”的数组呢,还是“f”成了字符串 $a 的第一个字符? </P ><P > 目前版本的 PHP 将以上第二个赋值理解成字符串的偏移量标识,即 $a 变成了 "f",尽管如此,这种自动转换的地结果应该被认为未定义。PHP 4 引入了新的花括号语法来访问字符串的字符,请使用该语法来替代以上的操作: <DIV CLASS="informalexample" ><P ></P ><A NAME="AEN3493" ></A ><TABLE BORDER="0" BGCOLOR="#E0E0E0" CELLPADDING="5" ><TR ><TD ><code><font color="#000000"> <font color="#0000BB"><?php<br />$a </font><font color="#007700">= </font><font color="#DD0000">"abc"</font><font color="#007700">; </font><font color="#FF8000">// $a 为一个字符串<br /></font><font color="#0000BB">$a</font><font color="#007700">{</font><font color="#0000BB">1</font><font color="#007700">} = </font><font color="#DD0000">"f"</font><font color="#007700">; </font><font color="#FF8000">// $a 目前为 "afc"<br /></font><font color="#0000BB">?></font> </font> </code></TD ></TR ></TABLE ><P ></P ></DIV > 请参阅<A HREF="language.types.string.html#language.types.string.substr" >访问和修改字符串中的字符</A >一节以获取更多信息。 </P ></BLOCKQUOTE ></DIV ><DIV CLASS="sect2" ><H2 CLASS="sect2" ><A NAME="language.types.typecasting" >类型强制转换</A ></H2 ><P > PHP 中的类型强制转换和 C 中的非常像:在要转换的变量之前加上用括号括起来的目标类型。 <DIV CLASS="informalexample" ><P ></P ><A NAME="AEN3499" ></A ><TABLE BORDER="0" BGCOLOR="#E0E0E0" CELLPADDING="5" ><TR ><TD ><code><font color="#000000"> <font color="#0000BB"><?php<br />$foo </font><font color="#007700">= </font><font color="#0000BB">10</font><font color="#007700">; </font><font color="#FF8000">// $foo is an integer<br /></font><font color="#0000BB">$bar </font><font color="#007700">= (boolean) </font><font color="#0000BB">$foo</font><font color="#007700">; </font><font color="#FF8000">// $bar is a boolean<br /></font><font color="#0000BB">?></font> </font> </code></TD ></TR ></TABLE ><P ></P ></DIV > </P ><P > 允许的强制转换有: <P ></P ><UL ><LI ><P >(int),(integer) - 转换成整型</P ></LI ><LI ><P >(bool),(boolean) - 转换成布尔型</P ></LI ><LI ><P >(float),(double),(real) - 转换成浮点型</P ></LI ><LI ><P >(string) - 转换成字符串</P ></LI ><LI ><P >(array) - 转换成数组</P ></LI ><LI ><P >(object) - 转换成对象</P ></LI ></UL > </P ><P > 注意在括号内允许有空格和制表符,所以下面两个例子功能相同: <DIV CLASS="informalexample" ><P ></P ><A NAME="AEN3516" ></A ><TABLE BORDER="0" BGCOLOR="#E0E0E0" CELLPADDING="5" ><TR ><TD ><code><font color="#000000"> <font color="#0000BB"><?php<br />$foo </font><font color="#007700">= (int) </font><font color="#0000BB">$bar</font><font color="#007700">;<br /></font><font color="#0000BB">$foo </font><font color="#007700">= ( int ) </font><font color="#0000BB">$bar</font><font color="#007700">;<br /></font><font color="#0000BB">?></font> </font> </code></TD ></TR ></TABLE ><P ></P ></DIV > </P ><DIV CLASS="note" ><BLOCKQUOTE CLASS="note" ><P ><B >注意: </B > 为了将一个变量还原为字符串,还可以将变量放置在双引号中。 <DIV CLASS="informalexample" ><P ></P ><A NAME="AEN3520" ></A ><TABLE BORDER="0" BGCOLOR="#E0E0E0" CELLPADDING="5" ><TR ><TD ><code><font color="#000000"> <font color="#0000BB"><?php<br />$foo </font><font color="#007700">= </font><font color="#0000BB">10</font><font color="#007700">; </font><font color="#FF8000">// $foo is an integer<br /></font><font color="#0000BB">$str </font><font color="#007700">= </font><font color="#DD0000">"$foo"</font><font color="#007700">; </font><font color="#FF8000">// $str is a string<br /></font><font color="#0000BB">$fst </font><font color="#007700">= (string) </font><font color="#0000BB">$foo</font><font color="#007700">; </font><font color="#FF8000">// $fst is also a string<br /><br />// This prints out that "they are the same"<br /></font><font color="#007700">if (</font><font color="#0000BB">$fst </font><font color="#007700">=== </font><font color="#0000BB">$str</font><font color="#007700">) {<br /> echo </font><font color="#DD0000">"they are the same"</font><font color="#007700">;<br />}<br /></font><font color="#0000BB">?></font> </font> </code></TD ></TR ></TABLE ><P ></P ></DIV > </P ></BLOCKQUOTE ></DIV ><P > 当在某些类型之间强制转换时确切地会发生什么可能不是很明显。更多信息见如下小节: <P ></P ><UL ><LI ><P ><A HREF="language.types.boolean.html#language.types.boolean.casting" >转换为布尔值</A ></P ></LI ><LI ><P ><A HREF="language.types.integer.html#language.types.integer.casting" >转换为整型</A ></P ></LI ><LI ><P ><A HREF="language.types.float.html#language.types.float.casting" >转换为浮点型</A ></P ></LI ><LI ><P ><A HREF="language.types.string.html#language.types.string.casting" >转换为字符串</A ></P ></LI ><LI ><P ><A HREF="language.types.array.html#language.types.array.casting" >转换为数组</A ></P ></LI ><LI ><P ><A HREF="language.types.object.html#language.types.object.casting" >转换为对象</A ></P ></LI ><LI ><P ><A HREF="language.types.resource.html#language.types.resource.casting" >转换为资源</A ></P ></LI ><LI ><P > <A HREF="types.comparisons.html" >类型比较表</A > </P ></LI ></UL > </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.pseudo-types.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.variables.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.types.html" ACCESSKEY="U" >上一级</A ></TD ><TD WIDTH="33%" ALIGN="right" VALIGN="top" >变量</TD ></TR ></TABLE ></DIV ></BODY ></HTML >