变量类型
在PHP中,一共存在8种变量类型:整型,浮点型,字符串,布尔,数组,对象,null,资源
如果一个变量为null,那么在它被声明后,该变量既不会有值,也不会被标注类型
变量检测
isset()函数可以检测变量是否存在,存在返回true,不存在或变量为null返回false
获取变量类型
gettype()函数可以用来获取变量类型
判断是否是我们想要的类型用is_int(),is_float()等等
打印变量
echo:适合打印字符串和数字
print_r:适合打印数组
var_dump:所有类型都可以,既可以打印值同时也会打印变量类型
变量类型转换
PHP中变量的类型是可以随时转换的,非常灵活,最常见的是字符串与数字的转换,或是字符串/数字——>布尔值的转换
//字符串到数字的转换:从左到右截取,直到碰到不合法的数字,截取出来的部分转换成数字再参与运算 $a = "12hello"; $a = $a + 3; var_dump($a); //int 15
以下值都被当成布尔型的假,而其他值都被当成布尔型的真
"" (an empty string)
0 (0 as an integer)
0.0 (0 as a float)
"0" (0 as a string)
NULL
FALSE
array() (an empty array)
$var; (a variable declared, but without a value)
变量赋值
传值赋值:变量各有自己的内存空间,传值后不影响原有变量的值【两个人看两台电视】
引用赋值:两个变量指向公共的内存空间,一个变化,另一个也会变化【两个人看一台电视】
变量销毁
unset()函数可以用来销毁变量,但是当两个变量都指向同一个内存空间【即引用赋值】时,销魂其中一个变量,另一个依然存在,并不会被销毁。当所有指向这个内存空间的变量都被销毁时,该公共内存空间才会被回收。
动态变量
$liubei = "河北"; $laoda = "liubei"; $paihang = "laoda"; var_dump($paihang,$$paihang,$$$paihang); //laoda liubei 河北
算术运算符
除数不能为0
两个数相加的和如果超出了 integer 的范围,将会被解释为 float
取模运算时,结果的正负仅取决于被除数
比较运算符
凡运算,必有运算结果:比较运算符的运算结果是布尔类型
$a = 5; $b = "5"; var_dump($a == $b); //true var_dump($a === $b); //false 全等于不仅要求值相等,类型也必须一致
三元运算符
//求两个数中较大的数 $a = 10; $b = 15; $c = $a>=$b ? $a : $b; var_dump($c); // 15
逻辑运算符
&&:都为真,值才为真
||:只要有一个为真,就为真
递增递减运算符
$b = 5; $a = $b++; //先赋值,再自增 var_dump($a,$b); // 5 6 $b = 5; $a = ++$b; ////先自增,再赋值 var_dump($a,$b); // 6 6
字符串运算符
//字符串与字符串 $a = "Hello"; $b = "world"; $c = $a.$b; var_dump($c); //helloworld //字符串与数字 $d = 112; $c = $c.$d; var_dump($c); //helloworld112 //下面哪个语句运行速度快 $a = "Hello"; $b = "world"; echo $a,$b; //更快 echo $a.$b;
赋值运算符
//一个赋值运算有两个作用:1是把3赋给$a;2是返回运算结果,即3 $a = 3; $res = ($a = 3); var_dump($res); // 3
continue和break
continue:跳过本次循环
break:直接终止循环
函数概念
一段封装好的代码,可以随时调用
返回值是只得到这个值,并不会直接输出
函数定义格式
function 函数名(){ //执行语句 //return; }
命名规范:命名规则和变量是一致的,但是函数不区分大小写
函数的调用过程与返回值
函数调用时,代码执行权进入函数,当函数所有语句执行完毕,函数结束,交回执行权,或者函数碰到return语句时,函数返回,教会执行权。
function test(){ return "hello","world"; //错误,直返return返回一个值 }
函数传参方式
function t($a){ $a += 1; } $a = 3; t($a); echo $a; //3 传参外部$a,相当于将外部$a的值,赋给函数内部$a,而内部$a的值怎么变,和外界无关 //引用传值 function t2(&$a){ $a += 1; } $b = 5; t($b); echo $b; //6 $a和$b指向同一个地址 //不推荐这种传值方式,因为函数内部的语句影响到了函数外部的变量,破坏了函数的封装性
函数中变量的作用域
PHP页面中声明的变量叫“全局变量”,函数内部的变量叫“局部变量”
全局变量无法与局部变量进行交互,只有传参时赋值可以
//如果想局部变量访问全局变量,就需要使用关键字global $a = 22; function t(){ global $a; echo $a; } t(); // 22 //超全局变量,在页面的任何部分,包括函数,方法等,都可以直接访问 function t2(){ print_r($_GET); } t2();
动态调用函数
可用用变量的值当做函数名,并调用函数
function wel(){ echo "wlecome"; } function beat(){ echo "beat"; } $heart = "wel"; $heart(); // welcome
字符串定义方式
//定义短字符串 $str1 = 'hello'; $str2 = "world";
//定义大段字符串 //heredoc $str3 = >>>mark 大段string本身; mark; //nowdoc $str3 = >>>'mark' 大段string本身; mark;
单双引号的对比
单引号只转义两个符号:' 和 \
双引号可以解析变量
单引号不需要解析字符串内有没有变量,需要转义的内容也少,速度比双引号要快,优先使用单引号
heredoc与nowdoc的区别就是单引号与双引号的区别
数组的声明方式
数组是一种复合数据,可以装下多个值,每个值用不同的键来区分
$arr = array('001'=>'春','002'=>'夏','003'=>'秋','004'=>'冬'); //索引数组:键不必有特殊意义,纯数字,这种叫“索引数组” $arr = array(1=>'东',2=>'西',3=>'南',4=>'北',); //关联数组:字符串做键,一般能体现该单元的内容 $stu = array('name'=>'小明','age'=>'20'); //多维数组:数组里面有数组 $arr = array(0=>'a',1=>array('stu'=>'li','bag'=>array('语文','数学')));
数组键的规则
如果不声明键,会从0,1,2,3……递增来生成键
如果已经存在1或几个数字键,则从最大的数字键,递增生成数字键
如果键声明重复了,后面的值覆盖前面的值
键可以是整数(浮点数会转化为整数)也可以是字符串,如果字符串的内容恰好是整数,也理解成整数
操作数组单元
$arr = array('a','b','c'); //增加一个单元 $arr[] = 'd'; $arr[99] = 'e'; //读取单元值 echo $arr[3]; //改一个单元的值 $arr[0] = 'A'; //删除某个单元 unset($arr[1]);
遍历数组
//对于0,1,2……递增的索引数组,使用for循环 $arr = array('a','b','c','d'); for($key=0; $key<count($arr); $key++){ echo $arr[$key],"<br />"; } //对于关联数组,使用foreach遍历 $arr = array('name'=>'lisi','age'=>'20','height'=>'180cm'); foreach($arr as $key => $value){ echo $key,':',$value,'<br />'; } foreach($arr as $v){ echo $v,'<br />'; }
数组游标操作
//取当前游标指向的数组单元的值 $arr = array('a','b','c'); echo current($arr); //a //把数组的游标往后移 next($arr); echo current($arr); //b //把数组的游标移到最后 end($arr); echo current($arr); //c //把数组的游标往前移 prev($arr); echo current($arr); //b //重置游标 reset($arr); echo current($arr); //a
超级全局变量
$_GET:地址栏上获取的值
$_POST:POST表单发送的数据
$_REQUEST:既有GET也有POST的内容,如果含有相同的数据,POST会覆盖GET,而这可以再php.ini配置文件中进行设置更改
$_ENV:操作系统的相关环境信息,容易暴露服务器信息,一般不允许打印,可通过修改php.ini实现
$_SERVER:端口,IP地址等环境信息
$_DLOBALS:是对全局变量花名册的一个别名,通过该变量,可以任意访问全局变量,简单说,就是将所有全局变量变成其数组里的一个单元
常量系统
define('PI',3.14); echo PI;
命名规范:与变量一样,不过习惯上全部大写
声明后,值不能修改,也不能重新声明,也不能销毁这个变量
常量名前不加$
常量一旦定义后,在页面的任何位置都可以访问
//检测常量是否存在 defined('PI'); //动态常量名 define('PI',3.14); $pai = 'PI'; echo constant('PI'); //3.14 echo constant($pai); //3.14
文件包含
文件包含的作用在于代码的重用,我们可以把常用的代码写到一个文件里,当需要这些代码工作时,直接引入这些文件就可以了
include(); include_once(); require(); require_once();
_once的作用:只引用一次,如果之前已经引用过,就不再引用,但是不叫_once执行速度快一些
include和require的区别:如果引入的文件不存在,include尽量往下执行,报warning,require则直接报fatal error,脚本立即停止执行
浮点数不精确
if((0.3 - 0.2) == 0.1){ echo "相等"; }else{ echo "不相等"; } //输出 不相等
某些小数在十进制下,是有限的,转成二进制要无限循环,因此,损失一些精度,导致浮点数计算和数学上结果不一致
逻辑运算的短路特性
$a = 3; $b = 5; if($a=5 || $b=7){ $a++; $b++; } echo $a; //1 echo $b; //6 /* 或运算的优先级比赋值运算的优先级高,经过或运算,得到布尔值true,再赋值给$a,但是布尔值的自增或自减 并不影响自身,所以true值以数字1的形式输出,$b输出结果为6 */
递归
//0-100求和 function sum($n){ if($n == 1){ return 1; } return $n + sum($n-1); } echo sum(100); //5050
静态变量
static变量有一个特点,在第一次函数调用声明之后存在,且不随函数结束而结束,当函数再次调用时,可以直接利用上次结果