1、PHP 5 手册章 5. 基本语法目录从 HTML 中分离指令分隔符注释 php 学习 从 HTML 中分离PHP 的脚本由文件中一对特殊的标记所引起的内容,当解释器分析一个文件时,所有特殊标记外的普通文件,解释器不对其做任何处理,而特殊标记内文件将作为 PHP 代码被解释器分析执行。该运行机制将允许您在 HTML 中嵌入 PHP 代码:PHP 标记外的内容将被完全独立开,不做任何处理,而内部的将作为 PHP 代码解析。用来标记 PHP 代码块的标记共有四套,其中只有两套总是有效( 和 . . .) ;另外两套可以在 php.ini 配置文件中开启或者关闭。虽然短格式的标记和 ASP 风格的标
2、记可能比较省力,但是某些情况下您可能必须要使用长格式的标记。比如,您打算在 XML 或者 XHTML 中嵌入 PHP 代码,您将需要使用 形式的标记以适应 XML 的标准。PHP 支持的标记为: 例子 5-1. 从 HTML 中分离的方式1. 2. This is a shortcut for “3. echo (“some editors (like FrontPage) dontlike processing instructions“);4. 优先选用的方式为第一种方式 ,因为它允许您在 XML 结构,如 XHTML 的代码中使用 PHP。第二种方式并非总是可用的。只有当您在 php.i
3、ni 配置文件中激活 short_open_tag 选项,才是可用的。您也可以通过使用 short_tags() 函数(仅用于 PHP 3) ,或者使用 -enable-short-tags 选项 configure PHP 来激活短格式标记。在 php.ini-dist 配置文件中,默认是开启短格式标记的,但是建议您不要使用该标记。在 PHP 配置文件中开启选项 asp_tags 将激活第四种方式。注: ASP 风格的标记添加于 PHP 3.0.4注: 当开发大型应用程序或者用于分发的函数库,或者在不受您控制的 PHP 服务器上面开发程序时,请不要使用短格式的标记,因为目标服务器可能并不支持
4、短格式的标记。为了便于移植,请保证用于再分发的代码中不使用短格式的标记。PHP 代码块结束标记奖自动包含最近的一个结尾的新行(如果存在的话) 。而且,结束标记自动隐含一个分号; 您不需要为 PHP 代码块的最后行追加一个分号。PHP 允许您使用如下的结构: php 学习 例子 5-2. 更高级的脱离This is true.This is false.PHP 将直接输出结束标记和下一个开始标记中的任何非 PHP 代码。当需要输出大量的文本时,退出 PHP 解析模式将比使用 echo() 或者 print() 或者此类的函数打印所有文本要更加的有效。指令分隔符指令分隔方式与 C 或者 Perl
5、类似 - 每个语句由分号格开。结束标记(?)同样隐含语句的结束,因此下面的代码是等价的: 注释PHP 支持 C, C+ 和 Unix Shell 风格的注释。例如: “单行”注释仅仅注释到行末或者当前的 PHP 代码块,视乎哪个首先出现。 This is an example.The header above will say This is an example. 小心不要嵌套 C 风格的注释,当注释大量代码时,可能犯该错误。 “单行”注释仅仅注释到行末或者当前的 PHP 代码块,视乎哪个首先出现。这意味着 / ? 后面的 HTML 代码将被打印出来:? 跳出了 PHP 模式并且返回 HTM
6、L 模式,而且 / 注释符并不会影响到模式的转换。章 6. 类型目录介绍布尔型整型浮点型字符串数组对象资源NULL本文档中使用的伪类型类型戏法介绍PHP 支持八种原始类型。四种标量类型:布尔型(boolean)整型(integer)浮点型(float ) (浮点数,也作“double”)字符串(string)两种复合类型:数组(array)对象(object)最后是两种特殊类型:资源(resource )NULL为了确保代码的易读性,本手册还介绍了一些伪类型:混和(mixed )数字(number)回馈(callback)您可能还会读到一些关于“双精度(double) ”类型的参考。实际上 d
7、ouble 和 float 是相同的,由于一些历史的原因,这两个名称同时存在。变量的类型通常不是由程序员设定的,确切地说,是由 PHP 根据该变量使用的上下文在运行时决定的。注: 如果你想查看某个表达式的值和类型,用 var_dump()。注: 如果你只是想得到一个易读懂的类型的表达方式用于调试,用 gettype()。要查看某个类型,不要用 gettype(),而用 is_type 函数。以下是一些范例: 如果你要将一个变量强制转换为某类型,可以对其使用强制转换或者 settype() 函数。注意变量根据其当时的类型在特定场合下会表现出不同的值。更多信息见类型戏法。此外,你还可以参考 PHP
8、 类型比较表看不同类型相互比较的例子。布尔型这是最简单的类型。boolean 表达了真值,可以为 TRUE 或 FALSE。注: 布尔类型是 PHP 4 引进的。语法要指定一个布尔值,使用关键字 TRUE 或 FALSE。两个都是大小写不敏感的。 通常你用某些运算符返回 boolean 值,并将其传递给流程控制。 / = is an operator which test/ equality and returns a booleanif ($action = “show_version“) echo “The version is 1.23“;/ this is not necessary.
9、if ($show_separators = TRUE) echo “n“;/ .because you can simply typeif ($show_separators) echo “n“; 转换为布尔值要明示地将一个值转换成 boolean,用 (bool) 或者 (boolean) 来强制转换。但是很多情况下不需要用强制转换,因为当运算符,函数或者流程控制需要一个 boolean 参数时,该值会被自动转换。 php 学习 参见类型戏法。当转换为 boolean 时,以下值被认为是 FALSE:布尔值 FALSE整型值 0(零)浮点型值 0.0(零)空白字符串和字符串 “0“没有成员
10、变量的数组没有单元的对象特殊类型 NULL(包括尚未设定的变量)所有其它值都被认为是 TRUE(包括任何资源) 。 警告-1 和其它非零值(不论正负)一样,被认为是 TRUE! 整型一个 integer 是集合 Z = ., -2, -1, 0, 1, 2, . 中的一个数。参见 任意长度整数 / GMP,浮点数 和 任意精度数学库 / BCMath。语法整型值可以用十进制,十六进制或八进制符号指定,前面可以加上可选的符号(- 或者 +) 。如果用八进制符号,数字前必须加上 0(零) ,用十六进制符号数字前必须加上 0x。 例子 6-1. 整数文字表达在字面上,整型变量正式的结构可以为: 整型
11、数的字长和平台有关,尽管通常最大值是大约二十亿(32 位有符号) 。PHP 不支持无符号整数。整数溢出如果你指定一个数超出了 integer 的范围,将会被解释为 float。同样如果你执行的运算结果超出了 integer 范围,也会返回 float。 警告不幸的是 PHP 中有个 bug,因此当有负数参与时结果并不总是正确。例如当运算 -50000 * $million 时结果是 -429496728。不过当两个运算数都是正数时就没问题。这个问题已经在 PHP 4.1.0 中解决了。 PHP 中没有整除的运算符。 1/2 产生出浮点数 0.5。您可以总是舍弃小数部分,或者使用 round()
12、 函数。 转换为整形要明示地将一个值转换为 integer,用 (int) 或 (integer) 强制转换。不过大多数情况下都不需要强制转换,因为当运算符,函数或流程控制需要一个 integer 参数时,值会自动转换。您还可以通过函数 intval() 来将一个值转换成整型。参见类型戏法。从布尔值转换FALSE 将产生出 0(零) ,TRUE 将产生出 1(壹) 。从浮点数转换当从浮点数转换成整数时,数字将被取整(丢弃小数位) 。如果浮点数超出了整数范围(通常为 +/- 2.15e+9 = 231) ,则结果不确定,因为没有足够的精度使浮点数给出一个确切的整数结果。在此情况下没有警告,甚至没
13、有任何通知! php 学习 (译者注:)在 Linux 下返回结果是最小负数(-2147483648) ,而在 Windows 下返回结果是零(0) 。 警告决不要将未知的分数强制转换为 integer,这样有时会导致意外的结果。 更多信息见浮点数精度。 从字符串转换参见字符串转换为数字。从其它类型转换注意没有定义从其它类型转换为整型的行为。目前的行为和值先转换为布尔值一样。不过不要依靠此行为,因为它会未加通知地改变浮点型浮点数(也叫“floats” , “doubles”或“real numbers”)可以用以下任何语法定义: 形式上: LNUM 0-9+DNUM (0-9*.LNUM) |
14、 (LNUM.0-9*)EXPONENT_DNUM ( (LNUM | DNUM) eE+-? LNUM) 浮点数的字长和平台相关,尽管通常最大值是 1.8e308 并具有 14 位十进制数字的精度(64 位 IEEE 格式) 。 浮点数精度显然简单的十进制分数如同 0.1 或 0.7 不能在不丢失一点点精度的情况下转换为内部二进制的格式。这就会造成混乱的结果:例如,floor(0.1+0.7)*10) 通常会返回 7 而不是预期中的 8,因为该结果内部的表示其实是类似 7.9999999999.。这和一个事实有关,那就是不可能精确的用有限位数表达某些十进制分数。例如,十进制的 1/3 变成了
15、 0.3333333. . .。所以永远不要相信浮点数结果精确到了最后一位,也永远不要比较两个浮点数是否相等。如果确实需要更高的精度,应该使用任意精度数学函数库或者 gmp 函数库。 转换为浮点数如果您希望了解有关何时和如何将字符串转换成浮点数的信息,请查阅标题为“将字符串转换为数字”的有关章节。对于其它类型的值,其情况类似于先将值转换成整型,然后再转换成浮点。请参阅“转换为整型”有关章节以获取更多信息。字符串string 是一系列字符。在 PHP 中,字符和字节一样,也就是说,一共有 256 种不同字符的可能性。这也暗示 PHP 对 Unicode 没有本地支持。请参阅函数 utf8_enc
16、ode() 和 utf8_decode() 以了解有关 Unicode 支持。注: 一个字符串变得非常巨大也没有问题, PHP 没有给字符串的大小强加实现范围,所以完全没有理由担心长字符串。语法字符串可以用三种字面上的方法定义。单引号双引号定界符单引号指定一个简单字符串的最简单的方法是用单引号(字符 )括起来。要表示一个单引号,需要用反斜线()转义,和很多其它语言一样。如果在单引号之前或字符串结尾需要出现一个反斜线,需要用两个反斜线表示。注意如果你试图转义任何其它字符,反斜线本身也会被显示出来!所以通常不需要转义反斜线本身。注: 在 PHP 3 中,此情况下将发出一个 E_NOTICE 级的警
17、告。注: 和其他两种语法不同,单引号字符串中出现的变量和转义序列不会被变量的值替代。 双引号如果用双引号(“)括起字符串, PHP 懂得更多特殊字符的转义序列:表格 6-1. 转义字符序列 含义n 换行(LF 或 ASCII 字符 0x0A(10) )r 回车(CR 或 ASCII 字符 0x0D(13) )t 水平制表符(HT 或 ASCII 字符 0x09(9) ) 反斜线$ 美元符号“ 双引号0-71,3 此正则表达式序列匹配一个用八进制符号表示的字符 x0-9A-Fa-f1,2 此正则表达式序列匹配一个用十六进制符号表示的字符 此外,如果试图转义任何其它字符,反斜线本身也会被显示出来!
18、双引号字符串最重要的一点是其中的变量名会被变量值替代。细节参见字符串解析。定界符另一种给字符串定界的方法使用定界符语法(“foo = Foo;$this-bar = array(Bar1, Bar2, Bar3);$foo = new foo();$name = MyName;echo foo.Now, I am printing some $foo-bar1.This should print a capital A: x41EOT;? 注: 定界符支持是 PHP 4 中加入的。变量解析当用双引号或者定界符指定字符串时,其中的变量会被解析。有两种语法,一种简单的和一种复杂的。简单语法最通用和
19、方便,它提供了解析变量,数组值,或者对象属性的方法。复杂语法是 PHP 4 引进的,可以用花括号括起一个表达式。简单语法如果遇到美元符号($) ,解析器会尽可能多地取得后面的字符以组成一个合法的变量名。如果你想明示指定名字的结束,用花括号把变量名括起来。 同样也可以解析数组索引或者对象属性。对于数组索引,右方括号()标志着索引的结束。对象属性则和简单变量适用同样的规则,尽管对于对象属性没有像变量那样的小技巧。 php 学习 red, banana = yellow);/ Works but note that this works differently outside string-quot
20、esecho “A banana is $fruitsbanana.“;/ Worksecho “A banana is $fruitsbanana.“;/ Works but PHP looks for a constant named banana first/ as described below.echo “A banana is $fruitsbanana.“;/ Wont work, use braces. This results in a parse error.echo “A banana is $fruitsbanana.“;/ Worksecho “A banana is
21、 “ . $fruitsbanana . “.“;/ Worksecho “This square is $square-width meters broad.“;/ Wont work. For a solution, see the complex syntax.echo “This square is $square-width00 centimeters broad.“;? 对于任何更复杂的情况,应该使用复杂语法。复杂(花括号)语法不是因为语法复杂而称其为复杂,而是因为用此方法可以包含复杂的表达式。事实上,用此语法你可以在字符串中包含任何在名字空间的值。仅仅用和在字符串之外同样的方法写
22、一个表达式,然后用 和 把它包含进来。因为不能转义“” ,此语法仅在 $ 紧跟在 后面时被识别(用“$”或者“$”来得到一个字面上的“$”) 。用一些例子可以更清晰:width00 centimeters broad.“;/ Worksecho “This works: $arr43“;/ This is wrong for the same reason as $foobar is wrong/ outside a string. In otherwords, it will still work but/ because PHP first looks for a constant nam
23、ed foo, it will/ throw an error of level E_NOTICE (undefined constant).echo “This is wrong: $arrfoo3“;/ Works. When using multi-dimensional arrays, always use/ braces around arrays when inside of stringsecho “This works: $arrfoo3“;/ Works.echo “This works: “ . $arrfoo3;echo “You can even write $obj-
24、values3-name“;echo “This is the value of the var named $name: $name“;? 访问字符串中的字符字符串中的字符可以通过在字符串之后用花括号指定所要字符从零开始的偏移量来访问。注: 为了向下兼容,仍然可以用方括号。不过此语法在 PHP 4 中不赞成使用。 例子 6-3. 一些字符串例子实用函数及操作符字符串可以用“.”(点)运算符连接。注意这里不能用“+”(加)运算符。更多信息参见字符串运算符。有很多实用函数来改变字符串。 php 学习 普通函数见字符串函数库一节,高级搜索和替换见正则表达式函数(两种口味:Perl 和 POSIX
25、扩展) 。还有 URL 字符串函数,以及加密解密字符串的函数(mcrypt 和 mhash) 。最后,如果还是找不到你要的函数,参见字符类型函数库。字符串转换您可以用 (string) 标记或者 strval() 函数将一个值转换为字符串。当某表达式需要字符串时,字符串的转换会在表达式范围内自动完成。例如当你使用 echo() 或者 print() 函数时,或者将一个变量值与一个字符串进行比较的时候。阅读手册中有关类型和类型戏法中的部分有助于更清楚一些。参见 settype()。布尔值 TRUE 将被转换为字符串 “1“,而值 FALSE 将被表示为 “(即空字符串) 。这样您就可以随意地在布
26、尔值和字符串之间进行比较。整数或浮点数数值在转换成字符串时,字符串即为表示这些数值数字(浮点数还包含有指数部分) 。数组将被转换成字符串 “Array“,因此您无法通过 echo() 或者 print() 函数来输出数组的内容。请参考下文以获取更多提示。对象将被转换成字符串 “Object“。如果您因为调试需要,需要将对象的成员变量打印出来,请阅读下文。如果您希望得到该对象所依附的类的名称,请使用函数 get_class()。资源类型将会以 “Resource id #1“ 的格式被转换成字符串,其中 1 是 PHP 在运行时给资源指定的唯一标识。如果您希望获取资源的类型,请使用函数 get_
27、resource_type().NULL 将被转换成空字符串。正如以上所示,将数组、对象或者资源打印出来,并不能给您提供任何关于这些值本身的有用的信息。请参阅函数 print_r() 和 var_dump(),对于调试来说,这些是更好的打印值的方法。您可以将 PHP 的值转换为字符串以永久地储存它们。这种方法被称为串行化,您可以用函数 serialize() 来完成该操作。如果您在安装 PHP 时建立了 WDDX 支持,您还可以将 PHP 的值串行化为 XML 结构。字符串转换为数值当一个字符串被当作数字来求值时,根据以下规则来决定结果的类型和值。如果包括“.”, “e”或“E”其中任何一个字
28、符的话,字符串被当作 float 来求值。否则就被当作整数。该值由字符串最前面的部分决定。如果字符串以合法的数字数据开始,就用该数字作为其值,否则其值为 0(零) 。合法数字数据由可选的正负号开始,后面跟着一个或多个数字(可选地包括十进制分数) ,后面跟着可选的指数。指数是一个“e”或者“E”后面跟着一个或多个数字。 此转换的更多信息见 Unix 手册中关于 strtod(3) 的部分。如果你想测试本节中的任何例子,可以拷贝和粘贴这些例子并且加上下面这一行自己看看会发生什么: n“;? 不要指望在将一个字符转换成整型时能够得到该字符的编码(您可能也会在 C 中这么做) 。如果您希望在字符编码和
29、字符之间转换,请使用 ord() 和 chr() 函数。数组PHP 中的数组实际上是一个有序图。图是一种把 values 映射到 keys 的类型。此类型在很多方面做了优化,因此你可以把它当成真正的数组来使用,或列表(矢量) ,散列表(是图的一种实现) ,字典,集合,栈,队列以及更多可能性。因为可以用另一个 PHP 数组作为值,也可以很容易地模拟树。解释这些结构超出了本手册的范围,但对于每种结构你至少会发现一个例子。要得到这些结构的更多信息,我们建议你参考有关此广阔主题的外部著作。语法定义 array()可以用 array() 语言结构来新建一个 array。它接受一定数量用逗号分隔的 key
30、 = value 参数对。 array( key =value, .)/ key 可以是 integer 或者 string/ value 可以是任何值“bar“, 12 = true);echo $arr“foo“; / barecho $arr12; / 1? key 可以是 integer 或者 string。如果键名是一个 integer 的标准表达方法,则被解释为整数(例如 “8“ 将被解释为 8,而 “08“ 将被解释为 “08“) 。PHP 中数组下标的变量类型不会对数组造成影响,数组的类型只有一种,它可以同时包含整型和字符串型的下标。值可以是任何值。 array(6 = 5,
31、13 = 9, “a“ = 42);echo $arr“somearray“6; / 5echo $arr“somearray“13; / 9echo $arr“somearray“a“; / 42? 如果对给出的值没有指定键名,则取当前最大的整数索引值,而新的键名将是该值加一。如果你指定的键名已经有了值,则该值会被覆盖。 43, 32, 56, “b“ = 12);/ .this arrayarray(5 = 43, 6 = 32, 7 = 56, “b“ = 12);? 警告自 PHP 4.3.0 起,上述的索引生成方法改变了。如今如果你给一个当前最大键名是负值的数组添加一个新值,则新生成
32、的的索引将为零(0)。以前新生成的索引为当前最大索引加一,和正值的索引相同。 使用 TRUE 作为键名将使 integer 1 成为键名。使用 FALSE 作为键名将使 integer 0 成为键名。使用 NULL 作为键名将等同于使用空字符串。使用空字符串作为键名将新建(或覆盖)一个用空字符串作为键名的值,这和用空的方括号不一样。不能用数组和对象作为键名。这样做会导致一个警告:Illegal offset type。用方括号的语法新建修改可以通过明示地设定值来改变一个现有的数组。这是通过在方括号内指定键名来给数组赋值实现的。也可以省略键名,在这种情况下给变量名加上一对空的方括号(“”) 。
33、php 学习 $arrkey = value;$arr = value;/ key 可以是 integer 或者 string/ value 可以为任何值。如果 $arr 还不存在,将会新建一个。这也是一种定义数组的替换方法。要改变一个值,只要给它赋一个新值。如果要删除一个键名值对,要对它用 unset()。 1, 12 = 2);$arr = 56; / This is the same as $arr13 = 56;/ at this point of the script$arr“x“ = 42; / This adds a new element to/ the array with
34、key “x“unset($arr5); / This removes the element from the arrayunset($arr); / This deletes the whole array? 注: 如上所述,如果你给出方括号但没有指定键名,则取当前最大整数索引值,新的键名将是该值 + 1。如果当前还没有整数索引,则键名将为 0。如果制定的键名已经有值了,该值将被覆盖。 警告自 PHP 4.3.0 起,上述的索引生成方法改变了。如今如果你给一个当前最大键名是负值的数组添加一个新值,则新生成的的索引将为零(0)。以前新生成的索引为当前最大索引加一,和正值的索引相同。 注意这里
35、所使用的最大整数键名不一定当前就在数组中。它只要在上次数组重新生成索引后曾经存在过就行了。以下例子说明了: $value) unset($array$i);print_r($array);/ 添加一个单元(注意新的键名是 5,而不是你可能以为的 0)$array = 6;print_r($array);/ 重新索引:$array = array_values($array);$array = 7;print_r($array);? 以上例子将产生如下输出: Array(0 = 11 = 22 = 33 = 44 = 5)Array()Array(5 = 6)Array(0 = 61 = 7)实
36、用函数有相当多的实用函数作用于数组,参见数组函数库一节。注: unset() 函数允许取消一个数组中的键名。要注意数组将不会重建索引。 one, 2 = two, 3 = three );unset( $a2 );/* 将产生一个数组,定义为$a = array( 1=one, 3=three);而不是$a = array( 1 = one, 2 = three);*/$b = array_values($a);/ Now b is array(1 = one, 2 =three)? foreach 控制结构是专门用于数组的。它提供了一个简单的方法来遍历数组。数组做什么和不做什么为什么 $fo
37、obar 错了?应该始终在用字符串表示的数组索引上加上引号。例如用 $foobar 而不是 $foobar。但是为什么 $foobar 错了呢?你可能在老的脚本中见过如下语法: 这样是错的,但可以正常运行。那么为什么错了呢?原因是此代码中有一个未定义的常量(bar)而不是字符串(bar注意引号) ,而 PHP 可能会在以后定义此常量,不幸的是你的代码中有同样的名字。它能运行,是因为 PHP 自动将裸字符串(没有引号的字符串且不对应于任何已知符号)转换成一个其值为该裸字符串的正常字符串。例如,如果没有常量定义为 bar,PHP 将把它替代为 bar 并使用之。注: 这并不意味着总是给键名加上引号
38、。用不着给键名为常量 或 变量 的加上引号,否则会使 PHP 不能解析它们。 注: 上面例子输出为: Checking 0:Notice: Undefined index: $i in /path/to/script.html on line 9Bad:Good: 1Notice: Undefined index: $i in /path/to/script.html on line 11Bad:Good: 1Checking 1:Notice: Undefined index: $i in /path/to/script.html on line 9Bad:Good: 2Notice: Un
39、defined index: $i in /path/to/script.html on line 11Bad:Good: 2演示此效应的更多例子: apple, veggie = carrot);/ 正确print $arrfruit; / appleprint $arrveggie; / carrot/ 不正确。 This works but also throws a PHP error of/ level E_NOTICE because of an undefined constant named fruit/ Notice: Use of undefined constant fr
40、uit - assumed fruit in.print $arrfruit; / apple/ Lets define a constant to demonstrate whats going on. We/ will assign value veggie to a constant named fruit.define(fruit,veggie);/ Notice the difference nowprint $arrfruit; / appleprint $arrfruit; / carrot/ The following is okay as its inside a strin
41、g. Constants are not/ looked for within strings so no E_NOTICE error hereprint “Hello $arrfruit“; / Hello apple/ With one exception, braces surrounding arrays within strings/ allows constants to be looked forprint “Hello $arrfruit“; / Hello carrotprint “Hello $arrfruit“; / Hello apple/ This will not
42、 work, results in a parse error such as:/ Parse error: parse error, expecting T_STRING or T_VARIABLE or T_NUM_STRING/ This of course applies to using autoglobals in strings as wellprint “Hello $arrfruit“;print “Hello $_GETfoo“;/ Concatenation is another optionprint “Hello “ . $arrfruit; / Hello appl
43、e? 当打开 error_reporting() 来显示 E_NOTICE 级别的错误(例如将其设为 E_ALL)时将看到这些错误。默认情况下 error_reporting 被关闭不显示这些。和在语法一节中规定的一样,在方括号(“”和“”)之间必须有一个表达式。这意味着你可以这样写: 这是一个用函数返回值作为数组索引的例子。PHP 也可以用已知常量,你可能之前已经见过 E_*。 注意 E_ERROR 也是个合法的标识符,就和第一个例子中的 bar 一样。但是上一个例子实际上和如下写法是一样的: 因为 E_ERROR 等于 1,等等。如同我们在以上例子中解释的那样,$foobar 起作用但其实
44、是错误的。它起作用是因为根据语法的预期,bar 被当成了一个常量表达式。然而,在这个例子中不存在名为 bar 的常量。PHP 就假定你指的是字面上的 bar,也就是字符串 “bar“,但你忘记写引号了。那么为什么这样做不好?在未来的某一时刻,PHP 开发小组可能会想新增一个常量或者关键字,或者您可能希望在以后在您的程序中引入新的常量,那你就有麻烦了。例如你已经不能这样用 empty 和 default 这两个词了,因为他们是保留字。注: 重申一次,在双引号字符串中,不给索引加上引号是合法的因此 “$foobar“是合法的。至于为什么参见以上的例子和字符串中的变量解析中的解释。转换为数组对于任何
45、的类型:整型、浮点、字符串、布尔和资源,如果您将一个值转换为数组,您将得到一个仅有一个元素的数组(其下标为 0) ,该元素即为此标量的值。如果您将一个对象转换成一个数组,您所得到的数组的元素为该对象的属性(成员变量) ,其键名为成员变量名。如果您将一个 NULL 值转换成数组,您将得到一个空数组。例子 php 学习 PHP 中的数组类型有非常多的用途,因此这里有一些例子展示数组的完整威力。 red,taste = sweet,shape = round,name = apple,4 / key will be 0);/ is completely equivalent with$acolor
46、= red;$ataste = sweet;$ashape = round;$aname = apple;$a = 4; / key will be 0$b = a;$b = b;$b = c;/ will result in the array array(0 = a , 1 = b , 2 = c),/ or simply array(a, b, c)? 例子 6-4. 使用 array()4,OS = Linux,lang = english,short_tags = true);/ strictly numerical keys$array = array( 7,8,0,156,-10
47、);/ this is the same as array(0 = 7, 1 = 8, .)$switching = array( 10, / key = 05 =6,3 =7,a =4,11, / key = 6 (maximum of integer-indices was 5)8 =2, / key = 8 (integer!)02 = 77, / key = 020 = 12 / the value 10 will be overwritten by 12);/ empty array$empty = array();? 例子 6-5. 集合注意目前不可能在这样一个循环中直接改变数组的值。可以改变的例子如下: 例子 6-6. 集合$color) / wont work:/$color = strtoupper($color);/works:$colors$key = strtoupper($color);print_r($colors);/* output:Array(0 = RED1 = BLUE2 = GREEN3 = YELLOW)*/? 本例产生一个基于一的数组。 例子 6