23 、PHP的数据类型与常量使用
1、数据类型之间的相互转换
一种是强制转换:setType(变量,类型)://类型int,integer,float,double,real,bool,boolena,string,array,object
这个函数将原变量的类型改变,var dump();
一、原类型发生转换:
(1)$str="100.12345abc"
setType($str,int);//转换为整型
var-dump($str);
结果为int(100)
(2)$str="100.12345abc"
setType($str,float);//转换为单精度
var-dump($str);
结果为float(100.12345)
(3)$str="100.12345abc"
setType($str,bool);//转换为布尔型
var-dump($str);
结果为bool(true)//bool型非0的数都是真。
二、原类型不变,返回一个新的类型:
在赋值前使用(类型)的形式,不会改变原类型的结果
$a=(int)"123abc";
$变量=intval(变量或值);
$变量=floatval(变量或值);
$变量=stringval(变量或值);
$a=(int)"123abc";//在赋值前转换为整型
(1)
$str="100.12345abc"
$a=(int)$str;
var-dump($a);
var-dump($str);
结果为100,后面是字符串。转换类型不影响原类型。
注意:整型在内存中占4个字节
浮点类型在内存中占8个字节(当浮点类型转换为整型时,将浮点型比作脸盆,将整型比作杯子,如果脸盆的水少于或等于杯子能呈的水,那么就不会出问题,如果脸盆里的水多余杯子里的水,那么水就会溢出,所以转换就会出错误)
整型有一个最大容量,2.147e9.超过这个数值的转换就会出错。例如:
$float=123.456;
$int=(int)$float;
echo $int;//结果是123
如果
$float=200000004435000000000000.3424324;
那么结果会显示为0.
注意:转换浮点型,
$a="";
$int=floatval($a);
echo $int;
输出结果为0,变量为空变量或者全为字母或者在首位无数字而在中间或后面出现数字那么结果也是0.如果在首位出现数字,例如
$a="123sadsdksdf32213";
那么结果为123。
后边这个字母有个特殊法。例如
$a="123.123esadsdksdf32213";转为浮点型的结果为123.123x10^5=12312300
一种是自动转换:最常用的方式,因为这种我们在开发时不需要去管理类型,变量会根据运行环境自动转换
弱类型转换;$a=10; $b="100abc" $c=true; $d=12.34;
$sun=$a+$c;//布尔型自动转换为数字1。结果为11.
$sun=$a+$c+$b;//字符串自动把$b前面数字转化为100,结果为111.
$sun=$a+$c+$b+$d;//浮点数是大,由小的转换为大的,结果为float(123.34)
这就是自动转换,也是PHP开发速度快的原因之一。PHP跟别的语言最主要的区别就是因为它是弱类型。跟C/JAVA区别很大,弱类型很多时候不用管类型,它会自动转换。
2、与变量和类型有关的一些常用函数
isset();判断一个变量存不存在;值如果是null,也表示空
$a=" ";//只要是$a存在哪怕为空,也会输出“11111111111”
if(isset($a)){
echo "1111111111
";
}else{
echo "00000000000
";
}
empty();判断一个变量是否为空//在变量存在的情况下去判断例如“”、“null”都是空
“null”表示变量不存在了
unset();去删除一个变量
setType();设置类型
getType();得到类型
$a=10;
echo getType($a);//得到整型,只得到类型,没有值
var-dump();既显示类型又显示值。例如:
$=10;
if(getType($a)="integer"){
echo"11111111";
}else{
echo "2222222222"
}
最好不要这样写,因为这个函数知识得到类型,然而得到类型不一定去判断,可以把它存到数据库或其他的一切工作。我们有专门判断类型的变量类型测试函数例如;
is_bool();
is_int();
is integer(); is long();//都是判断整型的
is_string();
is_float();
is_array();
is_object();
is_resource();
is_null();
is_scalar();//判断是否是标量,也就是判断是否是整型、浮点型等等
is_numberis();//判断是否为任何类型的数字或者是数字字符串。
is_callable();//判断是否是有效的函数名
例如:$a=array("one", "two", 1, 4, 6, 8, 9);
if(is_array($a)){ //判断数组
print_r($a); //打印数组
}else{
echo $a; //输出变量值
}
3、常量的声明与使用
1、常量是一个简单值的标示符
2、常量定义后不能改变它的值,也不能使用unset()取消。
什么时候我们用常量呢?
你如果觉得一些数据在整个项目运行过程中只用它的值不去改变它的值,这个时候最好声明常量。变量会有被误改的危险。
3、常量可以不予理会变量范围的规则,而在任何地方都可以定义和访问。常量的使用范围要比变量要广
例如;define("HOME", "aaaaaaaaaaaaaaaa");
$a=100;
function demo(){
global $a;//如果不加这个全局变量那么$a不会被输出,后期会讲到
echo $a;
echo HOME;
4、常量使用define(“常量名”,"值");定义
例如:define(“HOME”,"aaaaaaaaaaa");
echo HOME;
5、常量在任何时候都不需要使用“$”,而变量在任何时候都需要使用“$”
6、常量名称习惯都用大写,但是小写也能用。
7、常量的值只能用标量类型(int、float、bool等)
8、常量一定要在声明时就给值。
9、查看常量存在不存在:defined(“常量字符串”)
define("HOME2", "aaaaaaaaaaaaaaaa");
if(defined("HOME")){
echo HOME;
}else{
define("HOME", "bbbbbbbbbbbb");//如果不存在,那么就声明一个
}
echo HOME;
系统还给出了预定义常量和魔术常量。有的固定常量例如;派。3.1514926
echo_file_,"
"
echo_line_,"
"//这俩都是魔术变量
(24)PHP的运算符与表达式
变量和运算符都是语言语法中必须有的比分是一个命令解释器对一个或多个操作数,也就是操作或数值执行某种运算的符号。也称操作符。
计算除了数值外就离不开计算符号,所以根据操作数的个数分类为:
一元运算符:一个操作数前面有一个运算符。例如: !TRUE (将真变成反) “ !”为运算符。
二元运算符;例如:$a+$b $a、$b称为操作数。
三元运算符:例如:true?1=0
按运算符号的不同功能分为:
1、算数运算符:+ — * / % ++ — —
2、字符串运算符(仅限PHP,别的语言没有):只有一个就是“ . ”
3、赋值运算符:= += —= /= %= . =
4、比较运算符:< > >= <= == ===(恒等) !=或 <>(不等于) !==(恒不等)
5、逻辑运算符:&&或and(与) || 或or (或) !或not(非) 亦或(不常用)
6、位运算符:&(按位与) | (按位或) ^(按位亦或) ~(按位非,按位取反) <<(左移) >>(右移)>>>(无符号右移)
7、其他的运算符号:? : ''(两个反引号) @(屏蔽错误输出的) => -> :: & $等,只要是机器里能够运行的符号都可以称为运算符。
我们先来介绍
算数运算符,注意:除了/和%(取运算符在计算机里叫做求模运算符)的除数不能为0。其他的与基本运算一样
“%”的运算呢,首先是将%两边的操作数转化为整数,然后把两边的数相除,得余数。我们在开发中用到%有两个目的,第一个目的是整除运算,例如做日历时判断闰年,
$year=2010;
if(($year%4=0 && $year!=0) ||$year%400=0){
echo "111111111"//表示闰年
}else{
echo "000000000"
}
第二个目的是控制范围,取余不要用小数、也不要用复数(尽量不要用),因为%要把运算符两边的数转为整数再取值。
可以控制一个数不大于10
$dum=9;
echo $dum%10;//结果为9
$dum=19;
echo $dum%10//结果一样为9
$dum=19;
echo $dum%10//结果一样为9。达到控制范围的目的
++ — —
$a=10;
$a++; //$a=$a+1; 先用变量再自增1
++$a; //$a=$a+1; 先用自增1再用变量
$a--; //$a=$a-1; 先用变量再自减1
--$a; //$a=$a-1; 先用自减1再用变量
echo $a;
$a=10;
$b= $a++; //b=10, a=11
$c= --$b; //c=9 , b=9
// 9 + 11
$d=$c++ + ++$c; //d=20, c=11
$e=$d-- - --$d; //d=18, e=2
分析字符串运算符: “.”
“.”可以连接字符串。必须是英文的“.”,也称为连接运算符。不仅可以连接两个字符串,也可以将一个字符串跟任意标量合并成都是新的字符串。例如:
$name="tom";
$age=27;
$height=1.75;
echo "我的名子是:{$name}我的年龄是:{$age}我的身高是:{$height}米
";
echo '我的名子是:'.$name.'我的年龄是:'.$age.'我的身高是:'.$height.'米'.'
';//第二种方式,因为单引号里面是不能有这样的变量的。搜易我们用连接。任何类型都可以跟字符串连接。
echo "\$age=".$age;//结果是$age=27。因为前面那个$age前加的\,已经被转义了,就相当于一个字符,然后与27连接起来。
赋值运算符:就是一个二运算符。左边必须是变量,右边可以使一个表达式。“=”的读法为被设置为或被赋值
$a=10;
$a+=10; //$a=$a+10;
$a-=10; //$a=$a-10;
$a*=10; //$a=$a*10;
$a/=10; //$a=$a/10;
$a%=10; //$a=$a%10;
$a.="abc"; //$a=$a."abc"$a连接字符串后再赋给$a
.=用的比较多。
$str.='';
$str.=''; $str.=' | ';
$str.='
';
$str.='';
echo $str;
比较运算符:称为关系运算符,也称为条件运算符。经常被用到二元运算中,比较后的结果只有两种:布尔型的,要么真要么假。例如:
var dump(5>4);//结果是bool(false)
==(等号).作为比较时一定不要写成一个“=”例如;
$a=100;
if($a="100"){ //会输出11111111
echo "111111111111111";
}else{
echo "0000000000000";
}
但是
$a=100;
if($a="50"){
echo "111111111111111";
}else{
echo "0000000000000";
}//也会输出1111111111111,因为=是赋值语句
===(比较时不仅要求内容相同,也要求类型相同) !==(类型不相同时也可以判断)这两个运算符只有弱类型语言才有这种运算符
$a=100;
if($a==="100"){
echo "111111111111111";
}else{
echo "0000000000000";
}//结果是1111111111,因为它们内容相同,类型相同。有一样不同就会是假、
逻辑运算符:只能操作布尔型的值,处理后的结果也是布尔型的值,
与比较运算符结果一样都是布尔型的,所以这两种类型大多在用在if(),while()。条件语句中。
var_dump(true && true); //true
var_dump(true and false); //false
var_dump(true || false); //true
var_dump(!true); //false
var_dump(!false); //true
$password="123456";
$email="";
if($username=="admin" && $password="123456"){
echo "用户名和密码输入是正确的
";
}
if($username=="" || $password=="" || $email==""){
echo "所有的值一个都不能为空
";
}
if((isset($email) && !empty($email)) || (isset($phone) && !empty($phone))){ //同一级不能出现不同的逻辑运算符,要想出现,只能用括号,先比较括号里面的运算。
echo "有一种联系方式";
位运算符;因为计算机数据都是以二进制的形式存在的。例如灯泡,只有两种状态开、关。两个灯泡就是2的2次方中状态,三个灯泡就是2的3次方中状态,所以32位的计算机是2的32次方种状态。
运算符中允许对整数中指定的位数进行运算。如果位运算左右参数都是字符串,运算符就会将字符串中的ASSCII码值转化过来。如果位运算是浮点数,也会自动转换成整型的运算。位运算对于操作数中每一个进行二进制的数的运算。在PHP很少用到。
位运算符可以与复制运算符结合使用。例如:
$a &=$b;
$a >>= $b;
虽然运算时是以二进制的形式,但是输出结果依然是以整型或字符型。
&:
$a=20; // 16+4 00010100 二进制
$b=30; // 16+8+4+2 00011110 二进制
要学习十进制与二进制的换算
var dump(true||true);//结果为bool(true)
var dump(true | true);//结果为bool(1)
& 和 | 即可以做为逻辑运算符号,又可以作为位运算符号
&& ||
短路问题:&& 和 ||会发生短路
&& 在作运算时, 如果前面的数是false, 则后面是否为true,整个表达式都是false, 所就不去执行后面的操作数。
|| 在作运算时, 如果前面的数是true, 则后面是否为false, 整个表达式都为true,
所就不去执行后面的操作数。
& 或 |在用运算时,两边都会被执行
$num=10;
if($num > 5 || $num++ < 100 ){ //结果是十。如果将||换成&,那么结果是11,。如果将||换成|,结果又是11这是因为短路问题。
}
echo $num;
fopen(“hello.php” ,"r")or die("打开文件失败");以读的形式打开hello.php这个文件。
其他运算符:
条件?成立了就执行这里 :不成立就执行这里
$=10;
$b=$a>5? $a : 5;
echo $b;//因为$a大于5所以结果为10
$page=isset($_GET["page"])?$_GET["page"]=1;//查看有没有page,没有就输出一
echo $page;
$str= 'ipconfig/all' 反引号,相当于执行命令。查询IP地址的。
echo '';//按原型输出
echo $str;//就会输出IP地址
echo '
';
PHP完成不了的我们用系统命令完成,用PHP能完成的我们尽量用PHP而不用系统命令完成。所以大家尽量不要用反引号执行什么命令以后可能会出现跨平台的一些问题
@放到表达式前面,该表达式产生的任何错误提示都将被忽略掉。例如
getType();//错误提示,缺少参数。但是在PHP中一样会输出“#########”。
echo "#########";
如果
@getType();//错误将不再提示。
echo "#########";
不过,有错误要解决,这种符号尽量不要去使用。
所有的运算符都有优先级,先执行什么运算,后执行什么运算。如果我们用优先级写程序,那么别人读你的程序必须也要了解优先级,所以为了增强可读性,我们用()来提高某个运算符先运行来改变优先级
表达式:有变量有运算符的都属于表达式