资讯专栏INFORMATION COLUMN

php易错笔记-类型

tinyq / 2057人阅读

摘要:非法下标类型会产生一个级别错误。用负数下标写入字符串时会产生一个级别错误,用负数下标读取字符串时返回空字符串。浮点数也会被转换为整型,意味着其小数部分会被舍去。

Boolean

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

所有其它值都被认为是 TRUE(包括任何资源 和 NAN)。


整数

注意类型转换:


如果给定的一个数超出了 integer 的范围,将会被解释为 float。同样如果执行的运算结果超出了 integer 范围,也会返回 float。

Example #2 32 位系统下的整数溢出


Example #3 64 位系统下的整数溢出


浮点型

(也叫浮点数 float,双精度数 double 或实数 real)可以用以下任一语法定义:


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

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


字符串 单引号

只转义


双引号

正则用双引号

    换行(ASCII 字符集中的 LF 或 0x0A (10))

    回车(ASCII 字符集中的 CR 或 0x0D (13))
	    水平制表符(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}    符合该正则表达式序列的是一个以十六进制方式来表达的字符

双引号示例:

getName(): {${$object->getName()}}";

// 有效,输出: I"d like an A & W
echo "I"d like an {${beers::softdrink}}
";

// 也有效,输出: I"d like an Alexander Keith"s
echo "I"d like an {${beers::$ale}}
";
?>
Heredoc 结构

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

Warning
要注意的是结束标识符这行除了可能有一个分号(;)外,绝对不能包含其它字符。这意味着标识符不能缩进,分号的前后也不能有任何空白或制表符。更重要的是结束标识符的前面必须是个被本地操作系统认可的换行,比如在 UNIX 和 Mac OS X 系统中是 n,而结束定界符(可能其后有个分号)之后也必须紧跟一个换行。

如果不遵守该规则导致结束标识不“干净”,PHP 将认为它不是结束标识符而继续寻找。如果在文件结束前也没有找到一个正确的结束标识符,PHP 将会在最后一行产生一个解析错误。

Heredocs 结构不能用来初始化类的属性。自 PHP 5.3 起,此限制仅对 heredoc 包含变量时有效。

foo.
Now, I am printing some {$foo->bar[1]}.
This should print a capital "A": x41
EOT;

This does not:
foo(<<
Nowdoc 结构

单引号字符串


存取和修改
超出字符串长度的下标写入将会拉长该字符串并以空格填充。非整数类型下标会被转换成整数。非法下标类型会产生一个 E_NOTICE 级别错误。用负数下标写入字符串时会产生一个 E_NOTICE
级别错误,用负数下标读取字符串时返回空字符串。写入时只用到了赋值字符串的第一个字符。用空字符串赋值则赋给的值是 NULL 字符。

PHP 的字符串在内部是字节组成的数组。因此用花括号访问或修改字符串对多字节字符集很不安全。仅应对单字节编码例如 ISO-8859-1 的字符串进行此类操作。


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 中的数组实际上是一个有序映射。映射是一种把 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 类型强制与覆盖示例

 "a",
    "1"  => "b",
    1.5  => "c",
    true => "d",
);
var_dump($array);
?>

以上例程会输出:

array(1) {
  [1]=>
  string(1) "d"
}

Example #3 混合 integer 和 string 键名

 "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 仅对部分单元指定键名

 "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 字符。这会导致一些不可预知的行为:


上例会有两个键名为 "AA",不过其中一个实际上是 "0A0A"。

将 NULL 转换为 array 会得到一个空的数组。

Callback / Callable 类型

The callable type hint, like is_callable(), will trigger an autoload of the class if the value looks like a static method callback

Example #2 使用 Closure 的示例


以上例程会输出:

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 新增。

注意在括号内允许有空格和制表符,所以下面两个例子功能相同:


将字符串文字和变量转换为二进制字符串:

实例:

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/28146.html

相关文章

  • php易错笔记-变量,常量,运算符

    摘要:与变量不同,常量不存在可变常量,如果常量名是动态的,也可以用函数来获取常量的值。执行运算符命令反引号。递增递减运算符不影响布尔值。递增递减其他字符变量则无效,原字符串没有变化。不允许用来检测常量。 变量 基本 引用赋值 global 关键字 以下结果在命令行中有效,网页php中请不要尝试。。。都是坑。Example #1 使用 global或$GLOBALS 以下为网页ph...

    Bamboy 评论0 收藏0
  • php易错笔记-类与对象,命名空间

    摘要:类与对象基本概念如果在之后跟着的是一个包含有类名的字符串,则该类的一个实例被创建。如果该类属于一个名字空间,则必须使用其完整名称。如果一个类被声明为,则不能被继承。命名空间通过关键字来声明。 类与对象 基本概念 new:如果在 new 之后跟着的是一个包含有类名的字符串,则该类的一个实例被创建。如果该类属于一个名字空间,则必须使用其完整名称。 Example #3 创建一个实例 ...

    MartinHan 评论0 收藏0
  • php易错笔记-流程控制,函数

    摘要:的语法和其它流程控制结构相似部分允许设定代码段的行为。返回值在失败时返回并且发出警告。当一个函数是有条件被定义时,必须在调用函数之前定义。有条件的函数不能在此处调用函数,因为它还不存在,但可以调用函数。 流程控制 PHP 提供了一些流程控制的替代语法,包括 if,while,for,foreach 和 switch。替代语法的基本形式是把左花括号({)换成冒号(:),把右花括号(})分...

    mrcode 评论0 收藏0
  • python 一些易错点整理

    摘要:与比较中与比较关键字用来在函数或其他局部作用域中使用全局变量。亲自动手试后,发现使用了只会读闭包内的变量,可以隔着多层上一哥们类比看作为步骤 这篇文章是抄抄写写得来的,纯粹是这个编辑器比笔记的好太多,才在这儿写。 函数参数传递 Python的函数参数传递 对于变量(与对象相对的概念),其实,python函数参数传递可以理解为就是变量传值操作,用C++的方式理解,就是对void*赋值。如...

    Lemon_95 评论0 收藏0
  • 正则表达式易错点小结!

    摘要:举例说明百度谷歌正则如下结果是把全部的字符串都匹配到了其实,我们只需要加上修饰符,这样,这样一旦成功匹配一次的话,正则就不会继续进行匹配了个人认为应该是的意思,表示在匹配的时候忽略大小写。 最近在学习正则表达式,发现原来理解的正则表达式不是特别的准确,甚至有误!在这里简单记录一下,希望对有的朋友能够有所帮助! ①[]:字符集(字符簇,字符组……) 他的真正含义是或的意思!例如:[123...

    邱勇 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<