php易错笔记-类型

Boolean

当转换为 boolean 时,以下值被认为是 FALSE:
布尔值 FALSE 本身
整型值 0(零)
浮点型值 0.0(零)
空字符串'',以及字符串 "0"
不包括任何元素的数组[]
特殊类型 NULL(包括尚未赋值的变量)
空标记生成的 SimpleXML 对象

所有其它值都被认为是 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开始
?>

注意类型转换:

<?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)可以用以下任一语法定义:

<?php
$a = 1.234; 
$b = 1.2e3; 
$c = 7E-10;
?>
浮点数的精度有限。
floor((0.1+0.7)*10) 通常会返回 7 而不是预期中的 8,因为该结果内部的表示其实是类似
7.9999999999999991118...。
所以永远不要相信浮点数结果精确到了最后一位,也永远不要比较两个浮点数是否相等

$a 和 $b 在小数点后五位精度内都是相等的。

<?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}    符合该正则表达式序列的是一个以十六进制方式来表达的字符

双引号示例:

<?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";
?>

Heredoc 结构

没有使用双引号的双引号字符串

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
);
?>

Nowdoc 结构

单引号字符串

<?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

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 会得到一个空的数组。

Callback / Callable 类型

<?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

mixed 说明一个参数可以接受多种不同的(但不一定是所有的)类型。
例如 gettype() 可以接受所有的 PHP 类型,str_replace() 可以接受字符串和数组。

number

number 说明一个参数可以是 integer 或者 float。

callback

本文档中在 PHP 5.4 引入 callable 类型之前使用 了 callback 伪类型。二者含义完全相同。

array|object

array|object 意思是参数既可以是 array 也可以是 object。

void

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"
?>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值