PHP基本类型

转换为布尔值

要明确地将一个值转换成boolean,用(bool)或者(boolean)来强制转换。但是很多情况下不需要用强制转换,因为当运算符,函数或者流程控制结构需要一个boolean参数时,该值会被自动转换。

当转换为boolean时,以下值被认为是FALSE:

  • 布尔值FALSE本身
  • 整型值0(零)
  • 浮点型值0.0(零)
  • 空字符串,以及字符串“0”
  • 不包括任何元素的数组
  • 特殊类型NULL(包括尚未赋值的变量)
  • 从空标记生成的SimpleXML对象

所有其他值都被认为是TRUE(包括任何资源和NAN),-1和其它非零值(不论正负)一样,被认为是TRUE!

Integer整型

0(零)八进制,0x十六进制,0b二进制

整型数的字长和平台有关,PHP不支持无符号的integer。PHP7以前的版本里,如果向八进制数传递了一个非法数字(即8或9),则后面其余数字会被忽略。PHP7以后,会产生Parse Error。

整数溢出

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

PHP中没有整除的运算符。1/2产生float 0.5。值可以舍弃小数部分,强制转换为integer,或者使用round()函数可以更好地四舍五入。

转换为整型

要明确地将一个值转换为integer,用(int)或(integer)强制转换。不过大多数情况下都不需要强制转换,因为当运算符,函数或流程控制需要一个integer参数时,值会自动转换。还可以通过函数intval()来将一个值转换成整型。

将resource转换成integer时,结果会是PHP运行时为resource分配的唯一资源号。

从布尔值转换

FALSE将产生出0,TRUE将产生出1。

从浮点型转换

当从浮点数转换成整数时,将向下取整。

如果浮点数超出了整数范围(32位平台行下通常为+/-2.15e+9=2^31,64位平台下,除了Windows,通常为+/-9.22e+18=2^63),则结果为未定义,因为没有足够的精度给出一个确切的整数结果。在此情况下没有警告,甚至没有任何通知!

PHP7.0.0起,NaN和Infinity在转换成integer时,不再是undefined或者依赖于平台,而是都会变成零。

绝不要将未知的分数强制转换为integer,这样有时会导致不可预料的结果。

Float浮点型

浮点数的精度

浮点数的精度有限。尽管取决于系统,PHP通常使用IEEE754双精度格式,则由于取整而导致的最大相对误差为1.11e-16.非基本数学运算可能会给出更大误差,并且要考虑到进行复合运算时的误差传递。

此外,以十进制能够精确表示的有理数如0.1或0.7,无论有多少尾数都不能被内部所使用的二进制精确表示,因此不能在不丢失一点点精度的情况下转换为二进制的格式。这就会造成混乱的结果:例如:floor((0.1+0.7)*10)通常会返回7而不是预期中的8,因为该结果内部的表示其实是类似7.999999999999999999999……。

所以永远不要相信浮点数结果精确到了最后一位,也永远不要比较两个浮点数是否相等。如果确实需要更高的精度,应该使用任意精度数学函数或者gmp函数。

转换为浮点数

自PHP5起,如果视图将对象转换为浮点数,会发出一条E_NOTICE错误消息。

比较浮点数

如上警告信息所言,由于内部表达方式的原因,比较两个浮点数是否相等 是有问题的。不过还是有迂回的方法来比较浮点数值的。

要测试浮点数是否相等,要使用一个仅比该数值大一丁点的最小误差值。该值也被称为机器极小值或最小单元取整数,是计算中能接受的最小的差别值。

NaN

某些数学运算会产生一个由常量NaN所代表的结果。此结果代表着一个在浮点数运算中未定义或不可表述的值。任何拿此值与其他任何值(除了TRUE)进行的松散或严格比较的结果都是FALSE。

由于NAN代表着任何不同值,不应拿NaN去和其它值进行比较,包括其自身,应该用is_nan()来检查。

 String字符串

一个字符串string就是由一系列的字符组成,其中每个字符等同于一个字节。这意味着PHP只能支持256的字符集,因此不支持Unicode。string最大可以达到2GB。

单引号

定义一个字符串的最简单的方法是用单引号把它包围起来。要表达一个单引号自身,需在它的前面加个反斜线(\)来转义。要表达一个反斜线自身,则用两个反斜线(\\)。其他任何方式的反斜线都会被当成反斜线本身:也就是说如果想使用其它转义序列例如\r或者\n,并不代表任何特殊含义,就单纯是这两个字符本身。

不像双引号和heredoc语法结构,在单引号字符串中的变量和特殊字符的转义序列将不会被替换。

双引号

如果字符串是包围在双引号(“)中,PHP将对一些特殊的字符进行解析:/n换行、/r回车等,转义任何其它字符都会导致反斜线被显示出来。PHP5.1.1以前,\{$var}中的反斜线还不会被显示出来。

用双引号定义的字符串最重要的特征是变量会被解析。

Heredoc结构

第三种表达字符串的方法是用heredoc句法结构:<<<。在该运算符之后要提供一个标识符,然后换行。接下来是字符串string本身,最后要用前面定义的标识符作为结束标志。结束时所引用的标识符必须在该行的第一列,而且,标识符的命名也要像其它标签一样遵守PHP的规则:只能包含字母。数字和下划线,并且必须以字母和下划线作为开头。

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

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

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

Heredoc结构就像是没有使用双引号的双引号字符串,这就是说在heredoc结构中单引号不用被转义,但是转义序列还可以使用。变量将被替换,但在heredoc结构中含有复杂的变量时要格外小心。

