码迷,mamicode.com
首页 > 编程语言 > 详细

03 php 数据类型:整数,进制转换,浮点,字符,布尔,数组,空类型,类型转换,算术运算,比较运算

时间:2016-04-21 00:01:18      阅读:714      评论:0      收藏:0      [点我收藏+]

标签:03 数据类型:整数   进制转换   浮点   字符   布尔   数组   


03 数据类型:整数,进制转换,浮点,字符,布尔,数组,空类型,类型转换,

算术运算,比较运算,逻辑运算,短路现象,

三目运算符,字符型运算:



 

数据类型

整体划分

  • 标量类型: int, float, string, bool

  • 复合类型: array,     object

  • 特殊类型: null,     resouce

整数类型int integer

3种整数表示法

  • 十进制写法:123:

$n1 = 123;

  • 八进制写法: 0123

$n2 = 0123;

  • 十六进制写法: 0x123

$n3 = 0x123;

进制转换问题

先学习几个单词:

dec: 十进制

bin:二进制

oct:八进制

hex:十六进制

  • 十进制转二进制decbin(),除2取余倒着写

$v1 = decbin(123); //注意:参数必须是10进制数字,转换后的结果必然是二进制字符串。


技术分享

 

我们也可以通过手工的方式来完成10进制转2进制的完整过程。

基本做法是:将10进制数字除以2,并取得余数,如果除得的商不为0,则继续除以2,并继续去的余数,直到商为0。然后将所有取得的余数,按“倒序写出”,就是对应的2进制数字:

技术分享


 

  • 十进制转八进制decoct(),除8取余倒着写

使用php系统函数: 

$r1 =  decoct(十进制数字)     //结果是一个8进制数字字符串。

技术分享


我们也可以通过手工的方式来完成10进制转8进制的完整过程。

基本做法是:将10进制数字除以8,并取得余数,如果除得的商不为0,则继续除以8,并继续去的余数,直到商为0。然后将所有取得的余数,按“倒序写出”,就是对应的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进制数字:

 

技术分享


 





 

  • 二进制转十进制bindec(),每位数值乘以2的权值然后相加

先理解一个“权值”概念:

就是某位数字上的该数字所代表的数的大小。比如:

10进制数字1234,其代表:1*10 3+2*102 + 3*101  +4*100  =  1000+ 200 + 30 + 4;

这里,10 3 102101,等等,就称为权值。

 

二进制转10进制,就是将每位数值乘以对应位上的权值,然后相加得到的结果。

用系统函数是:

$v1  = bindec(“二进制数字字符串”) //得到的结果是10进制数字

技术分享


结果:技术分享


 

手工转换:

二进制数字的权值,从右到左,分别是:

20 21 22 23 24 25.....

即分别是(10进制大小):

1 2  4  8  1632

手工计算:

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进制数字

技术分享


结果:技术分享

手工算法统2进制转换为10进制,略。

  • 十六进制转十进制hexdec() ,每位数值乘以16的权值然后相加

用系统函数是:

$v1  = hexdec(“16进制数字字符串”) //得到的结果是10进制数字

技术分享


结果:技术分享


 

  • 注意:十进制转为其他进制结果是字符串,其他进制转为十进制要求给定数据是字符串形式

思考:

$v1 = bindec(123);//理解过程:bindec(“123”) =>bindec(“1”)=>1

$v2 = bindec(0123);//理解:01238进制数字,其10进制值为:83,再当作二进制字符串就是“83”,结果就只能是0

$v3 = bindec(“0123”);//理解:因为直接就是字符串了,就当二进制字符串用,结果是1

$v4 = octdec(0123);      //理解:01238进制数字,其10进制值为:83,再当作8进制字符串就是“83”,但8进制中没有“8”这个数字,就只识别出一个“3”这个数字

以下代码测试:

技术分享


 

 

浮点类型float double real

有两种写法:

$v1 = 1.234;   //带小数点,,就是浮点类型

$v2 = 1.234E3;//含义是:1.234乘以103次方,即1234,带E的形式就是浮点数

$v3 = 1234E3//结果值是1234000,但也是一个浮点数。

 

关于浮点数的细节知识

  • 10进制小数转二进制小数的做法:乘2并顺序取整数部分

没有系统函数。

技术分享

技术分享



  • 浮点数不应直接进行大小比较

因为浮点数在系统内部(cpu级别),很可能都是不精确表达。

要想进行比较,我们只能考虑自己应用中的精度要求的基础上,将其转换为整数进行比较。

通常的做法是:乘以10的精度位数数次方,比如精度要求3位有效数字,则乘以103次方

