当转换为 boolean 时,如下值被认为是 FALSE:
布尔值 FALSE
自己
整型值 0
(零)
浮点型值 0.0
(零)
空字符串''
,以及字符串 "0"
不包括任何元素的数组[]
特殊类型 NULL
(包括还没有赋值的变量)
从空标记生成的 SimpleXML 对象
php
全部其它值都被认为是 TRUE(包括任何资源 和 NAN)。正则表达式
<?php // Consider that the 0 could by any parameters including itself var_dump(0 == 1); // false var_dump(0 == (bool)'all'); // false var_dump(0 == 'all'); // TRUE, take care var_dump(0 === 'all'); // false // To avoid this behavior, you need to cast your parameter as string like that : var_dump((string)0 == 'all'); // false ?>
<?php $a = 1234; // 十进制数 $a = -123; // 负数 $a = 0123; // 八进制数 (等于十进制 83) $a = 0x1A; // 十六进制数 (等于十进制 26) $a = 0b11111111; // 二进制数字 (等于十进制 255)//php5.4开始 ?>
注意类型转换:api
<?php //当从浮点数转换成整数时,将向下取整。 $w = (int)1.7;// 1 //字符串转换 $x = 0123;// 83 $y = "0123" + 0;// 123 $z = '0x12' + 0;//0 $aa = '0b101' + 0;//0 $bb = (int)'0123';//123 $cc = (int)'0x123';//0 $dd = (int)'0b1011';//0 ?>
若是给定的一个数超出了 integer 的范围,将会被解释为 float。一样若是执行的运算结果超出了 integer 范围,也会返回 float。
Example #2 32 位系统下的整数溢出数组
<?php $large_number = 2147483647; var_dump($large_number); // int(2147483647) $large_number = 2147483648; var_dump($large_number); // float(2147483648) $million = 1000000; $large_number = 50000 * $million; var_dump($large_number); // float(50000000000) ?>
Example #3 64 位系统下的整数溢出安全
<?php $large_number = 9223372036854775807; var_dump($large_number); // int(9223372036854775807) $large_number = 9223372036854775808; var_dump($large_number); // float(9.2233720368548E+18) $million = 1000000; $large_number = 50000000000000 * $million; var_dump($large_number); // float(5.0E+19) ?>
(也叫浮点数 float,双精度数 double 或实数 real)能够用如下任一语法定义:app
<?php $a = 1.234; $b = 1.2e3; $c = 7E-10; ?>
浮点数的精度有限。
floor((0.1+0.7)*10) 一般会返回 7 而不是预期中的 8,由于该结果内部的表示实际上是相似
7.9999999999999991118...。
因此永远不要相信浮点数结果精确到了最后一位,也永远不要比较两个浮点数是否相等
$a 和 $b 在小数点后五位精度内都是相等的。ide
<?php $a = 8 - 6.4; // which is equal to 1.6 $b = 1.6; var_dump($a == $b); // is not true //This happens probably because $a is not really 1.6, but 1.599999.. $epsilon = 0.00001; if(abs($a-$b) < $epsilon) { echo "true"; } ?>
只转义\
函数
<?php // 输出: Arnold once said: "I'll be back" echo 'Arnold once said: "I\'ll be back"'; // 输出: You deleted C:\*.*? echo 'You deleted C:\\*.*?'; ?>
正则用双引号优化
\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} 符合该正则表达式序列的是一个以十六进制方式来表达的字符
双引号示例:this
<?php $great = 'fantastic'; //输出: This is {$great} echo "This is {\$great}"; // 无效,输出: This is { fantastic} echo "This is { $great}"; // 有效,输出: This is fantastic echo "This is {$great}"; echo "This is ${great}"; 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()}}"; // 有效,输出: I'd like an A & W echo "I'd like an {${beers::softdrink}}\n"; // 也有效,输出: I'd like an Alexander Keith's echo "I'd like an {${beers::$ale}}\n"; ?>
没有使用双引号的双引号字符串
Warning
要注意的是结束标识符这行除了可能有一个分号(;)外,绝对不能包含其它字符。这意味着 标识符不能缩进,分号的先后也不能有任何空白或制表符。更重要的是结束标识符的前面必须是个被本地 操做系统承认的换行,好比在 UNIX 和 Mac OS X 系统中是 n,而结束定界符(可能其后有个分号)以后也必须紧跟一个换行。若是不遵照该规则致使结束标识不“干净”,PHP 将认为它不是结束标识符而继续寻找。若是在文件结束前也没有找到一个正确的结束标识符,PHP 将会在最后一行产生一个解析错误。
Heredocs 结构不能用来初始化类的属性。自 PHP 5.3 起,此限制仅对 heredoc 包含变量时有效。
<?php $str = <<<EOD Example of string spanning multiple lines using heredoc syntax. EOD; 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; This does not: foo(<<<END abcd END; ); // syntax error, unexpected ';' //Without semicolon, it works fine: foo(<<<END abcd END ); ?>
单引号字符串
<?php //不能使用hereDoc class foo { public $bar = <<<'EOT' bar EOT; } ?>
用 超出字符串长度的下标写入将会拉长该字符串并以空格填充。 非整数类型下标会被转换成整数。 非法下标类型会产生一个 E_NOTICE 级别错误。用 负数下标写入字符串时会产生一个 E_NOTICE
级别错误,用 负数下标读取字符串时返回空字符串。写入时只用到了赋值字符串的第一个字符。用 空字符串赋值则赋给的值是 NULL 字符。PHP 的字符串在内部是字节组成的数组。所以用花括号访问或修改字符串对多字节字符集很不安全。仅应对单字节编码例如 ISO-8859-1 的字符串进行此类操做。
<?php // 取得字符串的第一个字符 $str = 'This is a test.'; $first = $str[0]; $first = $str{2}; //错误Fatal Error:Cannot create references to/from string offsets nor overloaded objects $first = &$str[0]; // 取得字符串的最后一个字符 $str = 'This is still a test.'; $last = $str[strlen($str)-1]; // 修改字符串的最后一个字符 $str = 'Look at the sea'; $str[strlen($str)-1] = 'e'; ?>
Note:
自 PHP 5.4 起字符串下标必须为 整数或可转换为整数的字符串,不然会发出警告。以前例如 "foo" 的下标会无声地转换成 0。
PHP 5.5 增长了直接在字符串原型中用 [] 或 {} 访问字符的支持。
1.一个值能够经过在其前面加上 (string)
或用 strval()
函数来转变成字符串
2.一个布尔值 boolean 的 TRUE 被转换成 string 的 "1"
。Boolean 的 FALSE 被转换成 ""
(空字符串)
3.数组 array 老是转换成字符串 "Array"
4.在 PHP 4 中对象 object 老是被转换成字符串 "Object"
,PHP 5 起,适当时能够用 __toString 方法。
5.资源 resource 总会被转变成 "Resource id #1"
这种结构的字符串,其中的 1 是 PHP 在运行时分配给该 resource 的惟一值
6.NULL 老是被转变成空字符串
。
字符串的开始部分决定了它的值。若是该字符串以合法的数值开始,则使用该数值。不然其值为
0
(零)。
<?php $foo = 1 + "10.5"; // $foo is float (11.5) $foo = 1 + "-1.3e3"; // $foo is float (-1299) $foo = 1 + "bob-1.3e3"; // $foo is integer (1) $foo = 1 + "bob3"; // $foo is integer (1) $foo = 1 + "10 Small Pigs"; // $foo is integer (11) $foo = 4 + "10.2 Little Piggies"; // $foo is float (14.2) $foo = "10.0 pigs " + 1; // $foo is float (11) $foo = "10.0 pigs " + 1.0; // $foo is float (11) ?>
PHP 中的数组其实是一个有序映射。映射是一种把 values 关联到 keys 的类型。此类型在不少方面作了优化,所以能够把它当成真正的数组,或列表(向量),散列表(是映射的一种实现),字典,集合,栈,队列以及更多可能性。
PHP 数组能够 同时含有 integer 和 string 类型的键名,由于 PHP 实际并不区分索引数组和关联数组。
key 会有以下的强制转换:
1.包含有合法整型值的字符串会被转换为整型。例如键名 "8" 实际会被储存为 8。可是 "08" 则不会强制转换
,由于其不是一个合法的十进制数值。
2.浮点数也会被转换为整型,意味着其小数部分会被舍去。例如键名 8.7 实际会被储存为 8
。
3.布尔值也会被转换成整型。即键名 true 实际会被储存为 1 而键名 false 会被储存为 0
。
4.Null 会被转换为空字符串,即键名 null 实际会被储存为 ""
。
5.数组和对象不能被用为键名。坚持这么作会致使警告:Illegal offset type。
Example #2 类型强制与覆盖示例
<?php $array = array( 1 => "a", "1" => "b", 1.5 => "c", true => "d", ); var_dump($array); ?>
以上例程会输出:
array(1) { [1]=> string(1) "d" }
Example #3 混合 integer 和 string 键名
<?php $array = array( "foo" => "bar", "bar" => "foo", 100 => -100, -100 => 100, ); var_dump($array); ?>
以上例程会输出:
array(4) { ["foo"]=> string(3) "bar" ["bar"]=> string(3) "foo" [100]=> int(-100) [-100]=> int(100) }
Example #5 仅对部分单元指定键名
<?php $array = array( "a", "b", 6 => "c", "d", ); var_dump($array); ?>
以上例程会输出:
array(4) { [0]=> string(1) "a" [1]=> string(1) "b" [6]=> string(1) "c" [7]=> string(1) "d" }
integer,float,string,boolean 和 resource 类型转换为数组,将获得一个仅有一个元素的数组,其下标为 0,该元素即为此标量的值。换句话说,(array)$scalarValue 与 array($scalarValue) 彻底同样
。
若是一个 object 类型转换为 array,则结果为一个数组,其单元为该对象的属性。键名将为成员变量名,不过有几点例外:整数属性不可访问;私有变量前会加上类名做前缀;保护变量前会加上一个 '*' 作前缀。这些前缀的先后都各有一个 NULL 字符。这会致使一些不可预知的行为:
<?php class A { private $A; // This will become '\0A\0A' } class B extends A { private $A; // This will become '\0B\0A' public $AA; // This will become 'AA' } var_dump((array) new B()); ?>
上例会有两个键名为 'AA',不过其中一个其实是 '0A0A'。
将 NULL 转换为 array 会获得一个空的数组。
<?php class foo { static function callIt(callable $callback) { $callback(); } static function doStuff() { echo "Hello World!"; } } foo::callIt('foo::doStuff'); //The code would work fine, if we replaced the '$callback()' with 'call_user_func($callback)' or if we used the array ['foo', 'doStuff'] as the callback instead. ?>
The callable type hint, like
is_callable()
, will trigger an autoload of the class if the value looks like a static method callback
<?php // An example callback function function my_callback_function() { echo 'hello world!'; } // An example callback method class MyClass { static function myCallbackMethod() { echo 'Hello World!'; } } // Type 1: Simple callback call_user_func('my_callback_function'); // Type 2: Static class method call call_user_func(array('MyClass', 'myCallbackMethod')); // Type 3: Object method call $obj = new MyClass(); call_user_func(array($obj, 'myCallbackMethod')); // Type 4: Static class method call (As of PHP 5.2.3) call_user_func('MyClass::myCallbackMethod'); // Type 5: Relative static class method call (As of PHP 5.3.0) class A { public static function who() { echo "A\n"; } } class B extends A { public static function who() { echo "B\n"; } } call_user_func(array('B', 'parent::who')); // A // Type 6: Objects implementing __invoke can be used as callables (since PHP 5.3) class C { public function __invoke($name) { echo 'Hello ', $name, "\n"; } } $c = new C(); call_user_func($c, 'PHP!'); ?>
Example #2 使用 Closure 的示例
<?php // Our closure $double = function($a) { return $a * 2; }; // This is our range of numbers $numbers = range(1, 5); // Use the closure as a callback here to // double the size of each element in our // range $new_numbers = array_map($double, $numbers); print implode(' ', $new_numbers); ?>
以上例程会输出:
2 4 6 8 10
mixed 说明一个参数能够接受多种不一样的(但不必定是全部的)类型。
例如 gettype() 能够接受全部的 PHP 类型,str_replace() 能够接受字符串和数组。
number 说明一个参数能够是 integer 或者 float。
本文档中在 PHP 5.4 引入 callable 类型以前使用 了 callback 伪类型。两者含义彻底相同。
array|object 意思是参数既能够是 array 也能够是 object。
void 做为返回类型意味着函数的返回值是无用的。void 做为参数列表意味着函数不接受任何参数。
在函数原型中,$... 表示等等的意思。当一个函数能够接受任意个参数时使用此变量名。
(int), (integer) - 转换为整形 integer
(bool), (boolean) - 转换为布尔类型 boolean
(float), (double), (real) - 转换为浮点型 float
(string) - 转换为字符串 string
(array) - 转换为数组 array
(object) - 转换为对象 object
(unset) - 转换为 NULL (PHP 5)
(binary) 转换和 b 前缀转换支持为 PHP 5.2.1 新增。
注意在括号内容许有空格和制表符,因此下面两个例子功能相同:
<?php $foo = (int) $bar; $foo = ( int ) $bar; ?>
将字符串文字和变量转换为二进制字符串:
<?php $binary = (binary)$string; $binary = b"binary string"; ?>
实例:
<?php $a = TRUE; echo ($a++) . $a; // prints "11" ?>