1.四种标量类型(基本类型)
(1)boolean(布尔型)
最简单的类型,只能为TRUE或FALSE,两个都不区分大小写。要明确地将一个值转换成boolean,用(bool)或(boolean)来强制转换。但很多情况下不需要用强制转换,因为当运算符、函数或者流程控制结构需要一个 boolean参数时,该值会被自动转换。
当转换为 boolean 时,以下值被认为是 FALSE:
布尔值 FALSE 自身
整型值 0 (零)
浮点型值 0.0 (零)
空字符串, 以及 字符串 "0"
不包括任何元素的数组
不包括任何成员变量的对象(仅PHP 4.0 适用)
特殊类型 NULL (包括尚未设定的变量)
从没有任何标记(tags)的XML文档生成的SimpleXML对象
所有其它值都被认为是 TRUE(包括任何资源)。
(2)integer(整型)
整型值可以使用十进制,十六进制或八进制表示,前面可以加上可选的符号(-或者+)。八进制表示数字前必须加上0(零),十六进制表示数字前必须加上0x。
整型数的字长和平台有关,通常最大值是大约二十亿(32 位有符号)。PHP不支持无符号整数。Integer值的字长可以用常量PHP_INT_SIZE来表示,自PHP 4.4.0和PHP 5.0.5后,最大值可以用常量PHP_INT_MAX来表示。
如果给定的一个数超出了integer的范围,将会被解释为float。同样如果执行的运算结果超出了integer范围,
也会返回 float。 PHP 中没有整除的运算符,1/2 产生出 float 0.5,可以总是舍弃小数部分,或使用round()函数。
<?php $large_number = 2147483647; var_dump($large_number); // 输出为:int(2147483647) $large_number = 2147483648; var_dump($large_number); // 输出为:float(2147483648) $large_number = 50000 * $million; var_dump($large_number); // 输出: float(50000000000) ?>
<?php echo 'this is a simple string'; // 可以录入多行 echo 'You can also have embedded newlines in strings this way as it is okay to do'; // 输出: Arnold once said: "I'll be back" echo 'Arnold once said: "I\'ll be back"'; // 输出: You deleted C:\*.*? echo 'You deleted C:\\*.*?'; // 输出: You deleted C:\*.*? echo 'You deleted C:\*.*?'; // 输出: This will not expand: \n a newline echo 'This will not expand: \n a newline'; // 输出: Variables do not $expand $either echo 'Variables do not $expand $either'; ?>如果字符串是包围在双引号(")中, PHP将对一些特殊的字符进行解析。
<?php $str = <<<EOD Example of string spanning multiple lines using heredoc syntax. EOD; /* 含有变量的更复杂示例 */ class foo { var $foo; var $bar; function foo() { $this->foo = 'Foo'; $this->bar = array('Bar1', 'Bar2', 'Bar3'); } } $foo = new foo(); $name = 'MyName'; echo <<<EOT My name is "$name". I am printing some $foo->foo. Now, I am printing some {$foo->bar[1]}. This should print a capital 'A': \x41 EOT; ?>以上例程会输出:
My name is "MyName". I am printing some Foo. Now, I am printing some Bar2. This should print a capital 'A': A
Nowdoc结构:就象heredoc结构类似于双引号字符串,Nowdoc结构是类似于单引号字符串的。Nowdoc结构很象heredoc结构,但是 nowdoc不进行解析操作 。 这种结构很适合用在不需要进行转义的PHP代码和其它大段文本。与SGML的 <![CDATA[ ]]> 结构是用来声明大段的不用解析的文本类似,nowdoc结构也有相同的特征。
<?php $str = <<<'EOD' Example of string spanning multiple lines using nowdoc syntax. EOD; /* 含有变量的更复杂的示例 */ class foo { public $foo; public $bar; function foo() { $this->foo = 'Foo'; $this->bar = array('Bar1', 'Bar2', 'Bar3'); } } $foo = new foo(); $name = 'MyName'; echo <<<'EOT' My name is "$name". I am printing some $foo->foo. Now, I am printing some {$foo->bar[1]}. This should not print a capital 'A': \x41 EOT; ?>
以上例程会输出:
My name is "$name". I am printing some $foo->foo. Now, I am printing some {$foo->bar[1]}. This should not print a capital 'A': \x41
一个nowdoc结构也用和heredocs结构一样的标记 <<<, 但是跟在后面的标志符要用 单引号括起来,就像<<<'EOT'这样。heredocs结构的所有规则也同样适用于nowdoc结构,尤其是结束标志符的规则。
注意:变量解析
当字符串用双引号或heredoc结构定义时,其中的变量将会被解析。 这里共有两种语法规则:一种简单规则,一种复杂规则。简单的句法规则是最常用和最方便的,它可以用最少的代码在一个字符串中加入变量,数组 值,或对象属性。 复杂的句法规则是在PHP4以后加入的,被花括号包围的表达式是其明显标记。
简单句法规则:当PHP解析器遇到一个美元符号 ($) , 它会和其它很多解析器一样,去尽量形成一个合法的变量名。可以用花括 号来明确变量名的界线。
<?php $beer = 'Heineken'; echo "$beer's taste is great"; //有效;单引号"'"是非法的变量名组成元素 echo "He drank some $beers"; //无效;字母s是有效的变量名组成元素,但是这里的变量是$beer echo "He drank some ${beer}s"; // 有效 echo "He drank some {$beer}s"; // 有效 ?>复杂句法规则:复杂句法规则不是结构复杂而命名,而是因为它可以使用复杂的表达式。
<?php // 显示所有错误 error_reporting(E_ALL); $great = 'fantastic'; // 无效,输出:?This?is?{?fantastic} echo "This is { $great}"; // 有效,输出: This is fantastic echo "This is {$great}"; echo "This is ${great}"; // 有效 echo "This square is {$square->width}00 centimeters broad."; // 有效 echo "This works: {$arr[4][3]}"; // 这是错误的表达式,因为就象$foo[bar] 的格式不能在字符串以外的地方使用一样。 // 换句话说,只有在PHP能找到常量foo 的前提下才会正常工作;这里会产生一个E_NOTICE?(undefined?constant)级别的错误。 echo "This is wrong: {$arr[foo][3]}"; // 有效,当在字符串中使用多重数组时,一定要用括号将它括起来 echo "This works: {$arr['foo'][3]}"; // 有效 echo "This works: " . $arr['foo'][3]; echo "This works too: {$obj->values[3]->name}"; echo "This is the value of the var named $name: {${$name}}"; echo "This is the value of the var named by the return value of getName(): {${getName()}}"; echo "This is the value of the var named by the return value of \$object->getName(): {${$object->getName()}}"; // 无效,输出: This is the return value of getName(): {getName()} echo "This is the return value of getName(): {getName()}"; ?>存取和修改字符串中的字符:字符串中的字符可以通过一个以0为开始的,用类似数组结构中的方括号包含对应的数字来查找和修改,比如 $str[42], 可以把 字符串想像数组 。 函数 substr() 和 substr_replace()可以用来实现多于一个字符 的情况。
<?php // 取得字符串的第一个字符 $str = 'This is a test.'; $first = $str[0]; // 取得字符串的第三个字符 $third = $str[2]; // 取得字符串的最后一个字符 $str = 'This is still a test.'; $last = $str[strlen($str)-1]; // 修改字符串的最后一个字符 $str = 'Look at the sea'; $str[strlen($str)-1] = 'e'; ?>转换成字符串:一个值可以通过在其前面加上(string)或用strval()函数来转变成 字符串。在一个需要字符串的表达式中,字符串会自动转变,比如在使用函数 echo() 或 print() 时, 或在一个变量和一个字符串进行比较时,就会发生这种转变类型和类型转换。一个boolean TRUE 值被转换成 字符串"1"。 Boolean FALSE 被转换成"" (空的字符串), 这种转变可以在 boolean 和 字符串 之间往返进行,一个 整数或浮点数被转变为数字的字面样式的字符串(包括浮点数中的指数部分),使用指数计数法的浮点数(4.1E+6)也可转变。
(1)array (数组)
PHP 中的数组实际上是一个有序映射,映射是一种把 values关联到 keys 的类型。
key可以是integer或string。如果key是一个integer的标准表示,则被解释为整数(例如 "8" 将被解释为 8,而 "08" 将被解释为 "08"),key中的浮点数被取整为integer。在PHP中索引数组与关联数组是相同的,它们都可以同时包含整型和 字符串的下标。
值可以是任意的 PHP 类型。如果对给出的值没有指定键名,则取当前最大的整数索引值,而新的键名将是该值加一。如果指定的键名已经有了值,则该值会被覆盖。不能用数组和对象作为键(key),unset() 函数允许删除数组中的某个键。但要注意数组将不会重建索引。
使用 TRUE 作为键名将使 integer 1 成为键名。使用 FALSE 作为键名将使 integer 0 成为键名。使用 NULL 作为键名将等同于使用空字符串。使用空字符串作为键名将新建(或覆盖)一个用空字符串作为键名的值,这和用空的方括号不一样。
<?php // 创建一个简单的数组 $array = array(1, 2, 3, 4, 5); print_r($array); // 现在删除其中的所有元素,但保持数组本身不变: foreach ($array as $i => $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] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 5 ) Array ( ) Array ( [5] => 6 ) Array ( [0] => 6 [1] => 7 )