技术分享

技术分享



 

  • 当整数运算的结果超出整数的范围后,会自动转换为浮点数。

 

整数的范围,在32位系统下,大约正负20多亿

 

 

字符串类型string

js中,虽然有2种字符串表达形式,但也应该理解为是一种字符串:

var  str1 = ‘单引号字符串

var   str2 = “双引号字符串”;

但在php中,单引号和双引哈字符串,是有不同细节含义的字符串。

 

php中,有4种字符串形式:

 

单引号字符串:

技术分享


结果:技术分享


 

双引号字符串:

技术分享


结果:技术分享







更多的转义符见手册如下:

技术分享


 

nowdoc(单引号)定界符字符串:

技术分享


输出结果为:

技术分享


 

 

heredoc(双引号)定界符字符串:

技术分享


结果:

技术分享


布尔类型:bool boolean

用于标识某种只有两个状态值的数据:truefalse——吃没吃,去没去,有没有。。。。。

在应用出,我们常常会(需要)直接将一个数据(可能是各种其他类型)当作一个布尔值来进行判断

那么此时其实发生的是:会将该数据隐含转换为布尔值。

最常见的语法形式就是:

if(  某数据/变量 ){

.................

}

那么,在php中,其他各种数据,隐含转换为布尔值的时候,会当作false的有:

0

0.0

null

“”

“0”

array();   //空数组

未定义的变量       //当然要尽量避免

 

其他数据就当作true来看待了。

 

看手册:PHP手册〉附录〉类型比较表〉使用 PHP 函数对变量 $x 进行比较

 

数组类型array

标识一系列数据的“有序排列”的集合体。

php中,数组的下标可以使用整数或字符串。

数字下标常说“索引号”,

字符串下标常说“键名”。

实际上,在php的报错系统中,都叫做“index”,或offset

数组中还可以存储数组,就可以构成“多维数组”的形式。

数组遍历在php中有专门语法:

