数据类型
整体划分
- 标量类型: int, float, string, bool
- 复合类型: array, object
- 特殊类型: null, resouce
整数类型int, integer
3种整数表示法
- 十进制写法:123:
$n1 = 123;
- 八进制写法: 0123
$n2 = 0123;
- 十六进制写法: 0x123
$n3 = 0x123;
浮点类型float, double, real
有两种写法:
$v1 = 1.234; //带小数点,,就是浮点类型
$v2 = 1.234E3;//含义是:1.234乘以10的3次方,即1234,带E的形式就是浮点数
$v3 = 1234E3;//结果值是1234000,但也是一个浮点数。
浮点数不应直接进行大小比较
因为浮点数在系统内部(cpu级别),很可能都是不精确表达。
要想进行比较,我们只能考虑自己应用中的精度要求的基础上,将其转换为整数进行比较。
通常的做法是:乘以10的精度位数数次方,比如精度要求3位有效数字,则乘以103次方
- 当整数运算的结果超出整数的范围后,会自动转换为浮点数。
整数的范围,在32位系统下,大约正负20多亿
字符串类型string
js中,虽然有2种字符串表达形式,但也应该理解为是一种字符串:
var str1 = ‘单引号字符串’
var str2 = “双引号字符串”;
但在php中,单引号和双引号字符串,是有不同细节含义的字符串。
php中,有4种字符串形式:
单引号字符串:
结果:
双引号字符串:
结果:
更多的转义符见手册如下:
\
nowdoc(单引号)定界符字符串:
.0
输出结果为:
heredoc(双引号)定界符字符串:
结果:
布尔类型:bool, boolean
用于标识某种只有两个状态值的数据:true,false——吃没吃,去没去,有没有。。。。。
在应用出,我们常常会(需要)直接将一个数据(可能是各种其他类型)当作一个布尔值来进行判断。
那么此时其实发生的是:会将该数据隐含转换为布尔值。
最常见的语法形式就是:
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中的对象,有自定定义的(创建的),也有“现成”,比如window,location,标签对象。
但:
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个数据参与!
形式为:
数据1 ? 数据2 :数据3
通常,数据1最终应该是一个布尔值(如果不是,则会当作布尔值来使用)。
含义:
如果数据1为true,则运算结果为数据2, 否则运算结果为数据3
典型举例:
$score = 66;
$result 1=
$score >= 60 ? “及格” : “不及格”; //结果是“及格”
$result 2=
$score ? “及格” : “不及格”; //结果是“及格”,但含义完全不同,因为即使分数是33,也是及格。只有分数为0才是不及格。
三目运算符可以转换为if else语句来实现:
if( $score >= 60){
$result1 = “及格";
}
else{
$result1 = “不及格";
}
流程控制
流程图基本符号:
开始结束:
语句(块):
判断 :
输入输出:
走向
分支结构
if语句:
if(条件判断){
//语句块
}
if else 语句:
if(条件判断){
//分支1
}
else{
//分支2;
}
if
else if语句
if -else if -else语句:
switch语句:
switch(一个数据$v1){ //判断此v1变量跟下面的某个是否相等,如果相等,则进入对应进程。
case 状态值1:
//进程1
[break;]
case 状态值2:
//进程2
[break;]
case 状态值3:
//进程3;
[break;]
。。。。。。
[default :
//默认进程。
]
}
应用冲,break通常都会用上;只有一些特殊数据或需求的时候,可能不用。
如果没有使用break,则一旦某个状态满足,就会继续执行后续状态中的进程代码,而不再判断。
循环结构:
while循环:
$v1 = 10; //初始化循环变量
while( $v1〉4 ){ //判断循环变量的条件
//语句快
echo “abc”;
$v1--;
}
循环3要素:
1,循环变量初始化
2,循环变量判断
3,循环变量改变
此3 要素通常适用于所有循环过程。
do while循环
do{
//循环体
}while(条件判断);
含义:
先执行一次循环体,然后判断条件,如果条件满足,则继续回去执行循环体,然后再判断,依次类推。
for循环:
循环的中断
这里指的中断,适用于所有循环。
循环的中断有两种情况:
break中断: 终止整个循环语句,而跳出循环进入到循环结构之后的语句
continue中断:终止当前正在执行的循环体中的语句,而进入到循环的下一次过程里(改变,判断)
中断语句的语法如下:
break $n; //$n是一个大于等于1的整数,表示要中断的循环层数;
continew $n;
所谓循环层数,是指一个循环中又嵌套了循环的情况。
以当前循环为“起点”,表示第一层,往上(外)数,就是2,3,4层。。。。
部分流程控制的替换语法:
if ( ... ) :
//语句块
endif;
if ( ... ) :
//语句块
else:
//语句块
endif;
if ( ... ):
//语句块
elseif( ... ) :
//语句块
elseif( ... ):
//语句块
else:
//语句块
endif;
switch( ... ) :
case ...
case ...
endSwitch;
while(...):
//语句块
endwhile;
for(...; ...; ...):
//语句块
endfor;
foreach( ):
//语句块
endForeach;
控制脚本执行进度
die(“输出内容”)
含义:终止php脚本的运行(后续代码不再执行),并输出其中的内容
也可以:die(); die;
exit是die的同义词。
die是一种“语言结构”,并非函数,可以不写括号。
echo也是一种语言结构,而非函数:
echo (“abc”);
echo
“abc”;
echo
“abc”, “def”, 123;
sleep($n);
含义:让php脚本停止$n秒,然后继续执行。
数组基础
数组基础
php中,数组的下标可以是整数,或字符串。
php中,数组的元素顺序不是由下标决定,而是由其“加入”的顺序决定。
定义:
$arr1 = array(元素1,元素2,。。。。。 );
array(1, 5,
1.1, “abc”, true,
false); //可以存储任何数据,此时为“默认下标”,
array(2=>1, 5=>5,
3=>1.1, 7=>“abc”, 0=>true);//下标可以任意设定(无需顺序,无需连续)
array(2=>1, 5,
1=>1.1, “abc”, 0=>true)//可以加下标,也可以不加(默认下标),下标分别是:2,3,1,4,0
//默认下标规则:前面已经用过的最大数字下标+1
array(2=>1, ‘dd’=>5,
1=>1.1, “abc”, 0=>true)//混合下标,同样遵循默认下标规则
array(-2=>1, ‘dd’=>5,
1.1, “abc”, true); //负数下标不算在整数下标中,而只当作字符下标
//则最好3项的下标是:0, 1, 2
array(2.7=>1, ‘dd’=>5,
1=>1.1, “abc”, 0=>true);//浮点数下标为自动转换为整数,且直接抹掉小数
array(“2.7”
=>1, ‘dd’=>5, “11”=>1.1,
“abc”, true)//纯数字字符串下标,当作数字看待,
//则此时下标为:2, ‘dd’, 11, 12, 13
array(2=>1, ‘dd’=>5,
true=>1.1, “abc”, false=>true)//布尔值当下标,则true为1,false为0;
array(2=>1, ‘dd’=>5,
2=>1.1, “abc”, true)//如果下标跟前面的重复,则单纯覆盖前面同名下标的值
//此时相当于为:array(2=>1.1, ‘dd’=>5, “abc”,
true)
其他形式;
$arr1[] = 1;
$arr1[] = 5;
$arr1[] = 1.1; //直接在变量后面使用[],就成为数组,并依次赋值。
。。。。
$arr2[‘aa’] = 1;
$arr2[‘bbbcc’] = 5;
$arrr2[5] = 1.1;
。。。。。。。。
这种形式写的下标,其实跟使用array语法结构几乎一样。
取值:通过下标。
赋值(同定义):
数组的分类
从键值关系:
关联数组:通常是指下标为字符串,并且该字符串大体可以表达出数据的含义的数组。
例:$person =
array(
“name” => “小花”,
“age”=>18,
“edu” => “大学毕业” ,
);
索引数组:
通常是指一个数组的下标是严格的从0开始的连续的数字下标——跟js数组一样。
从数组层次来分:
一维数组:
就是一个数组中的每一个元素值,都是一个普通值(非数组值)
$arr1 = array(
“name” => “小花”,
“age”=>18,
“edu” => “大学毕业”
);
二维数组:
一个数组中的每一项,又是一个一维数组。
$arr1 = array(
“name” => array(‘小花’, ‘小芳’, ‘小明’, );
“age”=> array(18, 22,
19),
“edu” => array(“大学毕业”, ‘中学’, ‘小学’)
);
多维数组:
依此类推。。。
多维数组的一般语法形式:
$v1 = 数组名[下标][下标][.....]
数组遍历
遍历基本语法
foreach( $arr as [
$key => ] $value ) //$key可以称为键变量,$value可以称为值变量。
{
//这里就可以对$key 和 $value 进行所有可能的操作——因为他们就是一个变量
//$key 代表每次取得元素的下标,可能是数字,也可以能是字符串
//$value 代表每次取得元素的值,可能是各种类型。
//此循环结构会从数组的第一项一直遍历循环到最后一项,然后结束。
}
交换原理:
foreach 遍历细节探讨
- foreach也是正常的循环语法结构,可以有break和continue等操作。
- 遍历过程中值变量默认的传值方式是值传递。
- 遍历过程中值变量可以人为设定为引用传递:
- foreach($arr as $key =>
&$value){ ... } - 键变量不可以设定为引用传递
- foreach默认是原数组上进行遍历。但如果在遍历过程中对数组进行了某种修改或某种指针性操作(就是指前面的指针函数),则会复制数组后在复制的数组上继续遍历循环。
foreach中如果值变量是引用传递,则无论如何都是在原数组上
原文地址:https://www.cnblogs.com/sword082419/p/9011757.html