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;
?>

 

 

 

 

 

posted @ 2018-02-04 20:38  半阙问灵  阅读(129)  评论(0)    收藏  举报