3天基础巩固笔记
变量类型
整型,浮点型,字符串,布尔,数组,对象,NULL,资源
NULL是指没有值,也没有类型
$a=null;
变量检测
isset可以检测变量是否存在,
注意:对于NULL,isset也返回false
$a=null;
//会输出不存在
if(isset($a)){
echo '变量a存在';
}else{
echo '变量a不存在';
}
变量类型判断
gettype获取变量类型
is_int(),is_array(),is_float(),is_integer(),is_string(),is_object(),is_bool()
$a=false;
echo gettype($a);
echo '<br>';
if(is_bool($a)){
echo 'a是布尔值';
打印调试变量
echo 字符串
print_r 数组
var_dump 所有类型,打印变量的类型及其值
$a = '1';
$b = array(1,2,'3');
echo $a;
print_r ($b);
echo '<br>';
var_dump($b);
变量类型转换
变量类型可以随时转换,非常灵活
最常见的是字符串与数字的转换
或是数字/字符串 -> 布尔值的转换
//字符串到数字,从左到右截取,直到碰到不合法的数字,截取出来的部分转成数字
$a = 'world12.5hello';
$a =$a + 3;
var_dump ($a);
//数字到字符串
$a = 123;
$a = $a . 'hello';
echo $a;
//到布尔型的判断,以下值都被当成假,其他都被当成真
//'','0',0,0.0,false,NULL,array()
if (''==false){
echo '空字符串为假';
}
赋值
传值赋值,引用赋值
//传值赋值,一个改变了不影响另一个
$li = 29;
$wang = 23;
$wang = $li;
var_dump ($li,$wang);//int(29) int(29)
$li = 'w';
var_dump ($li,$wang);//string(1) "w" int(29)
echo '<br>';
//引用赋值,一个改变了会影响另一个
$li = 29;
$wang = 23;
$wang = &$li;
var_dump ($li,$wang);//int(29) int(29)
$wang = 'w';
var_dump ($li,$wang);// string(1) "w" string(1) "w"
销毁变量
unset
unset引用赋值的某个变量时,不会影响对方
$a = 99;
unset($a);
if(isset($a)){
echo 'a存在';
}else{
echo 'a不存在';
}
echo '<br>';
$li = 29;
$wang = &$li;
var_dump ($li,$wang);//int(29) int(29)
$wang = 20;
var_dump ($li,$wang);//20,20
unset ($li);
var_dump ($li,$wang);//NULL,20
动态变量名
用变量的值再做变量的名,如$$a
$liubei = '河北';
$laoda = 'liubei';
$paihang = 'laoda';
echo $laoda,$$laoda,$$$paihang;//liubei河北河北
算术运算符
//除数不能为0
$a = 10;
$b = 0;
echo $a / $b;
echo '<br>';
//太大转为浮点数
$a = 3200000000;
$b = 3200000000;
$c = $a + $b;
var_dump($c);
echo '<br>';
//取模算法时,结果的正负仅取决于被除数
$a = -10;
$b = -3;
echo $a % $b;
比较运算符
//凡运算必有运算结果,比较运算符的结果是布尔型值
$a = 5;
$b = 3;
$c = $a > $b;
var_dump($c);
$c = ($a == $b);
var_dump($c);
//全等于,要求类型相同且值相等
$a = 5;
$b = '5';
var_dump($a == $b);
var_dump($a === $b);
$res = 0;
if($res === false){
echo '没找到';
}else{
echo '找到了';
}
三元运算符
$a = 15;
$b = 10;
$c = null;
if($a >= $b){
$c = $a;
}else{
$c = $b;
}
var_dump($c);
$c = ($a > $b? $a : $b);
var_dump($c);
//用三元运算符找出三个数中最大的
$a = 1;
$b = 2;
$c = 3;
$d = (a > b)?((a > c)? a:c):((b > c)?b:c);
echo $d;
逻辑运算符
简化这种大量的嵌套
//某女要求有房有车才嫁
$house = true;
$car = false;
if ($house === true){
if($car === true){
echo '嫁';
}else{
echo '不嫁';
}
}else{
echo '不嫁';
}
//有房有车才行
$house = true;
$car = false;
if(($house == true) && ($car == true)){
echo '嫁';
}else{
echo '不嫁';
}
echo '<br>';
//有房或有车都行
$house = false;
$car = false;
if($house || $car){
echo '嫁';
}else{
echo '不嫁';
}
递增递减运算符
$b = 5;
$a = $b++;//1返回b本身的值,2把b的值加1
var_dump($a,$b);//5,6
echo '<br>';
$b = 5;
$a = --$b;//1把b的值减1,2返回新值
var_dump($a,$b);//4,4
字符串运算符
$a = 'hello';
$b = 'world';
echo $a,$b;//这样运算速度比拼接快
echo '~~~';
echo $a.$b;
echo '~~~';
$c = $a.$b;
var_dump ($c);
$d = 112;
$c = $c . $d;
var_dump($c);
switch case控制结构
if-else括号太多,麻烦,可以用这个简化
switch case适合用在验证多个可能的值时使用,不适合用在判断范围
$today = 0;
switch ($today){
case 1:
echo '今天是星期1';
break;
case 2:
echo '今天是星期2';
break;
case 3:
echo '今天是星期3';
break;
case 4:
echo '今天是星期4';
break;
case 5:
echo '今天是星期5';
break;
case 6:
echo '今天是星期6';
break;
case 7:
echo '今天是星期7';
break;
default:
echo '你来自火星';
}
while循环
while
$i = 0;
while($i<=10){
echo $i++,'<br/>';
}
do while
先执行一次再说
$i = 100;
do{
echo '我照样执行一次';
}while($i<10);
for循坏
循环的一般要素:初始化(1),判断(2),执行体(3),修改变量(4)
for(1;2;4){
3
}
for($i = 10; $i>=3 ; $i -=3){
echo '喝酒<br/>';
}
可以同时执行多个变量
for($i=1, $j=5;$i<=5 && $j>=1; $i++,$j--){
echo $i,'~',$j,'<br/>';
}
break和continue
//跳过4号
for ($i=0; $i < 10; $i++){
if($i == 4){
continue;
}
echo $i,'<br/>';
}
//找到7之后,后面的就不看了
for ($i=0; $i < 10; $i++){
if($i == 7){
echo $i,'找到';
break;
}else{
echo $i,'<br/>';
}
}
函数的概念
一段封装好的代码,可以随时调用
function he($a,$b){ $c = $a + $b; echo $c; } he(1,3);
函数的定义格式
function 函数名([参数1,参数...N]){
//执行语句
//return;
}
命名规范:对于函数,命名规则和变量是一样的,但是函数不区分大小。
函数的调用过程与返回值
函数调用时,代码执行权进入函数,
当函数所有语句执行完毕,函数结束,交回执行权
或者函数碰到return语句时,函数返回,交回执行权
function t2(){ echo '1'; echo '2'; echo '3'; return 'good'; echo '4'; echo '5'; return 'study'; } $res = t2();//打印出123 echo $res;//结果是good
可以没有返回值,但只能有一个,如果写了两个返回值就会导致语法错误
函数参数的传值方式
function t($a){ $a +=1; } $b =3; t($b);//传参$b,相当于把$b的值赋给$a,而$a是函数内部的值,怎么变和外界无关, echo '<br/>'; function t2(&$a){ $a +=1; } $b =5; t2($b); echo $b;//结果是6,$a和$b指向了同一个地址, //不推荐这种传参方式,因为函数内部的语句影响到了外部的变量,破坏了函数的封装性
函数中变量的作用域
在php页面中声明的变量,叫“全局变量”
函数内的变量,叫“局部变量”
$a = 22; function t(){ $b = 99; echo $a; } t(); echo $b; //声明全局变量 global function t2(){ global $a; echo $a; } t2(); //超级全局变量,在页面的任何部分,包括函数,方法等,都可以直接访问 function t3(){ print_r($_GET); } t3();
动态调用函数
可以用变量的值当作函数,并调用函数
function wel(){ echo 'welcome'; } function beat(){ echo 'beat'; } $heart = 'wel'; $heart();//$heart的值是wel,因此调用执行wel();
时间戳函数
时间戳是指自1970.01.01 00:00:00到现在这一瞬间经过的秒数
echo time();//返回时间戳,精确到秒 echo '!<br/>'; print_r(microtime());//返回微秒和秒 echo '!<br/>'; print_r(microtime(true));//返回精确到微秒的秒数 echo '!<br/>'; $start = microtime(true); for($i=1;$i<10000;$i++){ $tmp = 13333/234; } $end = microtime(true); echo $end - $start;//算这个程序用了多少秒
时间戳格式化
在数据库里面都是存的时间戳,格式在php手册上查一查
http://php.net/manual/zh/function.date.php
$time = time(); echo date('Y-m-d 星期N h:i:s' , $time),'<br/>';//后面这个参数是可选的,不写就是现在时间 echo date('Y-m-d 星期N h:i:s' , 0),'<br/>';//0就是1970.01.01 00:00:00,如果显示时间是8点,是时区原因 echo gmdate('Y-m-d 星期N N:i:s' , 0),'<br/>';//gmdate按格林威治时间算。h是12小时制,H是24小时制
解析检测日期
echo mktime(14,35,20,11,27,2013);//取得一个日期的 Unix 时间戳,某时间过去了多少秒了。这些参数都是可选,可以从右到左省略,不填就按当前来算 echo '!<br/>'; echo strtotime('now'),'<br/>';//当前时间戳。将任何字符串的日期时间描述解析为 Unix 时间戳 echo strtotime('now +1 day'),'<br/>'; echo strtotime('now -1 day'),'<br/>'; //检测日期是否合法 var_dump(checkdate(2,29,1900));
字符串定义方式
heredoc nowdoc定义大段文本
$str1 = 'hello'; $str2 = "hello"; echo $str1 ,'<br />',$str2 ,'<br />'; //heredco nowdoc定义大段文本,这两的差别就是单双引号的差别 $str3 = <<<HTML//这里的HTML就是个标识,可以随便改, hello world abc ok now; HTML;//上面的改成什么,这里就改成一样的 echo $str3 ,'<br />' $str4 = <<<'INTRO'; 远看山有色, 近听水无声 INTRO; echo $str4;
单双引号对比
转义 变量解析 速度
$str1 = '\' \\ \n \t \v \$';//只能转移'和\,别的都是原样输出来 echo $str1; echo '<br />'; $str2 = "\" \\ \n \t \v \$";//双引号能转义的东西比较多 echo $str2; //===双引号里的变量能解析===// $age = 29; $str3 = '李明今年 $age 岁'; $str4 = "李明今年 $age 岁"; echo $str3,'<br/>';//李明今年 $age 岁 echo $str4,'<br/>';//李明今年 29 岁 //速度// /* 单引号不需要分析串内有没有变量,需要转义的内容也少,速度比双引号要快,优先使用单引号 */
字符串常用函数
//strlen长度 $str1 = 'hello'; echo strlen($str1), '<br />'; $str2 = '中国人'; echo strlen($str2),'<br />'; echo mb_strlen($str2,'utf-8'),'<br />';//有几个字 //strpos搜索 $str = 'abcde'; $char = 'a'; if(strpos($str, $char) !== false){ echo '含有' ,$char, '<br />'; }else{ echo '不含有' ,$char,'<br />'; } //str_replace替换 $str = 'hi, fuck'; echo str_replace('fuck', '**', $str),'<br />'; //strtr替换一批字符串 $str = '男人,女人,男孩,女孩'; echo strtr($str,array('男'=>'女','女'=>'男')),'<br />'; //substr截取子字符串 $str = 'tommrow is another day'; echo substr($str,0,3),'<br />';//0开始,截3个字节 echo substr($str,0,-3),'<br />';//第3个参数如为负,代表结束位置,后往前数 echo substr($str,-3,-10),'<br />';//这样就啥玩意没有啦 //explode拆分字符串 $str = 'tech,linux,mysql'; $arr = explode(',',$str);//用逗号拆分 print_r($arr); echo implode($arr,',');//用逗号把数组粘起来
数组特点和声明方式
//数组是一种复合数据,可以装下多个值,每个值用不同的键来区分 $arr = array('001'=>'春','002'=>'夏','003'=>'秋'); print_r($arr);
数组类型
索引数组,关联数组,多维数组
$arr = array(0=>'东',1=>'南',2=>'西');//键不必有特殊意义,纯数字,这种叫索引数组 $stu = array('name'=>'小华','age'=>'28');//字符串做键,一般能体现该单元的内容,如age->年龄,关联数组 $arr = array(0=>'a',1=>array('stu'=>'li','bag'=>array('yuwen','shuxue')));//多维数组 print_r($arr);
数组键规则
//如果不声明键,会从0 1 2..递增来生成键 $arr = array('a','b','c'); print_r($arr); //如果已经存在某1个或几个数字键,则从最大的数字键,递增生成数字键 $arr = array(3=>'a','b','c'); print_r($arr); //如果键声明重复了,后面的值覆盖前面的值 $arr = array(3=>'a',3=>'b',4=>'c'); print_r($arr); //键可以是整数,也可以是字符串 //浮点数转成整数,如果字符串的内容恰好是整数,也理解成整数 $arr = array(2=>'布',2.5=>'尔','2.5'=>'教','2'=>'育'); print_r($arr);
操作数组单元
<?php
$arr = array('a','b','c');
//增一个单元
$arr[] = 'd';
$arr[99] = 'e';
$arr['stu'] = array('li','wang');
print_r($arr);
//读取单元值
echo $arr[3],'<br />';
echo $arr['stu'][1];//读这个wang
//改单元值
$arr[0] = 'A';
print_r($arr);
//删除某个单元
unset($arr[1]);
print_r($arr);
?>
遍历数组/循环数组
<?php //for循环,对于0..1..2...递增的索引数组 $arr = array('a','b','c','d','e','f'); for($key = 0; $key<count($arr); $key++){ //count反应数组单元的个数 echo $arr[$key],'<br />'; } //关联数组 $arr = array('age'=>28,'height'=>180,'name'=>'lisi'); foreach($arr as $key => $value){ echo $key ,'~' , $value , '<br />'; } //只要值,不要键 foreach($arr as $v){ echo $v , '<br />'; } //把下面这个数组的每个单元值变成原来的2倍 $stu = array('lisi'=>3,'wang'=>5,'zhang'=>6); foreach($stu as $key => $value){ echo $key ,'~',$value*2 ,'<br />'; } ?>
数组游标操作
<?php /* current() next() prev() end() */ //取当前游标指向的数组单元的值 $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 echo '<br />'; //用来遍历 while($v = current($arr)){ echo $v , '<br />'; next($arr); } //碰到这个情况,可以用数组游标的each函数来处理 $arr = array(1,2,3,false,4,5,6); while($v = current($arr)){ echo $v , '<br />'; next($arr); } ?>
数组常用函数
<?php $arr = array('a'=>'张龙' , 'b'=>'赵虎' , 'c'=>NULL); //某个键是否存在 if( isset($arr['c'])){ echo 'c号单元存在'; }else{ echo 'c号单元不存在'; } echo '<br />'; if( array_key_exists('c', $arr)){ echo 'c号单元存在'; }else{ echo 'c号单元不存在'; } echo '<br />'; //某个值是否存在 if(in_array('赵虎' , $arr)){ echo '有赵虎'; } else { echo '没有赵虎'; } ?>
数组案例之小羊繁殖
<?php $arr = array('a' , 'b' , 'c' , 'd'); echo array_push($arr, 'e'), '<br />';//往数据尾部加入单元,并返回操作之后的数组长度 echo array_pop($arr), '<br />';//e 弹出尾部单元 echo array_pop($arr), '<br />';//d echo array_unshift($arr, 'z');//往数据头部加入单元 print_r($arr);// z a b c echo array_shift($arr);//弹出头部单元 print_r($arr);// a b c echo '<br />'; //小羊繁殖。有一只羊,第一年和第三年会生小羊,第五年死去,求20年后共有几只羊 $arr = array(1, 0, 0, 0, 0); for($i=1;$i<=20;$i++){ $tmp = $arr[1]+$arr[3]; array_unshift($arr, $tmp); array_pop($arr); } print_r($arr); echo array_sum($arr); ?>
超级全局变量
心情不好不想做笔记
常量
意义:声明后不能修改
声明:define
特点:声明值后不能修改值,也不能重新声明,也不能销毁。在页面任意处都可以访问
检测
案例
<?php define('PI' , 3.14); echo PI ,'<br />';//常量名字前面不加$ //命名规范:和变量一样,只不过习惯上全大写 //检测常量 if(defined('PI')){ echo '常量已存在'; }else{ echo 'PI常量不存在'; } //真实开发一般这样 if(!defined('HEI')){ define('HEI',8846); } //动态常量名,用变量的值做常量的名字 $chang = 'HEI'; echo $chang , '<br />'; echo constant('HEI'), '<br />'; echo constant($chang), '<br />'; ?>
文件包含/文件引入
作用在于代码的重用
我们可以把常有的代码段写在一个文件里,当需要这些代码时,引入这个文件就可以了
include include_once
require require_once
_once作用:只引入一次,如果之前已引用过,不再重复引用
注意:不加_once速度快一些
include require区别:
如果引入文件不存在,include尽量往下执行,报warning警告
require则直接报fatal error致命错误,脚步立即停止执行
include('./25-sub.php');//相当于把25-sub.php的文件内容替换本行
进制
<?php //8进制,前面加0代表8进制 echo 0123 , '<br />';//从右到左,分别是以1顶1,以1顶8,以1顶64 //16进制,前面加0x代表16进制,0 1 2 3 4 5 6 7 8 9 a b c d e f echo 0x123 , '<br />';//从右到左,分别是以1顶1,以1顶16,以1顶256 echo 0x1c , '<br />'; //2进制,PHP目前不支持直接表示 //从右到左,分别是以1顶1,以1顶2,以1顶4,以1顶8 /* 10进制 2进制 5 0000 0101 255 1111 1111,128+64+32+16+8+4+2+1 -1 1111 1111 像上面8个1,到底理解成255,还是理解成-1,这个取决于程序 比如在masql中,int则理解成-1,unsigned int理解为255 */ ?>
位运算
是针对字节上的位来进行运算
把位的0/1当成假/真,针对每个位上的逻辑运算,就是位运算
10进制 2进制
5 0000 0101
12 0000 1100
& ---------
0000 0100
| ---------
0000 1101
^ ---------
0000 1001
<?php echo 5 & 12 , '<br />';//4 echo 5 | 12 , '<br />';//13 echo 5 ^ 12 , '<br />';//9 echo ~5 , '<br />';//-6,1111 1010 //利用位运算的左移,使整数增大2倍 $a = 3; echo $a << 1 , '<br />';//6 echo 8 >> 2 , '<br />';//2 ?>
位运算与PHP错误报告设置
PHP脚本的错误,分多个等级,如致命错误,Notice,warning,N多级
如何方便设置报错级别?
PHP把不同等级的级别用数字来表示,比如
1,2,4,8,16
。。。
0000 0001
0000 0010
0000 0100
0000 1000
综上,想报告所有错误,可以把所有错误级别 a | b | c |...
//设置报告所有错误
error_reporting(E_ALL);
//啥错误都不报,为了防止小黑阔看到路径
error_reporting(0);
//除了notice,别的都报
error_reporting(E_ALL ^E_NOTICE); echo E_NOTICE; echo $a;
浮点数不精确
某些小数在10进制下,是有限的,转成2进制要无限循环,因此损失一些精度,导致浮点数计算和数学上结果不一致
下面代码就会显示不等
<?php if((0.3 - 0.2) == 0.1){ echo '相等'; }else{ echo '不等'; } ?>
//银行一般都存整数,精确到分
逻辑运算的短路特性与运算符优先级
<?php $house = false; $car = true; if($house && $car){//房子已经为假,又用并且计算,结果为假,程序不会去判断$car的值 echo '嫁'; }else{ echo '不嫁'; } $b = 1; if($house && ($b = 6)){// $b = 1, 6被短路,没机会执行 } echo $b,'<br />'; if($house || ($b = 6)){// $b = 6 } echo $b,'<br />'; $b = 1; if($car || ($b = 6)){// $b = 1 } echo $b,'<br />'; //利用短路写出简短的判断代码 if(!defined('PI')){ define('PI',3.14); } defined('PI')||define('PI',3.14); ?>
如下结果为啥是1,5呢?而且这样写是会被打的哦,牵涉到多个条件判断要用括号哒
<?php $a = 3; $b = 5; if($a = 5 || $b = 7){//因为这里||优先级比=高,所以先算‘5 || $b’,得出一个bool值,为真,赋给a,而$b=7被短路了 $a++; $b++; } echo $a,$b; ?>

浙公网安备 33010602011771号