在PHP5.3.0以后,也可以用Heredoc结构来初始化静态变量和类的属性和常量,还可以在Heredoc结构中用双引号来声明标识符。

Nowdoc结构

就像heredoc结构类似于双引号字符串,Nowdoc结构是类似于单引号字符串的。Nowdoc结构很像heredoc结构,但是nowdoc中不进行解析操作。这种结构很适合用于嵌入PHP代码或其它大段文本而无需对其中的特殊字符进行转义。与SGML的<![CDATA[]]>结构是用来声明大段的不用解析的文本类似,nowdoc结构也有相同的特征。

一个nowdoc结构也用和heredocs结构一样的标记<<<,但是跟在后面的标识符要用单引号括起来,即<<<'EOT'。Heredoc结构的所有规则也同样适用于nowdoc结构,尤其是结束标识符的规则。

不像heredoc结构,nowdoc结构可以用在任意的静态数据环境中,最典型的示例是用来初始化类的属性或常量。

Nowdoc结构是在PHP5.3.0中加入的。

变量解析

当字符串用双引号或heredoc结构定义时,其中的变量将会被解析。

这里共有两种语法规则:一种简单规则,一种复杂规则。简单的语法规则是最常用和最方便的,它可以用最少的代码在一个string中嵌入一个变量,一个array的值,或一个object的属性。

复杂规则语法的显著标记是用花括号包围的表达式。

简单语法

当PHP解析器遇到一个美元符号($)时,它会和其他很多解析器一样,去组合尽量多的标识以形成一个合法的变量名。可以用花括号来明确变量名的界线。

复杂(花括号)语法

复杂语法不是因为其语法复杂而得名,而是因为它可以使用复杂的表达式。

任何具有string表达的标量变量,数组单元或对象属性都可使用此语法。只需简单地像在string以外的地方那样写出表达式,然后用花括号{和}把它括起来即可。由于{无法被转义,只有$紧挨着{时才会被识别。可以用{\$来表达{$。

函数、方法、静态类变量和类常量只有在PHP5以后才可在{$}中使用。然而,只有在该字符串被定义的命名空间中才可以将其值作为变量名来访问,只单一使用花括号({})无法处理从函数或方法的返回值或者类常量以及类静态变量的值。

存取和修改字符串中的字符

string中的字符可以通过一个从0开始的下标,用类似array结构中的方括号包含对应的数字来访问和修改,比如$str[42]。可以把string当成字符组成的array。函数substr()和substr_replace()可用于操作多于一个字符的情况。string也可用花括号访问,比如$str{42}。

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

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

自PHP5.4起字符串下标必须为整数或可转换为整数的字符串,否则会发出警告。

PHP5.5增加了直接在字符串原型中用[]或{}访问字符的支持。

Note:

用[]或{}访问任何其它类型(不包括数组或具有相应接口的对象实现)的变量只会无声地返回NULL。

字符串可以用'.'运算符连接,注意'+'运算符没有这个功能。

转换成字符串

一个值可以通过在其前面加上(string)或用strval()函数来转变成字符串。在一个需要字符串的表达式中,会自动转换为string。

 一个布尔值boolean的TRUE被转换成string的“1”。Boolean的FALSE被转换成“”(空字符串)。这种转换可以在boolean和string之间互相进行。

一个整数integer或浮点数float被转换为数字的字面样式的string(包括float中的指数部分)。使用指数计数法的浮点数(4.1E+6)也可转换。

数组array总是转换成字符串“Array",因此,echo和print无法显示出该数组的内容。

在PHP4中对象object总是被转换成字符串”Object",为了得到对象的类的名称,可以用get_class()函数。自PHP5起,适当时可以用_toString方法。

资源resource总会被转变成“Resource id #1"这种结构的字符串,其中的1是PHP在运行时分配给该resource的唯一值。不要依赖此结构,可能会有变更。要得到一个resource的类型,可以用函数get_resource_type()。

NULL总是被转变成空字符串。

直接把array,object或resource转换成string不会得到除了其类型之外的任何有用信息。可以使用函数print_r()和var_dump列出这些类型的内容。

大部分的PHP值可以转变成string来永久保存,这被称作串行化,可以用函数serialize()来实现。如果PHP引擎设定支持WDDX,PHP值也可被串行化为格式良好的XML文本。

字符串转换为数值

当一个字符串被当作一个数值来取值,其结果和类型如下:

如果该字符串没有包含‘.’,‘e’或‘E’并且其数字值在整型的范围之内(由PHP_INT_MAX所定义),该字符串将被当成integer来取值。其它所有情况下都被作为float来取值。

该字符串的开始部分决定了它的值。如果该字符串以合法的数值开始,则使用该数值。否则其值为0.合法数值由可选的正负号,后面跟着一个或多个数字(可能有小数点),再跟着可选的指数部分。指数部分由’e‘或’E‘后面跟着一个或多个数字构成。

字符串类型详解

PHP中的string的实现方式是一个由字节组成的数组再加上一个整数指明缓冲区长度。并无如何将字节转换成字符的信息,由程序员来决定。字符串由什么值来组成并无限制;特别的,其值为0(”NULL bytes“)的字节可以处于字符串任何位置(不过有几个函数,在本手册中被称为非”二进制安全“的,也许会把NULL字节之后的数据全部忽略)。

由于PHP并不特别指明字符串的编码,字符串会被按照该脚本文件相同的编码方式来编码,不过这并不适用于激活了Zend Multibyte时,此时脚本可以是以任何方式编码的(明确指定或被自动检测)然后被转换为某种内部编码,然后字符串将被用此方式编码。

转载于:https://www.cnblogs.com/apricot92/p/8039032.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值