PHP基础知识(一、静态变量)

变量类型

在PHP中,一共存在8种变量类型:整型,浮点型,字符串,布尔,数组,对象,null,资源

  • 如果一个变量为null,那么在它被声明后,该变量既不会有值,也不会被标注类型

变量检测

isset()函数可以检测变量是否存在,存在返回true,不存在或变量为null返回false

获取变量类型

  • gettype()函数可以用来获取变量类型

  • 判断是否是我们想要的类型用is_int(),is_float()等等

打印变量

  • echo:适合打印字符串和数字

  • print_r:适合打印数组

  • var_dump:所有类型都可以,既可以打印值同时也会打印变量类型

变量类型转换

PHP中变量的类型是可以随时转换的,非常灵活,最常见的是字符串与数字的转换,或是字符串/数字——>布尔值的转换

1
2
3
4
//字符串到数字的转换:从左到右截取,直到碰到不合法的数字,截取出来的部分转换成数字再参与运算
$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()函数可以用来销毁变量,但是当两个变量都指向同一个内存空间【即引用赋值】时,销魂其中一个变量,另一个依然存在,并不会被销毁。当所有指向这个内存空间的变量都被销毁时,该公共内存空间才会被回收。

动态变量

1
2
3
4
$liubei = "河北";
$laoda = "liubei";
$paihang = "laoda";
var_dump($paihang,$$paihang,$$$paihang); //laoda liubei 河北

算术运算符

  • 除数不能为0

  • 两个数相加的和如果超出了 integer 的范围,将会被解释为 float

  • 取模运算时,结果的正负仅取决于被除数

比较运算符

凡运算,必有运算结果:比较运算符的运算结果是布尔类型

1
2
3
4
$a = 5;
$b = "5";
var_dump($a == $b); //true
var_dump($a === $b); //false 全等于不仅要求值相等,类型也必须一致

三元运算符

1
2
3
4
5
//求两个数中较大的数
$a = 10;
$b = 15;
$c = $a>=$b ? $a : $b;
var_dump($c); // 15

逻辑运算符

  • &&:都为真,值才为真

  • ||:只要有一个为真,就为真

递增递减运算符

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
$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
2
3
4
//一个赋值运算有两个作用:1是把3赋给$a;2是返回运算结果,即3
$a = 3;
$res = ($a = 3);
var_dump($res); // 3

continue和break

  • continue:跳过本次循环

  • break:直接终止循环

函数概念

  • 一段封装好的代码,可以随时调用

  • 返回值是只得到这个值,并不会直接输出

函数定义格式

1
2
3
4
function 函数名(){
//执行语句
//return;
}

命名规范:命名规则和变量是一致的,但是函数不区分大小写

函数的调用过程与返回值

函数调用时,代码执行权进入函数,当函数所有语句执行完毕,函数结束,交回执行权,或者函数碰到return语句时,函数返回,教会执行权。

1
2
3
function test(){
return "hello","world"; //错误,直返return返回一个值
}

函数传参方式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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页面中声明的变量叫“全局变量”,函数内部的变量叫“局部变量”

  • 全局变量无法与局部变量进行交互,只有传参时赋值可以

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    //如果想局部变量访问全局变量,就需要使用关键字global
    $a = 22;
    function t(){
    global $a;
    echo $a;
    }
    t(); // 22

    //超全局变量,在页面的任何部分,包括函数,方法等,都可以直接访问
    function t2(){
    print_r($_GET);
    }
    t2();

动态调用函数

可用用变量的值当做函数名,并调用函数

1
2
3
4
5
6
7
8
9
10
function wel(){
echo "wlecome";
}

function beat(){
echo "beat";
}

$heart = "wel";
$heart(); // welcome

字符串定义方式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//定义短字符串
$str1 = 'hello';
$str2 = "world";
//定义大段字符串

//heredoc
$str3 = >>>mark
大段string本身;
mark;

//nowdoc
$str3 = >>>'mark'
大段string本身;
mark;

单双引号的对比

  • 单引号只转义两个符号:’ 和 \

  • 双引号可以解析变量

  • 单引号不需要解析字符串内有没有变量,需要转义的内容也少,速度比双引号要快,优先使用单引号

  • heredoc与nowdoc的区别就是单引号与双引号的区别

数组的声明方式

数组是一种复合数据,可以装下多个值,每个值用不同的键来区分

1
2
3
4
5
6
7
$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或几个数字键,则从最大的数字键,递增生成数字键

  • 如果键声明重复了,后面的值覆盖前面的值

  • 键可以是整数(浮点数会转化为整数)也可以是字符串,如果字符串的内容恰好是整数,也理解成整数

操作数组单元

1
2
3
4
5
6
7
8
9
10
$arr = array('a','b','c');
//增加一个单元
$arr[] = 'd';
$arr[99] = 'e';
//读取单元值
echo $arr[3];
//改一个单元的值
$arr[0] = 'A';
//删除某个单元
unset($arr[1]);

遍历数组

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//对于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 />';
}

数组游标操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//取当前游标指向的数组单元的值
$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:是对全局变量花名册的一个别名,通过该变量,可以任意访问全局变量,简单说,就是将所有全局变量变成其数组里的一个单元

常量系统

1
2
define('PI',3.14);
echo PI;
  • 命名规范:与变量一样,不过习惯上全部大写

  • 声明后,值不能修改,也不能重新声明,也不能销毁这个变量

  • 常量名前不加$

  • 常量一旦定义后,在页面的任何位置都可以访问

    1
    2
    3
    4
    5
    6
    7
    8
    //检测常量是否存在
    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,脚本立即停止执行

浮点数不精确

1
2
3
4
5
6
if((0.3 - 0.2) == 0.1){
echo "相等";
}else{
echo "不相等";
}
//输出 不相等

某些小数在十进制下,是有限的,转成二进制要无限循环,因此,损失一些精度,导致浮点数计算和数学上结果不一致

逻辑运算的短路特性

1
2
3
4
5
6
7
8
9
10
11
12
13
$a = 3;
$b = 5;
if($a=5 || $b=7){
$a++;
$b++;
}
echo $a; //1
echo $b; //6

/*
或运算的优先级比赋值运算的优先级高,经过或运算,得到布尔值true,再赋值给$a,但是布尔值的自增或自减
并不影响自身,所以true值以数字1的形式输出,$b输出结果为6
*/

递归

1
2
3
4
5
6
7
8
//0-100求和
function sum($n){
if($n == 1){
return 1;
}
return $n + sum($n-1);
}
echo sum(100); //5050

静态变量

static变量有一个特点,在第一次函数调用声明之后存在,且不随函数结束而结束,当函数再次调用时,可以直接利用上次结果