数据类型:
标量类型:int,float,string,bool
符合类型: array,object
特殊类型: null, resource
整数表示法:
十进制
八进制写法:
$n = 0123
十六进制写法:
0x123
进制转换:
dec: 十进制
bin: 二进制
oct:八进制
hex:十六进制
-
十进制转二进制decbin(),除2取余倒着写
$v1= decbin(123); //注意:参数必须是10进制数字,转换后的结果必然是二进制字符串。
$v1 = 123;
$r1 = decbin($v1);//参数必须是10进制数
echo "r1=$r1, 其类型是:".gettype($1);
我们也可以通过手工的方式来完成10进制转2进制的完整过程。
基本做法是:将10进制数字除以2,并取得余数,如果除得的商不为0,则继续除以2,并继续去的余数,直到商为0。然后将所有取得的余数,按“倒序写出”,就是对应的2进制数字:
//10转2
$v1 = 123;
123/2
=61 余下1
61/2
=20 余下1
30/2
=15 余下0
15/2
=7 余下1
7/2
3 余下1
十进制转八进制decoct(),除8取余倒着写
我们也可以通过手工的方式来完成10进制转8进制的完整过程。
基本做法是:将10进制数字除以8,并取得余数,如果除得的商不为0,则继续除以8,并继续去的余数,直到商为0。然后将所有取得的余数,按“倒序写出”,就是对应的8进制数字:
//10转8
//除8取余倒着写
$v2 = 178;
178/8
=22 余留2
22/8
=2 余留6
2/8
=0 余留2
结果是262
使用php系统函数:
$r1 = decoct(十进制数字); //结果是一个8进制数字字符串。
十进制转十六进制dechex(),除16取余倒着写
16进制的数字包括如下(从0开始):
0 1 2 3 4 5 6 7 8 9 A B C D E F
对应10进制其实是:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
系统函是:dechex(十进制数字),结果是16进制数字字符串。
手工运算:
基本做法是:将10进制数字除以16,并取得余数,如果除得的商不为0,则继续除以16,并继续去的余数,直到商为0。然后将所有取得的余数,按“倒序写出”,就是对应的16进制数字:
//10转16
//除以16倒着写取余
$v2 = 178;
178/16
=11 余2
11/16
=0 余11(就是B)
结果B2
-
二进制转十进制bindec(),每位数值乘以2的权值然后相加
先理解一个“权值”概念:
就是某位数字上的该数字所代表的数的大小。比如:
10进制数字1234,其代表:1*103+2*102+ 3*101 + 4*100 = 1000+ 200 + 30 + 4;
这里,103,102,101,等等,就称为权值。
二进制转10进制,就是将每位数值乘以对应位上的权值,然后相加得到的结果。
用系统函数是:
$v1 = bindec(“二进制数字字符串”);//得到的结果是10进制数字
二进制数字的权值,从右到左,分别是:
20, 21, 22, 23, 24, 25,.....
即分别是(10进制大小):
1,2, 4, 8, 16,32
手工计算:
1010110
=1*26+ 0*XX + 1*24+ 0*XX + 1*22+ 1*21+ 0 //说明,其中XX表示无所谓的数字值
=64+ 0 + 16 + 0 + 4 + 2 + 0
=86
八进制转十进制octdec(),每位数值乘以8的权值然后相加
用系统函数是:
$v1 = octdec(“8进制数字字符串”);//得到的结果是10进制数字
十六进制转十进制hexdec(),每位数值乘以16的权值然后相加
用系统函数是:
$v1 = hexdec(“16进制数字字符串”);//得到的结果是10进制数字
-
注意:十进制转为其他进制结果是字符串,其他进制转为十进制要求给定数据是字符串形式,如果此时给的是一个数字,则把它先转化成10进制数在打上引号进行计算。
思考:
$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”这个数字,所以结果是3.
浮点类型float,double,real
有两种写法:
$v1= 1.234; //带小数点,就是浮点类型
$v2= 1.234E3;//含义是:1.234乘以10的3次方,即1234,带E的形式就是浮点数
$v3= 1234E3;//结果值是1234000,但也是一个浮点数。
关于浮点数的细节知识
10进制小数转二进制小数的做法:乘2并顺序取整数部分
//10进制小数转为2进制小数
//0.625
0.625*2 =
1.25 取整数1
0.25*2=
0.5 取整数0
0.5*2 =
1.0 取整数1
结果是0.101
但是不是所有的小数都能够转化成2进制浮点数,例如0.8就不行。
-
浮点数不应直接进行大小比较
因为浮点数在系统内部(cpu级别),很可能都是不精确表达。
要想进行比较,我们只能考虑自己应用中的精度要求的基础上,将其转换为整数进行比较。
通常的做法是:乘以10的精度位数数次方,比如精度要求3位有效数字,则乘以103次方
$v1 = 8.1/3; echo "<hr/>php中,8.1/3的结果是:".$v1;//2.7 if ($v1 < 2.7){ echo "<hr/>php中, 8.1/3的结果小于2.7";//True } if (round($v1*1000) == 2.7*1000){ echo "<br/>php中, 8.1/3等于2.7(按照精度要求为3为有效小数)";//True } else{ echo "<br/>php中,8.1/3不等于2.7(按照精度要求为3)"; }
-
当整数运算的结果超出整数的范围后,会自动转换为浮点数。
整数的范围,在32位系统下,大约正负20多亿
字符串类型
可用单引号或者双引号来包含。
区别是:
//单引号字符串 //可以识别的转义符有:\\ \' $str1 = 'ab\nc\'defg'; echo "<p>$str1</p>"; //双引号字符串 //可以识别的转移符有: \\ \" \n \r \$ //双引号字符串中可以自动识别变量(以$开头的连续字符) $str2 = "ab\ncd\"'efg"; echo "<p>$str2</p>"; //nowdoc (单引号)定界符字符串 //说明:ABCD是一个自定义的标识符,放在单引号中 //此字符串形式没有可用的转移符 $str3 = <<<'hello' 这里就是字符串的内容 想写啥就写啥,$fu 回车 包括单双引号都可以直接写出来 通常这里可以写大段的html代码; hello; //该字符串的结束标识符必须和前面一样 //且该结束符所在行不能有其他内容,只能出现 //该标识符和一个分号 echo "<p>$str3</p>"; //herdoc (双引号)定界符字符串 //这里是一个自定义的hello运算符 //注意这里面的转义符跟双引号字符串差不多(双引号不转义) $str4 = <<<"hello" 这里就是字符串的内容 想写啥就写啥, 回车 " ' 包括单双引号都可以直接写出来 通常这里可以写大段的html代码; hello; //该字符串的结束标识符必须和前面一样 //且该字符串所在行不能有其他的内容,只能出现 //该标识符和一个分号 echo "$str4";
布尔类型:bool ,boolean
用于表示某种只有两个状态值的数据:true,false。
最常见的语法类型:
if(某数据/变量){
。。。。
}
在php中隐含的false:
0
0.0
null
''
""
"0"(跟python不同)
数组类型:
表示一系列数据的“有序排列”的集合体。
php中,数组的下标可以用整数或字符串。
数字下标常叫做“key名”
实际在php中一般就是index
$arr1 = array(5, 22, 12, 'abc'); echo $arr1['ddd'];//undefined index echo $arr1[43];//undefined offset//数组变量在php中有专门的语法: //foreach (数组名 as 下标变量$key =>值变量$value){ //这里是循环体 //} foreach ($arr1 as $key => $value){ echo "<br/>下标记:$key, 值:$value"; }下标记:0, 值:5
下标记:1, 值:22
下标记:2, 值:12
下标记:3, 值:abc
对象类型
在php中, 对象跟js有比较大的区别。
通常,js中的对象,有自定义的(创建的),也有现成的例如window对象
但是:
在php中,通常都是自己定义的对象,纯语法的。
//定义一个人’类‘ class Person{ public $name = '匿名'; public $age = 18; public function introMe(){ echo "hello!"; echo '我叫'.$this->name; echo '我今年'.$this->age; } } $person1 = new Person();//创建了一个‘人’对象 $person1->name = '小明';//设定这个’人‘的名字 $person1->age = 22;//设定这个’人‘的年龄 $person1->introMe();//让这个人进行自我介绍输出:hello!我叫小明我今年22
资源类型resource
对外部数据的引用,数据非php代码生成的。php只是通过某种语法或者方式来对其进行某些操作。
空类型 null
只是一个计算机中编程领域的‘概念’类型,只是为了表达变量所储存的数据的某种特殊情形所创建的
概念-没有存数据。
类型转换
自动转化:
通常自动转换是弱类语言最基本和方便的一个特征:他会在各种运算中根据运算符的需求将非该运算符能处理的数据转换成可以
处理的语言。常见类型如下:
if数据{}:转换为bool类型
算数运算符:转为数字类型
连接运算符:转为字符串类型
比较运算符:转为布尔类型或者数字类型
两边如果至少有一个布尔类型,则另一边也换转化成布尔类型。
否则,就换转换成数字比较。
强制转换:
就是通过语法让某种数据转化成另一种类型的数据。$v1 = (int)4.6; $v2 = (float)$v1; echo "<br/>v1的值为:$v1, 类型为:".gettype($v1); echo "<br/>v2的值为:$v2, 类型为:".gettype($v2); v1的值为:4, 类型为:integer v2的值为:4, 类型为:double 与类型有关的系统函数: var_dump(): 能够输出一个变量的完整信息 gettype():能够获取一个变量的类型名称echo "<br/>v1的值为:$v1, 类型为:".gettype($v1); echo "<br/>v2的值为:$v2, 类型为:".gettype($v2); settype($v1, 'float');//此时v1就是浮点类型
isset():判断一个变量是否存在数据类型,存在为真(只有在null,var $x,undefined才是false)
empty():判断一个数据是否为空 // ’0‘都算空
unset():销毁(删除)一个变量。
is_XX类型()系列函数is_int(),is_float(), is_numeric() is_numeric()对4,4.6,’4‘,’4.5‘都是true。