布尔类型
指定布尔值使用true或者false,不区分大小写.
要明确地将一个值转换成boolean,用(bool)或者(boolean)来强制转换,很多情况下不需要,因为当运算符,函数或者流程控制结构需要一个Boolean参数时,会被自动转换.
当转换Boolean时,以下值被认为是false:
布尔值false本身
整形0
浮点值0.0
空字符串,以及字符串”0”
不包括任何元素数组
特殊类型null,包括尚未赋值的变量
从从标记生成的simpleXML对象
所有其他值都被认为是true
<?phpvar_dump((bool) ""); // bool(false)var_dump((bool) 1); // bool(true)var_dump((bool) -2); // bool(true)var_dump((bool) "foo"); // bool(true)var_dump((bool) 2.3e5); // bool(true)var_dump((bool) array(12)); // bool(true)var_dump((bool) array()); // bool(false)var_dump((bool) "false"); // bool(true)?>
整形
整形可以使用十进制,十六进制,八进制或二进制,前边可以加可选符号(+,-)
八进制数字前加(0)
十六进制数字前加(0x)
二进制数字前加(ob)
<?php$a = 1234; // 十进制数$a = -123; // 负数$a = 0123; // 八进制数 (等于十进制 83)$a = 0x1A; // 十六进制数 (等于十进制 26)$a = 0b11111111; // 二进制数字 (等于十进制 255)?>
浮点型
以十进制能够精确表示的有理数如 0.1 或 0.7,无论有多少尾数都不能被内部所使用的二进制精确表示,因此不能在不丢失一点点精度的情况下转换为二进制的格式。这就会造成混乱的结果:例如,floor((0.1+0.7)*10) 通常会返回 7 而不是预期中的 8,因为该结果内部的表示其实是类似 7.9999999999999991118...。
如果确实需要更高的精度,应该使用任意精度数学函数或者 gmp 函数。
bcadd — 2个任意精度数字的加法计算
bccomp — 比较两个任意精度的数字
bcdiv — 2个任意精度的数字除法计算
bcmod — 对一个任意精度数字取模
bcmul — 2个任意精度数字乘法计算
bcpow — 任意精度数字的乘方
bcpowmod — Raise an arbitrary precision number to another, reduced by a specified modulus
bcscale — 设置所有bc数学函数的默认小数点保留位数
bcsqrt — 任意精度数字的二次方根
bcsub — 2个任意精度数字的减法
字符串
一个字符串可以用 4 种方式表达:
单引号
双引号
heredoc 语法结构
1:标识符的名称和变量名的要求一样.
2:heredoc的标识符,一定是独占一行,而且前面没有任何其他字符.
3:heredoc对文本的处理,和 双引号一样,即\r\n\t,变量,等,能解析出来.
在 PHP 5.3.0 以后,也可以用 Heredoc 结构来初始化静态变量和类的属性和常量:
<?php// 静态变量function foo(){ static $bar = <<<LABELNothing in here...LABEL;} echo <<<EOTMy name is "$name". I am printing some $foo->foo.Now, I am printing some {$foo->bar[1]}.This should print a capital 'A': \x41EOT;?>
nowdoc 语法结构(自 PHP 5.3.0 起)
nowdoc写法和heredoc一样,唯独在标识符两边用单引号包起来 ,
这样,大段文本的解析,就和单引号一样的效果.
不转义 \n \r \t,变量等等
<?phpecho <<<'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': \x41EOT;?>
当字符串用双引号或 heredoc 结构定义时,其中的变量将会被解析。
要表达一个单引号自身,需在它的前面加个反斜线(\)来转义。要表达一个反斜线自身,则用两个反斜线(\\)。其它任何方式的反斜线都会被当成反斜线本身:也就是说如果想使用其它转义序列例如 \r 或者 \n,并不代表任何特殊含义,就单纯是这两个字符本身。
如果字符串是包围在双引号(")中, PHP 将对一些特殊的字符进行解析:
\n 换行(ASCII 字符集中的 LF 或 0x0A (10))
\r 回车(ASCII 字符集中的 CR 或 0x0D (13))
\t 水平制表符(ASCII 字符集中的 HT 或 0x09 (9))
\v 垂直制表符(ASCII 字符集中的 VT 或 0x0B (11))(自 PHP 5.2.5 起)
\e Escape(ASCII 字符集中的 ESC 或 0x1B (27))(自 PHP 5.4.0 起)
\f 换页(ASCII 字符集中的 FF 或 0x0C (12))(自 PHP 5.2.5 起)
\\ 反斜线
\$ 美元标记
\" 双引号
\[0-7]{1,3} 符合该正则表达式序列的是一个以八进制方式来表达的字符
\x[0-9A-Fa-f]{1,2} 符合该正则表达式序列的是一个以十六进制方式来表达的字符
数组
它接受任意数量用逗号分隔的 键(key) => 值(value)对。
键(key)可是是一个整数 integer 或字符串 string
值(value)可以是任意类型的值
最后一个数组单元之后的逗号可以省略
自 5.4 起可以使用短数组定义语法,用 [] 替代 array()。
$array = [
"foo" => "bar",
"bar" => "foo",
];
数组定义中多个单元都使用了同一个键名,则只使用了最后一个,之前的都被覆盖
key 为可选项。如果未指定,PHP 将自动使用之前用过的最大 integer 键名加上 1 作为新的键名。
数组单元可以通过 array[key] 语法来访问。
自 PHP 5.4 起可以用直接对函数或方法调用的结果进行数组解引用,在此之前只能通过一个临时变量。
<?php
function getArray() {
return array(1, 2, 3);
}
// on PHP 5.4
$secondElement = getArray()[1];
?>
要删除某键值对,对其调用 unset() 函数
始终在用字符串表示的数组索引上加上引号 (错误写法:$foo[bar] 正确:$foo['bar'];)
用不着给键名为常量或变量的加上引号,否则会使 PHP 不能解析它们。($foo[$s])
PHP 也可以用已知常量($error_descriptions[E_ERROR] = "A fatal error has occured";)
重申一次,在双引号字符串中,不给索引加上引号是合法的因此 "$foo[bar]" 是合法的(“合法”的原文为 valid。在实际测试中,这么做确实可以访问数组的该元素,但是会报一个常量未定义的 notice。无论如何,强烈建议不要使用 $foo[bar]这样的写法,而要使用 $foo['bar'] 来访问数组中元素。--haohappy 注)。
转换数组
将 NULL 转换为 array 会得到一个空的数组
比较
可以用 array_diff() 和数组运算符来比较数组。
更多:
直接改变数组的值自 PHP 5 起可以通过引用传递来做到
可以用 count() 函数来数出数组中元素的个数。
因为数组中的值可以为任意值,也可是另一个数组。这样可以产生递归或多维数组。
数组(Array) 的赋值总是会涉及到值的拷贝。使用引用运算符通过引用来拷贝数组。
<?php
$arr3 = &$arr1;
$arr3[] = 4; // now $arr1 and $arr3 are the same
?>
对象和数组转化
把数组转化成任何你想要的对象类型的数组:
function array2object($array) { $aboutVideoArr = array(); if (is_array($array)) { foreach ($array as $value) { $video = new Video(); foreach ($value as $key => $val) { $video->$key = $val; } array_push($aboutVideoArr, $video); } } else { $video = $array; } return $aboutVideoArr; }
把对象转化成普通的数组:
function object2array($object) { if (is_object($object)) { foreach ($object as $key => $value) { $array[$key] = $value; } } else { $array = $object; } return $array;}
NULL
特殊的 NULL 值表示一个变量没有值。NULL 类型唯一可能的值就是 NULL。
被赋值为 NULL。
尚未被赋值。
被 unset()。
is_null() 和 unset()。
使用 (unset) $var 将一个变量转换为 null 将不会删除该变量或 unset 其值。仅是返回 NULL 值而已。
类型转换的判别
PHP 的自动类型转换的一个例子是乘法运算符“*”。如果任何一个操作数是float,则所有的操作数都被当成float,结果也是float。否则操作数会被解释为integer,结果也是integer。注意这并没有改变这些操作数本身的类型;改变的仅是这些操作数如何被求值以及表达式本身的类型。
允许的强制转换有:
(int), (integer) - 转换为整形 integer
(bool), (boolean) - 转换为布尔类型 boolean
(float), (double), (real) - 转换为浮点型 float
(string) - 转换为字符串 string
(array) - 转换为数组 array
(object) - 转换为对象 object
(unset) - 转换为 NULL (PHP 5)
在括号内允许有空格和制表符
以将变量放置在双引号中的方式来代替将变量转换成字符串:
<?php$foo = 10; // $foo 是一个整数$str = "$foo"; // $str 是一个字符串$fst = (string) $foo; // $fst 也是一个字符串 // 输出 "they are the same"if ($fst === $str) { echo "they are the same";}?>
数组序列化
较为复杂的数组转变为字符串方便存储操作
<?php$test = array("a"=>0,"b"=>0,"c"=>0); $test2 = ''; $test2=serialize($test); echo $test2; //类似a:3:{s:1:"a";i:0;s:1:"b";i:0;s:1:"c";i:0;} print_r(unserialize($test2)); ?>
类型比较
empty — 检查一个变量是否为空
以下的东西被认为是空的:
"" (空字符串)
0 (作为整数的0)
0.0 (作为浮点数的0)
"0" (作为字符串的0)
NULL
FALSE
array() (一个空数组)
$var; (一个声明了,但是没有值的变量)
is_null — 检测变量是否为 NULL
被赋值为 NULL。
尚未被赋值。
被 unset()
isset — 检测变量是否已设置并且非 NULL
变量未设置的时候为真
变量设置null的时候为真
详细可以参考php手册类型比较表