foreach( 数组名   as   下标变量$k  =>  值变量$v1 {

//这里就是循环体,就可以使用两个变量$k, $v1

}

对象类型object

php中,对象跟js中的有比较大的区别。

通常,js中的对象,有自定定义的(创建的),也有“现成”,比如windowlocation,标签对象。

但:

php中的对象,通常都是指自己定义的对象,纯语法的。

技术分享


资源类型resource

  • 含义:基本上都是指对外部数据的引用。(数据非php代码生成的)
        不是PHP语言通过某种语法形式“创造”的数据,而是外部本来就有该数据(比如数据库,文件,图片),PHP只是通过某种语法(或方式)来对其进行某些操作。

技术分享



空类型null

只是一个计算机中编程领域的“概念”类型,只是为了表达变量所存储的数据的某种特殊情形所创建的概念——没有存数据,或没有存有效的有意义的数据

 

类型转换

自动转换:

通常自动转换是弱类语言的一个最基本也最方便的一个特征:它会在各种运算中根据运算符的需要也将非该运算符所能处理的数据转换为可以处理的数据。常见情形如下:

  • if(数据){}:转为bool类型

  • 算术运算符:转为数字类型

  • 连接运算符:转为字符串类型

  • 比较运算符:转为布尔类型或数字类型

    • 两边如果有至少一个布尔,则另一边就会转为布尔,并进行比较

    • 否则,就转为数字进行比较

特别常用的一个转换(不管是自动转换还是强制转换),就是字符串转换为数字:

“5”         ==>>  5 //整数

“5.5”       ==>>      5.5浮点数

“5abc”     ==>>      5整数

“5.5ab”   ==>>      5.5浮点数

“abc5”     ==>>      0整数

“abc”      ==>>      0整数

“”           ==>>      0

强制转换

就是通过语法来让某数据转换为另一种类型的数据,语法格式为:

(目标类型)数据;

技术分享


注意:我们并不能使用该语法将任意类型的数据,转换为其他任意类型——因为有些类型之间的转换是没有意义的——系统内部也没有定义过该类型转换的规则。

——最常见的转换通常就发生在基本(标量)数据类型之间。

与类型相关的系统函数

  • var_dump():能够输出一个变量的完整信息。

  • getType():获取一个变量的类型名称,结果是一个单词(字符串), setType();设置一个变量的类型,语法: setType(变量名,目标类型)

技术分享



  • isset(), empty(), unset();

    • isset()判断一个变量是否存在数据:

    • empty()判断一个数据是否为空:接近我们的日常观念(没有就是空)

    • unset():销毁(删除)一个变量。

  • is_XX类型() 系列函数:判断某个数据是否是某种类型,包括:

    • is_int(), is_float(),      is_numeric(),is_bool(),      is_array(), is_scalar():

is_numeric()对:3, 3.5,“3”,“3.14”判断都是true

is_scalar():判断是否为标量类型(即int,float,stirng,bool)

 

运算符

算术运算符

有以下几个:+   -  *    /    %   ++    --

  • 注意:注意取余运算%,先取整,再取余

$v1 = 7.5 % 3;              //结果是:1

$v2 = 7.5 % 3.5;    //结果是:1

对比js中:——js中, 不会进行取整处理

var  v1 = 7.5 %  3       //结果是:1.5

var  v2 = 7.5 %  3.5;       //结果是:0.5

自增自减运算符:

  • 常规:对数字进行自加1或自减1。

  • 字符串: 只能自增,且自增的效果就是“下一个字符”

技术分享


  • 布尔值递增递减无效

  • null递减无效,递增结果为1

前加加和后加加的区别:

  • 前++:先完成变量的递增运算,再取得该变量的值参与别的运算。

  • 后++:先将原来变量的值临时存储,再将变量值递增,最后再将临时存储的值参与别的运算。

  • 推论1:如果独立语句中进行自加运算,前自加后自加没有区别 。

  • 推论2:如果前自加后自加是放在别的语句中,则会有所区别。

推论3: 前加加比后加加效率略高(在循环中建议使用前加加)。




比较运算符:

包括:>   >=   <    <=    ==松散相等    !=    ===严格相等     !==

 

=====的区别:

==:松散相等,比较的是两个数据“类型转换之后”是否有可能相等,也常常认为是“数据内容是否相同”

===:严格相等,全等,只有两个数据的类型和数据的内容都完全一致,才相等。

 

严重推荐参考手册〉〉附录〉〉类型比较表

 

常见不同类型的比较(主要指标量类型的数据)——非正常比较

  • 正常比较——数字的大小比较

  • 如果有布尔值,均转为布尔值比较:规则:true > false

  • 否则,如果有数字,均转为数字比较:

  • 否则,如果两边都是纯数字字符串,转为数字比较

  • 否则,就按字符串比较

技术分享


 

字符串的比较规则为:按字符的先后顺序依次一个一个比较,发现哪个大,则就表示整体大,后续不再比较

 

逻辑运算符:&&   ||   !

前提:都是针对布尔类型的值进行的运算,如果不是布尔,就会转换为布尔。

 

逻辑与:

规则(真值表):

true && true        ==> true;

true && false               ==>false

false && true               ==>false;

false && false        ==>false;

只有两个都是true,结果才是true

只要有一个是false,结果就是false

逻辑或:

规则(真值表):

true || true     ==> true;

true || false            ==>true

false || true            ==>true;

false || false            ==>false;

只有两个都是false,结果才是false

只要有一个是true,结果就是true

逻辑非:

!true ==>false

!false===>true

短路现象之逻辑与短路:

在实际应用中,参与逻辑运算的数据,往往都不是直接的布尔值,而是有关计算之后的布尔结果值。

大致如下:

if( IsFemale( $uName ) &&  isAge($uName) >18){

......echo “女士优先

}

此时,如果IsFemale()函数判断的结果是false,那么后续的函数isAge()就不再调用,自然也不再进行大于18的判断,这是就称为“短路现象”

短路现象之逻辑或短路:

if( IsFemale( $uName )  ||  isAge($uName) < 18){

......echo “有限照顾女士或未成年人

}

此时,如果IsFemale()函数判断的结果是true,那么后续的函数isAge()就不再调用,自然也不再进行小于18的判断,这就是“或运算符短路现象”

 

字符串运算符:

只有一个:  .   

衍生一个:  .=

会将运算符两边的数据转换为字符串。

对比js+(具有双重含义,此时就需要一定的“判断”)

赋值运算符:

只有一个:    =

衍生多个:    +=   -=  *=   /=   %=  .=

基本形式为:

$变量  符合赋值运算符   数据2

这些衍生的赋值运算符,是这种运算的一个简化形式:

$v2  =  $v2  [运算符数据2//某个变量跟另一个数据进行某种运算之后的结果再存入该变量

对比(它不是这种形式的简化):

$v2  =  数据2  [运算符] $v2    //这种形式不应该简化

 

条件(三目)运算符:

一般的运算符需要2个数据参与

有几个运算符只需要一个数据参与: ++,   --   !

则:

条件运算符就需要至少3个数据参与!

形式为:

数据 数据2 :数据3

通常,数据1最终应该是一个布尔值(如果不是,则会当作布尔值来使用)。

含义:

如果数据1true,则运算结果为数据2 否则运算结果为数据3

典型举例:

$score = 66;

$result 1= $score >= 60  ?  “及格”  不及格”;     //结果是“及格”

 

$result 2= $score  ?  “及格”  不及格”;        //结果是“及格”,但含义完全不同,因为即使分数是33,也是及格。只有分数为0才是不及格。

 

三目运算符可以转换为ifelse语句来实现:

if( $score >= 60{

$result1 = “及格";

}

else{

$result1 = “不及格";

}

 

 

 

 

复习要点:

 

 

 

整数类型:

3种表示形式:

$v1 = 123;

$v2 = 0123;    //8进制,实际值83

$c3 = 0x123;  //16进制,实际是291

10转为:2816进制:以该数字连续除以(2816), 将每次除得的余数倒序写出,就是对应的2816进制数字。

实际应用中,有系统函数可以直接获取:decbin(), decoct(), dexhex()

2816进制转为10进制:将每个数字乘以对应位上的权值,并相加所得的结果。

系统函数:bindec(), octdec(), hexdec();

浮点数类型:

2种表示法:

$v1 = 1.23;     //带小数点

$v2 = 123E4;  //带科学计数法的符合Ee

$v3 = 123e4e5;      //是吗?这个不对!

浮点数的小数部分,在二进制层次上,是往往不能准确表示的数据。则,浮点数的大小比较就要非常谨慎:尽量不进行大小比较。如果非要比较,最应该在考虑精确度的基础上,转换为整数进行比较。

 

字符串类型:

单引号字符串:

可识别的转义符:       \\     \’

说明:实际上,只有字符串中的最后一个“\”才必须使用转义符。例:

$v1 = abc\defg’;    //有效

$v2 = abc\\defg’;   //也有效,而且跟上一行一样

$v1 = abcdefg\\’;   //此时“\\”必须写。

双引号字符串:

可识别的转义符:       \\     \”     \n    \r     \t     \$

还有一个特征:可以识别双引号字符串中的变量(以$为标志)。

推论:如果一个字符串中没有需要识别的转义符,也没有需要识别的变量,则推荐使用单引号字符串。

单引号定界符(nowdoc):无转义符

$v1 = <<<’ABCD’

............

ABCD;

双引号定界符(heredoc):

可识别的转义符:\\     \n    \r     \t     \$

$v1 = <<<”ABCD”

............

ABCD;

 

布尔类型:

能被转换为false的值有:””, 0,0.0  “0”, null,  array(),  未定义

其他的都当作true

 

类型转换:

php作为一门弱类型语言,类型的自动转换是很常见的——常态。

类型的强制转换,反而没那么多。

自动转换:通常是根据运算符的需要而发生。

强制转换:

(目标类型)数据

 

算术运算符:+  - *  /  % ++  --

%:取余(取模)运算符,会先将运算数自动转换为整数,再进行运算(对比:js不会转换)

++:自加运算,对参与运算的“变量”自身加1

可以出现在变量的前面(前加加),或出现在变量的后面(后加加)。

前加加后加加对变量本身来说,没有区别(都是自加1),但对其所在行的其他运算或操作有区别:

前加加:先自加,后运算其他;

后加加:先运算其他,后自加。

比较运算符:>   >=   <     <=   ==   !=    ===        !==

比较运算符的规则:

1,常规:对数字进行大小比较。

2,如果不是数字,而包含布尔值,则转换为布尔值运算

3,否则,饱含数字,则转换为数字比较

4,否则,但都是纯数字字符串,也被当作数字比较

5,否则按字符串

逻辑运算符:

前提:都是对布尔值进行运算。如果不是布尔值,就会转换为布尔值进行运算。

逻辑与运算:只有2个都是true,结果才是true

逻辑或运算:只有两个都是false,结果才是false

非:取反。

短路现象:

逻辑与短路:if(  getB1() &&  getB2()  ){ ......},则如果getB1()结果是false,就发生短路了。

逻辑或短路:if(  getB1() ||  getB2()  ){ ......},则如果getB1()结果是true,就发生短路了。

 

 




本文出自 “魂斗罗” 博客,请务必保留此出处http://990487026.blog.51cto.com/10133282/1765960

03 php 数据类型:整数,进制转换,浮点,字符,布尔,数组,空类型,类型转换,算术运算,比较运算

标签:03 数据类型:整数   进制转换   浮点   字符   布尔   数组   

原文地址:http://990487026.blog.51cto.com/10133282/1765960

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!