4. PHP变量的类型(一)
1. 四种标量类型
1.1 布尔类型boolean
以下值被认为是false,所有其他值都被认为是true(包括任何资源)
- 布尔值false
- 整型值0(零)为假,-1和其他非零值(不论正负)一样,都被认为true
- 浮点型值0.0
- 空白字符串和字符串”0”
- 没有成员变量的数组
- 没有单元的对象(仅使用PHP4)
- 特殊类型NULL(包括尚未设定的变量)
PHP手册〉附录〉类型比较表〉使用 PHP 函数对变量 $x 进行比较
1.2 整数类型int
注意
- PHP中我们常用十进制数,还可以用十六进制(用十六进制符号数字前面必须加上”0x”,0-9数字和A-F字母组成),八进制(数字前面必须加上”0”(零),0-7数字组成)。
- 整型数值有最大的使用范围,整型数子长和平台有关,对于32位操作系统,最大整数二十多亿(2 147 483 647).PHP不支持无符号整数,即不能像其他语言一样最大值翻一倍。整型的最小值为-2147 483 648.如果超出范围将会被解释为float.
进制转换
十进制转换为二进制decbin(),除2取余倒着写.
- 基本做法是:将10进制数字除以2,并取得余数,如果除得的商不为0,则继续除以2,并继续去的余数,直到商为0。然后将所有取得的余数,按“倒序写出”,就是对应的2进制数字:
- $v1 = decbin(123);//注意:参数必须是10进制数字,转换后的结果必然是二进制字符串。
- 十进制转八进制decoct(),除8取余倒着写
- 基本做法是:将10进制数字除以8,并取得余数,如果除得的商不为0,则继续除以8,并继续去的余数,直到商为0。然后将所有取得的余数,按“倒序写出”,就是对应的8进制数字
- 十进制转十六进制dechex(),除16取余倒着写
- 二进制转十进制bindec(),每位数值乘以2的权值然后相加.权值:就是某位数字上的该数字所代表的数的大小。比如:
- 10进制数字1234,其代表:1*10 3+ 2*102 + 3*101 + 4*100 = 1000+ 200 + 30 + 4;
这里,10 3, 102,101,等等,就称为权值 - 八进制转十进制octdec() ,每位数值乘以8的权值然后相加
$v1 = octdec(“8进制数字字符串”) ;
//得到的结果是10进制数字- 十六进制转十进制hexdec() ,每位数值乘以16的权值然后相加
- $v1 = hexdec(“16进制数字字符串”) ;//得到的结果是10进制数字
**注意:十进制转为其他进制结果是字符串,其他进制转为十进制要求给定数据是字符串形式
**
例如
<?php
$v1 = bindec(123);//理解过程:bindec(“123”) =>bindec(“1”)=>1
$v2 = bindec(0123);//理解:0123是8进制数字,其10进制值为:83,再当作二进制字符串就是“83”,结果就只能是0
$v3 = bindec(“0123”);//理解:因为直接就是字符串了,就当二进制字符串用,结果是1
$v4 = octdec(0123); //理解:0123是8进制数字,其10进制值为:83,再当作8进制字符串就是“83”,但8进制中没有“8”这个数字,就只识别出一个“3”这个数字
1.3 浮点类型float/double
浮点数只是一种近似的值。如果用浮点数表示8,则其结果内部的表示其实类似7.9999999999999····.
所以永远不要相信浮点数结果精确到了最后一位,也不要比较两个浮点数是否相等。如果确实需要更高的精度,可以使用任意精度数学函数或者gmp()函数
有两种写法
- $v1 = 1.234;//带小数点,就是浮点类型
- $v2 = 1.234E3
- $v3 = 1234E3;结果是1234000,但也是一个浮点数
- $v4 = 1234E3E4;错误
浮点数的细节
10进制小数转二进制小数的做法:乘2并顺序取整数部分
没有系统函数使用。
//十进制小数转换为2进制小数
//方法:小数部分乘以2,并顺序取得小数部分
//例如:0.6125
0.6125*2
= 1.225 整1
0.225*2
= 0.45 整0
0.45*2
= 0.9 整0
0.9*2
= 1.8 整1
0.8*2
= 1.6 整1
0.6*2
=1.2 整1
0.2*2
=0.4 整0
0.4*2
=0.8 整0
·······写不完了
结果:0.1001 1100 1100 1100 ......
//例如:0.625
0.625*2
= 1.25 整1
0.25*2
= 0.5 整0
0.5*2
= 1.0 整1
结果:0.101
可见:绝大部分小数都无法完整转换为二进制小数
因此浮点数不应该进行大小比较
**因为浮点数在系统内部(cpu级别),很可能都是不精确表达。d
要想进行比较,我们只能考虑自己应用中的精度要求的基础上,将其转换为整数进行比较。**
通常的做法是:乘以10的精度位数数次方,比如精度要求3位有效数字,则乘以10的3次方
<?php
$v1 = 8.1/3;
echo '<br/>php中,8.1/3结果是'.$v1;
if($v1 < 2.7){
echo '<br/>php中,8.1/3小于2.7';
}
if(round($v1*1000)==round(2.7*1000)){
echo '<br/>php中,8.1/3等于2.7(按3位精度)';
}else{
echo '<br/>php中,8.1/3不等于2.7(按3位精度)';
}
/** 结果: php中,8.1/3结果是2.7 php中,8.1/3小于2.7 php中,8.1/3等于2.7(按3位精度) */
1.4 字符串类型string
转义字符
序列 | 含义 |
---|---|
\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
//单引号字符串:
//可以识别的转义字符:\\ 和\'[实际上,只有字符串中的最后一个“\”才必须使用转义符]
$str1 = 'ab\nc"dd\t\'efdd:$ds\\';
echo $str1;
//结果:
//ab\nc"dd\t'efdd:$ds\
双引号
<?php
//双引号字符串
//可以识别所有转义字符
//可以自动识别变量(以$开头的连续字符,有时需要使用花括号{}来界定变量名)
$str2 = "ab\nc\"dd\tdda,,:$addb";
echo $str2;
nowdoc(单引号定界符字符串)
<?php
//nowdoc(单引号)定界符字符串:
//说明:ABCD是一个自定义的标识符,放在单引号中
//此字符串形式没有可用的转义符
$str3 = <<<'ABCD' 在这里可以写任何东西,一般经常用来些html代码,js代码等 包括回车换行,tab等 $符等包括单双引号都能够正常输出, 点击查看源代码可以看到效果 ABCD;
echo $str3;
heredoc(双引号定界符字符串)
<?php
//here(双引号)定界符字符串
//说明:ABCD是一个自定义的标识符,放在双引号(或不用引号)
//在此形式中,其转义符跟双引号字符串几乎差不多(双引号不转义)
$str4 =<<<"ABCDE" 这里就是字符串的内容。和双引号差不多 $abd \t等等等 ABCDE;
echo $str4;
2. 两种复合类型
数组类型array
标识一系列数据的“有序排列”的集合体,PHP中,数组的下标可以使用整数或字符串
数字下标常说”索引号”,字符串下标常说”键名”
在PHP的报错系统中,都叫做”index”,或”offset”
对象类型object
在php中,对象跟js中的有比较大的区别
通常,js中的对象,有自定义的,也有现成的,但是PHP中的对象,通常都是指自定义的对象
3. 两种特殊类型
资源类型resource
资源是一种特殊类型的变量,保存了到外部资源的一个引用。资源是通过专门的函数来建立和使用的。不是PHP语言通过某种语法形式”创造”的数据。而是外部本来就有的数据(比如数据库,文件,图片等)。PHP只是通过某种语法(或方式)来对其进行某些操作。
空类型null
表示一个变量没有值,NULL类型唯一可能的值就是NULL.NULL不表示空格,也不表示零。也不是空字符串,而是表示一个变量值为空
null不区分大小写,在下列情况下一个变量被认为是NULL:
- 将变量直接赋值为NULL
- 声明的变量尚未被赋值
- 被unset()函数销毁的变量
还没有评论,来说两句吧...