PHP学习笔记

220 阅读21分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

PHP学习笔记

注:本文为7天学会PHP部分阅读笔记

一、PHP中的注释、变量和输出

标识符:以英文字符或者下划线开头,由英文字符、下划线、阿拉伯数字组成的字符序列

区分大小写 不要使用关键字 做到见名知意

注释 :

  行注释  //   #    
  块注释   /*    */

查看网页源代码时看不到php源代码,只能看到被服务器解析成的html的代码

html的注释 : <!-- -->

PHP 是弱类型,不需要先定义,直接使用就行

变量的值可以发生改变,变量的类型也可以发生改变

$x=true

$y=false

echo $x=1       echo$y   无输出

$aa=1 . 2       "."为连接符

$bb=1.2      “.”为小数点
var_dump($ww)     查看变量的类型和值

变量的特点:

1.必须要以$开始。如变量x必须要写成$x
2.变量的首字母不能以数字开始
3.变量的名字区分大小写
4.变量不要用特殊符号、中文,_不算特殊符号
5.变量命名要有意义(别写xxx,aaa,ccc 这种 变量名)

注意: 变量不能以数字开始,但是数字可以夹在变量名中间和结尾

​ 变量不能有特殊符号,但是_不属于特殊字符

echo 显示命令,用来显示任何可见的字符

<?php

echo 123;

?>

<?php

$iphone=6088;
echo $iphone;

?>

二、PHP数据类型

1、整型,也就是整数

integer 英文简写 int

整型在计算机里面是有最大值和最小值范围的

64位计算机一次运行处理的最大范围:

-2的64次方至 2的64次方减一

申明变量类型,十六进制中的英文不区分大小写

<?php

$int=1000;
echo $int

?>

###2、布尔类型

true (真),false(假)

申明变量

<?php

$buer=true;
$bool=false;

?>

注意:true和false外面不要加引号

$a=false;
$b=NULL;
$c=null;

一般来说,1为true,0为false,=== 全等,类型和数值都相等

3、字符串

在PHP 语言中声明字符串有三种方式: 1.用单引号声明 2.用双引号声明 3.用字界符声明(需要输入非常大段的字符串时使用)

字界符声明 1).在变量后面的等号写三个小于号(<<<)。 2).然后在<<<后面写上字符(建议英文大写字符)。如下例中的:ABC 3).然后换行写上任意想写的字符

<?php

$dingjie=<<<ABC
      你还
      在
      家里
      吗?
ABC;
?>

双引号和单引号的区别

  1. 双引号解析变量,但是单引号不解析变量。
  2. 在双引号里面插入变量,变量后面如果有英文或中文字符,它 会把这个字符和变量拼接起来,视为一整个变量。一定要在变量后面接上 特殊字符,例如空格等分开。
  3. 如果在双引号里面插变量的时候,后面不想有空格,可以拿大 括号将变量包起来。
  4. 双引号解析转义字符,单引号不解析转义字符。但,单引号能 解析' 和\
  5. 单引号效率高于双引号,尽可能使用单引号
  6. 双号和单引号可以互插!!!双引号当中插入单引号,单引号 当中插入变量,这个变量会被解析。
  7. 神奇的字符串拼接胶水——(.)点,用来拼接字符串。
  8. 我们将定界符声明字符串视为双引号一样的功能来看待
<?php

$wenhou='你在干什么?';
$str="$wenhou 会不会显示呢";
$str1='$wenhou 会不会显示呢';
echo $str;
echo $str1;

?>

注意:双引号需要解析变量,因此双引号的效率没有单引号高。我们 如果为了更高的效率,我们通常使用单引号

$st3 = 'You\'re students.'

转义字符:

\n 回车
\t 缩进
\\    表示\
\t      制表
\'		‘
\"		“

n12br用于 \n \r \t 等特殊字符,使输出有效果

<?php

//声明一个字符串,记住是双引号
$string = “每天10分钟\n给梦想\t一个机会”;
echo $string;

?>
输出结果:
每天10分钟
给梦想	一个机会
<?php

//声明一个字符串,记住是单引号
$string = '每天10分钟\n给梦想\t一个机会';
echo $string;

?>
输出结果:
每天10分钟\n给梦想\t一个机会 

4、浮点型

声明方式:

普通申明和科学申明(带有小数点或者科学计数法)

<?php

//声明变量 fudian 的值为12121.3132
$fudian = 12121.3132;
echo $fudian;
//声明变量$fl 的值为0.8873
$fl = 0.8873;
var_dump($fl);

?>
4e1.0    错误 ,e的后面必须是整数,e的前面可以是数(正负号,可以带小数点)

var_dump() 是一个函数。向括号()中间插入变量。这个函数,会打印出来 数据类型,还会对应显示变量的长度和值。 var 是指变量的英文 : variable

5、数组类型

数组类型:表示很多相似的数据,为了批量处理,PHP提供了数组数据类型

若干个键值对,数组的每个元素都有键和值,键又称之为下标

$a[] = 'wuhan';    键0
$b[1] = 'changsha';    键1
print_r($b);        专门用于数组

$b[] = 'zhugeliang';
$b[] = 'simayi';
$b[] = 'zhuyu';
print_r($b);
echo $b[3];

关联数组
echo "<pre>"
$ city =array(
	'hubei'  =>   'wuhan'
	'hunan'  =>   'changsha'
	'jiangxi'=>    'nanchang'
    'China'  =>     'beijing'
);
print_r($city)


$stu['name'] = 'liubei';
$stu['age'] = 19;
$c = ['liubei','guanyu','zhangfei','zhaoyun']
print_r($c);
$d=['liubei','guanyu','zhangfei','zhaoyun',2=>'machao'];
print_r($d);
$e = array(
	'age' => '18',
	'sex' => 'female',
	'email' => 'a@com',
				'wuhan',       wuhan是值,可以不要
);

二维数组

$a = ['wuhan','changsha']    //$a是一维数组,包含两个元素‘wuhan’和‘changsha’
$b[]=['wuhan','changsha','nanjing'];    //$b是二维数组,包含一个元素$b[0],$b[0]是一维数组,包含三个元素。

PHP三种错误

error warning notice

ini_set('display_crrors',0);     //不显示warning notice信息(可以防止攻击网站)

6、if 和else 语法

<?php

$pao=ture;
if($pao){
	echo '我愿意去死';
	echo '我好喜欢你。';
}
else{
	echo"我不愿去死";
	echo"再见!";
}

?>

7、空字符NULL

空(null)不是false ,不是0, 也不是空格

主要有以下三空情况会产生空(null)类型:

1.通过变量赋值明确指定为变量的值为NULL

2.一个变量没有给任何值

3.使用函数unset()将变量销毁掉

<?php
$n = null;
var_dump($n);

8、与null相关的两个函数

empty()可以向括号中间传入一个变量。这个变量的值如果为false或者为 null的话,返回true。

isset()可以向括号中间传入一个或者多个变量,变量与变量间用逗号分开。 只要有一个变量为null,则返回false。否则,则返回true。

声明一个数组

<?php
$shuzu = arry(1,2,3);
?>

9、查看数据类型

1.gettype(传入一个变量) 能够获得变量的类型 2.var_dump(传入一个变量) 输出变量类型和值

<?php

$float = 88.8;
$type = gettype($float);
echo $type;
?>

<?php
$str = '你喜欢香蕉还是苹果?'
var_dump($str);
?>

10、判断数据类型

我们使用is_* 系列函数。 is_types这一系列的函数,来进行判断某个东西 是不是某个类型。如果是这个类型返回真,不是这个类型返回假。

is_int 是否为整型
is_bool 是否为布尔
is_float 是否是浮点
is_string 是否是字符串
is_array 是否是数组
is_object 是否是对象
is_null 是否为空
is_resource 是否为资源
is_scalar 是否为标量
is_numeric 是否为数值类型
is_callable 是否为函数

11、数据类型的自动转换和强制转换

PHP7中有些地方我们可以强制指定类型,也可以不强制指定类型

布尔值的自动类型转换

下面的情况是布尔值判断时的自动类型转换:
1,整型的0为假,其他整型值全为真
2, 浮点的0.0,布尔值的假。小数点后只要有一个非零的数值即为真。
3,空字符串为假,只要里面有一个空格都算真。
4,字符串的0,也将其看作是假。其他的都为真
5,空数组也将其视为假,只要里面有一个值,就为真。
6,空也为假
7, 未声明成功的资源也为假

三、PHP中的函数

1、定义

函数的英文叫做function,function 的解释项中有另外一个含义:功能。

函数的就是功能,调用一个函数就是在调用一个功能。

2、特点

函数是条狗,哪里需要哪里吼

通过上句话,我们能得到几个不同的规律:

  1. 需要用一个函数的时候,就吼一声它的名字
  2. 函数可以反复去吼,吼了它的名字它就过来了。也就是函数可以反复调用

3、函数的分类

自定义函数

语法:

function 函数名([参数名 1[=值 1], 参数名 2[=值 2], 参数名 n[=值 n]])
{
函数中的功能体
[return 返回值]
}

语法规定:

1. 函数以 function 开始
2. function 后面接空格,空格后接函数名
3. 函数名与变量命名规则基本一样,但是不同的是:函数名不区分大小写
4. 所谓参数其实就是变量
5. 函数名后接括号,括号内跟参数,参数全都有[](中括号)括起来了,代
表参数可填可不填
6. 如果有参数的话,参数后可以接(=)等号,等号接默认值。参数值也是
用[](中括号)括起来的,代表选填
7. 函数后的参数变量,主要功能是把函数体外的变量值,传入函数体内来使
用,函数体的变量和函数体外的变量通常是两个不同的变量。
8. 函数中的具体功能(功能体)用大括号括起来,代表这是一个函数的功能
区间
9. 函数可以有返回值也可以没有返回值,用[](中括号)括起来的,代表选
填。
10.return 后接空格,空格后接返回值,若有 return,return 后的代码均
不执行。
11.函数的执行没有顺序关系,可以在定义处之前的位置调用
12.函数不能被定义两次,即函数不能被重载

例子:

1、函数可以重复调用,且函数名不区分大小写

<?php

function name(){
    echo"我是小明";

}
name();
name();
Name();
?>
结果:
我是小明我是小明我是小明

2、函数的参数若是定义了,未传参数,代码会报错。如果参数有默认值,参数可以不填。参数就是变量

<?php
function test($num){
    
}
test();

?>
结果:报错
<?php

function test($num=10){
    echo $num;

}
test();
test(88);

?>
结果:
1088

3、函数后的参数可以有多个,函数后如果有有默认值和无默认值的参数,通常把无默认值的参数写 在最前面

<?php
function test($a,$b=10,$c=5){
    echo $a+$b+$c;

}
test(1);

?>
结果:
16

4、函数体内的变量与函数体外的变量没有任何关系

<?php
//定义变量$hello 的值为 10
$hello = 10;
//函数后的参数(形式上的参数,参数)处写上变量名为$hello
function demo( $hello ){
//形参带入了函数体内,函数体内变量$hello 改为了 250
$hello = 250;
//输入 2 个 250 相加的结果
echo $hello + $hello;
}
//将函数体外的变量$hello,传入变量的参数处(实际传入的参数,实参),显示出的结果500
demo($hello);
//此处$hello 的值输出,依然为 10
echo $hello;
?>

例子:

<?php

$a=10;
function test($a){
    $a=100;
    echo $a+$a;
}
test($a);
echo $a;

?>

结果:
20010

5、函数体中若有return,return后的代码不执行

<?php

function test($a){
    echo $a+$a;
    return;
    echo "666";
}
test(10);

?>
结果:
20

6、函数执行完后,return 可把函数体内的值,带到函数体外

<?php

function test(){
    $a=10;
    $b=20;
    $result=$a+$b;
    return $result;
}
$c=test();
echo $c;

?>
结果:
30

7、可以在定义函数之前调用函数,函数不能重载,即不能定义两个名称相同的函数

<?php
test();
function test($a=10){
    echo $a+1;
}
?>
结果:
11

自定义函数高级调用

1、回调函数

回调函数,就是在处理一个功能的时候,我让让这个功能自定义能力再强一些,我准许调用这个函数的时候,还可以传入一个函数配合、协助进行处理。

回调函数:在一个调数里面,再传入一个函数名,将函数名加上()括号。识为变量函数,配合执行。

例子:

<?php

function woziji($one,$two,$func)    #$func是一个变量函数
{
//检查$func 是否是函数,如果不是函数停止执行本段代码,返回 false
    if (!is_callable($func)) {
        return false;
    }
    echo $one + $two + $func($one, $two);
}


function xue($a1,$a2){

    $result = ($a1+$a2)*2;
    return $result;
}


function xi($b1,$b2){
    $result = $b1-$b2;
    return $result;

}

echo woziji(20,10,'xue');
//将 plusx2 改成 jian 试试结果
echo woziji(20,10,'xi');

?>

2、变量函数

可变函数仅仅是可变变量的一个变种、变形表达。可变函数,我们也会称呼为变量函数

首先看一下可变变量

<?php

$hello = 'world';
$world = '你好';
echo $$hello;      //输出的结果为:你好

?>

变量函数的用法

<?php
function test1(){
    echo '天王盖地虎';
}
function test2(){
    echo '小鸡炖蘑菇';
}

$x = 'test1';

$x();
//把$x,变为了 test1,把test1后加上了一个括号,就执行函数了
$y = 'test2';
$y();

?>
结果:
天王盖地虎小鸡炖蘑菇

3 匿名函数 所谓匿名,就是没有名字。 匿名函数,也就是没有函数名的函数。 匿名函数的第一种用法,直接把赋数赋值给变量,调用变量即为调用函数。 匿名函数的写法比较灵活。 (1)变量函数式的匿名函数

$greet = function($name)
{
echo $name.',你好';
};
$greet('明天');
$greet('PHP 学院');
结果:
明天,你好!PHP学院,你好!

上例中的函数体没有函数名,通过$greent 加上括号来调用的,这就是匿名函数。

(2)回调式的匿名函数 我们将之前的例子拿过来。实际使用场景中,我们要通过一个函数实现更多 的功能。但是,我又不想专门定义一个函数。

<?php

function woziji($one,$two,$func){
//检查$func 是否是函数,如果不是函数停止执行本段代码,返回 false
if(!is_callable($func)){
return false;
}
//我把$one、$two 相加,再把$one 和$two 传入$func 这个函数中处理一次
//$func 是一个变量函数,参见变量函数这一章
echo $one + $two + $func($one,$two);
}
woziji(20,30,function( $foo , $bar){
$result = ($foo+$bar)*2;
return $result;
}
);


?>
结果:
150

4、内部函数

内部函数,是指在函数内部又声名了一个函数

注意事项:

1、内部函数名,不能是已经存在的函数名

2、假设在函数a里面定义了一个内部函数,不能调用两次函数

<?php
function foo()
{
    echo"我是函数foo呦,调一下我才会执行定义函数bar的过程<br />";
    function bar(){
        echo '在foo函数内部有一个函数叫做bar函数 <br /> ';

    }

}
// 现在还不能调用bar()函数,因为它还不存在
foo();
//现在可以调用 bar()函数了,因为 foo()函数的执行使得 bar()函数变为已定义的函数
bar();
//再调一次foo()会不会报错呢?
//foo();

?>

如果不调用foo()函数无法执行bar()函数,因为bar()在foo()内部

foo()调用两次会报错

5、变量作用域

我们发现实参为foo,在调用demo的时候,让foo,在调用 demo 的时候,让foo 和n指向到了同一个存储区域,当n 指 向到了同一个存储区域,当n 的值发生变化的时候。那么$foo 的值也发生变化

<?php
$foo=100;
function demo(&$n){
    $n = 10;
    return $n+$n;
}
echo demo($foo)."<br />";

echo $foo;
?>
结果:
20
10

6、递归函数

递归函数的规定:函数体内调用函数自己

  1. 代码是从上到下执行的,所有代码没有 exit 等停止符,函数必须执行完。
  2. 如果函数从函数 A 跳至函数 B 后,必须把函数 B 执行完成再执行函数 A 余下的代码。
  3. 递归函数必须要能执行完有结束条件,不然函数就会限入死循环。函数会 永远的自我执行下去。
<?php
$n = 2;
function dg( $n ){
    echo $n.'<br />';
    $n = $n - 1;
    if($n > 0){
//在函数体内调用了 dg 自己哟
        dg($n);
    }else{
        echo '--------------';
    }
    echo '俺是狗蛋,俺还没执行' . $n . '<br />';
}
dg($n);
?>
结果:
2
1
--------------俺是狗蛋,俺还没执行0
俺是狗蛋,俺还没执行1

7、静态变量

静态变量的特点:声名一个静态变量,第二次调用函数的时候,静态变量不会再初始化变量,会在原值的基础上读取执行

<?php
function test()
{
    $a = 0;
    echo $a;
    $a++;
}

test();
test();
test();
test();
test();
test();

?>
结果:000000
<?php
function test()
{
    static $a = 0;
    echo $a;
    $a++;
}

test();
test();
test();
test();
test();
test();

?>
结果:012345

8、使用系统内置函数

  1. 如果代码能赚钱,帮你赚钱最多的是基本语法
  2. 如果你还在当程序员,你看手册的时候可能比你看老婆的时间还长

使用函数的重点:

  1. 了解函数的功能,特别是常用函数的功能

  2. 了解函数的参数

  3. 了解函数的返回值

我们针对上面的三块,讲解 6 个函数,这 6 个函数,概况了函数的基本用 法的全部注意事项:

  1. 直接返回布尔型,如 bool copy ()

  2. 带有 MIXED 参数的函数如何调用。Mixed 表示任何类型的数据。如 Array_unshift()

  3. 参数中带有&符的参数,一定要传一个变量做为参数。函数里面改变了他 的值。

  4. 带有[]的参数,表示可选项。

  5. 带有…的参数,表示可以传任意多个参数。

  6. 带有 callback 的参数,表示回调函数。需要传一个函数进来。Array_map()

  7. 函数支持的版本你要了解 实验 1,拿 copy()这个函数来举例:返回 bool 值的,通常为操作是否成功、验证是 否通过、检查是否正确等。 我们拿 copy 这个函数来看:

    bool copy ( string $source , string $dest [, resource
     $context ] )
    

    这个函数的功能为: 拷备一个文件 返回值为为: bool 型值,就是成功返回 true,失败返回 false 参数为: 两个字符串的值,一个是 copy 的源文件,一个为目标文件。第三个参 数可选的,不常用,我们不管它。 所以,我们就可以推理出下面的实验了:

      <?php
      if(copy('abc.txt','bcd.txt')){
      echo '复制成功';
      }else{
      echo '复制失败';
      }
    

    2,Mixed 表示任何类型的数据。如 Array_unshift() 我们来看这个函数:

      int array_unshift ( array &$array , mixed $value1 [, mixed
      $... ] )
    

    功能: 操作一个数组,向数组中之前插入其他类型的参数。 返回值: int 类型,可能就是插入成功最后的个数 参数: 第一个参数为&符,也就是在操作的过程中,改变了第一个参数的 值。引用传参。也就是操作这个数组,向这个数组中传入参数。会直接改变这个 数组的值。 第二个参数为 mixed,因为数组可以存入多个不同的类型.mixed 是指混合 的意思。因此,mixed 是指可传入任意类型 第三个数数加了中括号,我们所有遇到中括号的。都是指后面的参数可传, 也可以不传。 第四,最后还看到了三个...(省略号)。代表可以传入任意多个参数。 示例:

    <?php
      $queue = array("凤姐", "芙蓉");
      array_unshift($queue, "杨幂", "姚晨");
      print_r($queue);
      ?>
    

    3, 遇到 callback 的传函数或者匿名函数进去协助处理,让功能更强大。

      bool array_walk ( array &$array , callable $callback [,
      mixed $userdata = NULL ] )
    

    功能: 传入一个回调函数,将数组的原来的组操作,并且发生变化。 返回值: bool 值 也就是意味着,提示成功或者失败 参数: 第一个参数是要操作的数组。 第二个参数是 callback 代表着可以传入函数或者匿名函数。 我们来写个例子,加强理解:

    <?php
      $shuaige = array("a" => "wuyanzhu", "b" => "huangxiaoming", "c" => "ninzetao");
      function test_print($item2, $key)
      {
      echo $key ." ---". strtoupper($item2) . "<br />\n";
      }
      echo '<pre>';
      var_dump($shuaige);
      echo '</pre>';
      array_walk($shuaige, 'test_print');
      echo '用自定义函数 test_print 执行后的效果:';
      echo '<pre>';
      var_dump($shuaige);
      echo '</pre>';
      ?>
    

    通过上例,我们发现数组中的每个参数和值都被修改了。上例大家只需要理 解看见传 callback 的,需要传入函数协助处理就可以。不用理解。我们在下一 章的数组部份,学习完数组,大家可以再看看。 函数支持的版本号很重要

    array_column
    php5>=5.5.0
    

    这是一个系统函数,而不是自定义的函数。系统函数手册中存在这个函数, 可是为什么无法调用执行这个函数呢?请注意,(PHP 5 >= 5.5.0),你可以 phpinfo()看一下你当前的版本。有的时候可能是因为你的版本太低,或者你所 在的版本中没有这个函数,会提示函数不存在。 有事没事查手册,手册比老婆还要亲。

    文件包含函数

    在实际开发中,常常需要把程序中的公用代码放到一个文件中,使用这些代 码的文件只需要包含这个文件即可。这种方法有助于提高代码的重用性,给代码 的编写与维护带来很大的便利。在 PHP 中,有 require、require_once、include、 include- once 四种方法包含一个文件

    函数包含失败特点
    include返回一条警告文件继续向下执行,通常用于动态包含
    require一个致命的错误代码就不会继续向下执行。通常包含极为重要的文件,整个代码甭想执行
    include_once返回一条警告除了原有include的功能以外,他还会做once检测,如果文件曾经已经被包含过,不再包含
    require_once一个致命的错误除原有的功能外,会做一次once检测,防止文件反复被包含

    注意:

    1、少用带once的函数,因为它会消耗跟多的资源去做检测的工作

    2、include文件只需要编译一次,因为每次包含include都会再执行一次对应的代码

例子1:include包含函数的功能

<?php
<?php
function demo(){
    echo "aaaa";
    }
function test(){
    echo "cccdddeee";
}
?>


>
<?php
include "eg1.php";
demo();
test();

?>

结果:
aaaacccdddeee

例子2:require和include的不同

include包含不存在的test文件,会产生警告继续执行下面的程序
<?php
include "eg1.php";
include "test.php";
demo();
test();

?>
结果:
Warning: include(): Failed opening 'test.php' for inclusion (include_path='.;C:\php\pear') in D:\phpStudy\WWW\eg2.php on line 3
aaaacccdddeee
require包含不存在的test文件,会产生错误并停止执行程序
<?php
include "eg1.php";
require "test.php";
demo();
test();
?>
结果:
PHP Warning:  require(test.php): failed to open stream: No such file or directory in D:\phpStudy\WWW\eg3.php on line 3
PHP Fatal error:  require(): Failed opening required 'test.php' (include_path='.;C:\php\pear') in D:\phpStudy\WWW\eg3.php on line 3

例子3:include和include_once的区别

include包含两次
<?php
include "eg1.php";
include "eg1.php";
demo();
test();

?>
结果:
Fatal error: Cannot redeclare demo() (previously declared in D:\phpStudy\WWW\eg1.php:3) in D:\phpStudy\WWW\eg1.php on line 4
PHP Fatal error:  Cannot redeclare demo() (previously declared in D:\phpStudy\WWW\eg1.php:3) in
include_once包含两次
<?php
include_once "eg1.php";
include_once "eg1.php";
demo();
test();

?>
结果:
aaaacccdddeee

include_once 不报错的原因是因为:他检测了 functions.php 曾经包含
过,不再进行包含引入了。

9、数学中常用的函数

在这里插入图片描述 以上函数不需要全部掌握,需要用的时候再查找

常用的函数

函数名描述实例输入输出
abs()求绝对值$abs=abs(-4.2);//4.2数字绝对值数字
ceil()进一法取整echo ceil(9.999);//10浮点数进一取整
floor()舍去法取整echo floor(9.999);//9浮点数直接舍去小数部分
fmod()浮点数取余"x=5.7;x = 5.7;y = 1.3;r=fmod(r= fmod(x, y);//y);// requals 0.5, because 4 *1.3 + 0.5 = 5.7 "两个浮点数,x>y浮点余数
pow()返回数的n次方echo pow(-1,20);//1基础数n次方乘方值
round()浮点数四舍五入echo round(1.95583,2);// 1.96一个数值保留小数点后多少位,默认为0,四舍五入后的结果
sqrt()求平方根echo sqrt(9); //3多个数字或数组平方根
max()求最大值"echo max(1, 3, 5, 6,7); // 7 echo max(array(2,4, 5)); // 5"多个数字或数组返回其中的最大值
min()求最小值echo min(1,2,3)//1多个数字或数组返回其中的最小值
mt_rand()更好的随机数echo mt_rand(0,9);//n最小/最大随机数随机返回范围内的值
rand()随机数echo rang(0,9)//n最小/最大随机数随机返回范围内的值
pi()获取圆周率的值echo pi(); //3.1415926535898获取的圆周率

10、获取日期时间信息函数

1、时区

1884 年在华盛顿召开国际经度会议时,为了克服时间上的混乱,规定将全球划 分为 24 个时区。在中国采用首都北京所在地东八区的时间为全国统一使用时间。

2、世界时

不光是天文学家使用格林尼治时间(英文简写:GMT),就是在新闻报刊上 也经常出现这个名词。我们知道各地都有各地的地方时间。如果对国际上某一重 大事情,用地方时间来记录,就会感到复杂不便.而且将来日子一长容易搞错。 因此,天文学家就提出一个大家都能接受且又方便的记录方法,那就是以格林尼 治(英国某地区)的地方时间为标准。

3、unix时间戳

电脑本身不认识时间,我们在电脑里面设置一个时间方便运算。于是我们规定了一种计算方式,unix 时间戳。从 Unix 纪元(1970 年 1 月 1 日零时)开始到一个时间经过的秒数。

设置时区的函数

1、date_default_timezone_get()

用法:

string date_default_timezone_get ( void )

获取一个脚本中所有日期时间函数所使用的默认时区
<?php
echo date_default_timezone_get()
?>
结果:
UTC

2、date_default_timezone_set()

用法:

bool date_default_timezone_set ( string $timezone_identifier )

<?php
//定义一个时区常量
define('TIME_ZONE','Asia/shanghai');
//执行函数
date_default_timezone_set(TIME_ZONE);
echo date("Y-m-d H:i:s")
?>
结果:
2020-05-19 13:02:39

time()获取当前的时间戳

<?php
$time=time();
print_r($time)
?>
结果:
1589864727

11、“亚麻跌”是PHP学习时间处理的关键

Y 英文是 year,为年份代表年 ——亚 m 英文代表 month,为月份代表——麻 d 英文代表 day,为日期 代表——跌

显示当前时间

echo date("Y-m-d H:i:s");

date()函数用于将一个时间进行格式化输出,以方便时间的显示或存储

语法:

string date ( string $forrnat [, int $tirnestamp] )

getdate用来获取当前系统的时间,或者获得一个时间戳的具体含义。时间戳是一个长整数

语法:

array getdate ([ int $timestamp = time() ] )

例子:

<?php
$mytime=getdate();
print_r($mytime);

?>
结果:
Array
(
    [seconds] => 36
    [minutes] => 53
    [hours] => 6
    [mday] => 19
    [wday] => 2
    [mon] => 5
    [year] => 2020
    [yday] => 139
    [weekday] => Tuesday
    [month] => May
    [0] => 1589871216
)

Process finished with exit code 0

日期验证函数

checkdate()

如果是有效的时间就返回真,如果不是有效的时间就返回假

<?php
var_dump(checkdate(12, 31, 2018));
var_dump(checkdate(2, 29, 2011));
?>
结果:
bool(true)
bool(false)

程序执行时间检测

microtime()这个函数,能够返回当前unix时间戳和微秒数

用法:

mixed microtime ([bool $get_as_float])

<?php
$time_start=microtime(true);
for($i=0;$i<10000;$i++){

}
$time_end=microtime(true);
$time=$time_end-$time_start;
echo"这个脚本执行的时间为 $time secomds\n";

?>
结果:
这个脚本执行的时间为 0.0008080005645752 secomds

12、字符串常用函数

我们最常使用的两个系列的字符串

1、单字节字符串处理函数

2、多字节字符串处理函数

3、字符编码转换函数 在这里插入图片描述 在这里插入图片描述

四、PHP数组和数据结构

1、数组的定义

数组可以存入多个不同类型的数据,是一个复合数据类型

数组的英文是array

声名数组

<?php
$shu = array(1,1.5,true,'天王盖地虎,小鸡炖蘑菇');
echo'<pre>';
var_dump($shu);
echo '</pre>';
?>
结果:
array(4) {
  [0]=>
  int(1)
  [1]=>
  float(1.5)
  [2]=>
  bool(true)
  [3]=>
  string(33) "天王盖地虎,小鸡炖蘑菇"
}

索引数组若不强制声明他的下标,他的下标从0开始,如果我们指定下标,他的下标就为我们指定的值

2 、向索引数组中增加元素

数组元素的增加

<?php
 $minren=array(
     '杨幂',
     '王珞丹',
     '刘亦菲',
     '黄圣依'
 );
$minren[]='范冰冰';
$minren[100]='范爷';
$minren[]='李晨';
echo '<pre>';
var_dump($minren);
echo '<pre>';

?>

结果:
array(7) {
  [0]=>
  string(6) "杨幂"
  [1]=>
  string(9) "王珞丹"
  [2]=>
  string(9) "刘亦菲"
  [3]=>
  string(9) "黄圣依"
  [4]=>
  string(9) "范冰冰"
  [100]=>
  string(6) "范爷"
  [101]=>
  string(6) "李晨"
}
向索引数组中增加元素用: 数组变量名[]、数组变量名[键值]这两种方式来增加元素

数组元素的删除

<?php
 $minren=array(
     '杨幂',
     '王珞丹',
     '刘亦菲',
     '黄圣依'
 );
unset($minren[3]);
$minren[]='刘德华';
echo '<pre>';
var_dump($minren);
echo '<pre>';

?>

结果:
array(4) {
  [0]=>
  string(6) "杨幂"
  [1]=>
  string(9) "王珞丹"
  [2]=>
  string(9) "刘亦菲"
  [4]=>
  string(9) "刘德华"
}
删除元素后后面的下标不会自动向前移动
删除掉其中的某个值,新加入的值不会替换掉原来的位置,依然遵循最大值加1的原则

数组元素的修改

<?php
 $minren=array(
     '杨幂',
     '王珞丹',
     '刘亦菲',
     '黄圣依'
 );
$minren[2]='秦霄云';
echo '<pre>';
var_dump($minren);
echo '<pre>';

?>
结果:
array(4) {
  [0]=>
  string(6) "杨幂"
  [1]=>
  string(9) "王珞丹"
  [2]=>
  string(9) "秦霄云"
  [3]=>
  string(9) "黄圣依"
}
变量名[键]=‘新值’;来修改元素

声明数组的其他方式

<?php
//直接写一个变量后面加上中括号,声明变量
$qi[] = '可口可乐';
$qi[10] ='百事’;
echo '<pre>';
var_dump($qi);
echo '</pre>';
?>
<?php
$minren = [
'杨幂',
'王珞丹',
100 => '刘亦菲',
'黄圣依',
'范冰冰'
];
echo '<pre>';
var_dump($minren);
echo '</pre>';
?>

关联数组

<?php
$drink = [
    '美' => '凤姐',
    '很美' => '芙蓉姐姐',
    'verymei' => '杨幂',
    '心中滴女神呀' => '华妃',
    100 => '孙俪',
    '娘娘',
];
// 输出 $rela
echo '<pre>';
var_dump($drink);
echo '</pre>';
?>

结果:
array(6) {
  ["美"]=>
  string(6) "凤姐"
  ["很美"]=>
  string(12) "芙蓉姐姐"
  ["verymei"]=>
  string(6) "杨幂"
  ["心中滴女神呀"]=>
  string(6) "华妃"
  [100]=>
  string(6) "孙俪"
  [101]=>
  string(6) "娘娘"
}

关联数组的增删改和普通数组一样

3、多维数组

  1. 一维数组 数组里面没有其他数组,只有单纯的一些变量或者值。
  2. 二维数组 数组里面插入了单层的一个数组,或者多个数组
  3. 三维数组 在数组(A)里面插入了一个数组(B),在 B 数组里面又插入 了一层级的数组(C),这种我们就称为三维数组
  4. 超过三维的,统统都叫多维数组。

二维数组的例子:

<?php
$person=array(
  'office'=>'办公室',
  'family'=>array(
    '爸爸',
    '妈妈',
    'yeye'=>'爷爷',
      'nn'=>'奶奶'
),
    'jiaotong'=>array(
      '自行车',
      '摩托车',
      '汽车',
      '飞机'
),
);
echo '<pre>';
var_dump($person);
echo '</pre>';
?>

结果:
array(3) {
  ["office"]=>
  string(9) "办公室"
  ["family"]=>
  array(4) {
    [0]=>
    string(6) "爸爸"
    [1]=>
    string(6) "妈妈"
    ["yeye"]=>
    string(6) "爷爷"
    ["nn"]=>
    string(6) "奶奶"
  }
  ["jiaotong"]=>
  array(4) {
    [0]=>
    string(9) "自行车"
    [1]=>
    string(9) "摩托车"
    [2]=>
    string(6) "汽车"
    [3]=>
    string(6) "飞机"
  }
}

多维数组的访问

在上面的事例中访问‘爸爸’
echo $person['family'][0];

多维数组的增加,更改和删除与普通数组相似

4、数组的操作

数组的计算

1、统计数组中元素的个数

count()函数

用法

int count ( mixed $变量)

2、for循环遍历索引数组

<?php
$num = array(1,2,3,4,5,6,7,8,9,10);
//按照索引数组的特点,下标从 0 开始。所以 1 的下标为 0,10 的下标为 9
echo $num[0].'<br />';
echo $num[9].'<br />';
//我们可以得到数组中元素的总个数,为 10
echo count($num).'<br />';
//遍历这个索引数组的话,我们就可以定义一个变量为$i
//$i 的值为 0,从 0 开始
//可以设定一个循环条件为:$i 在下标的(9)最大值之内循环
for($i = 0 ; $i < count($num) ; $i++){
 echo $num[$i].'<br />';
}

?>
结果:
1
10
10
1
2
3
4
5
6
7
8
9
10

3、foreach遍历关联数组

用法:

foreach( 要循环的数组变量 as [键变量 =>] 值变量){
//循环的结构体
}

例子:

<?php
$data = [
    'fj' => '凤姐',
    'fr' => '芙蓉',
];
foreach($data as $key => $value){
 echo $key . '-------' . $value . '<br />';
}
//如果我们只想读取值的话,就可以把下面的$key => 给删除掉,读取的时候,就只读取
/*
foreach($data as $value){
echo $value . '<br />';

}
*/
?>
结果:
fj-------凤姐
fr-------芙蓉

3、多维数组的遍历

<?php
$data = array(
    0 => array(
        '中国' => 'china',
        '美国' => 'usa',
        '德国' => ' Germany',
    ),
    1 => array(
        '湖北' => 'hubei',
        '河北' => 'hebei',
        '山东' => 'shandong',
        '山西' => 'sanxi',
    ),
);
//注:我们在使用 foreach 循环时,第一次循环将键为 0 和键为 1 的两个数组赋值给一个变量($value)。
//然后,再套一个循环遍历这个$value 变量,$value 中的值取出来,赋值给$k 和$v。
foreach($data as $value){
//第一次循环把国家的数组赋值给了$value
//第二次循环把中国的省份的数组又赋值给了$value
//因此,我在循环的时候把$value 再遍历一次
 foreach($value as $k => $v){
  echo $k . '-----' . $v .'<br />';
 }
//为了看的更清晰,我在中间加上华丽丽的分割线方便你来分析
 echo '----------分割线-----------<br />';
}
?>
结果:
中国-----china
美国-----usa
德国----- Germany
----------分割线-----------
湖北-----hubei
河北-----hebei
山东-----shandong
山西-----sanxi
----------分割线-----------

4、list,each函数遍历数组

list用法:

list ( mixed $变量 1 [, mixed $变量 n ] 

例子:

<?php
list($one,$two,$three)=array('张三','李四','王五');
echo '$one----'.$one.'<br />';
echo '$two----'.$two.'<br />';
echo '$three----'.$three.'<br />';

?>
结果:
$one----张三
$two----李四
$three----王五
  1. 将下标为 0 的张三赋值给了$one

  2. 将下标为 1 的李四赋值给了$two

  3. 将下标为 2 的王五赋值给了$three 因此,我们知道了 list 的功能就是从左到右,一一对应索引数组从 0 开始的下标值。 例子:

索引数组的一一对应原则

<?php
list(,,$three)=array('张三','李四','王五');
echo '$one----'.$one.'<br />';
echo '$two----'.$two.'<br />';
echo '$three----'.$three.'<br />';

?>
结果:
$one----
$two----
$three----王五

5、each函数

用法:

array each ( array &$array )

例子:

<?php
//定义一个变量叫$kongjie(空姐)
$kongjie=[
    'gao'=>'穿黑衣服的',
    'shou'=>'腿特别长特别细',
    'mei'=>'好白',
    'pl'=>'五官端正',
    'type'=>'那就是女神',
    '我是屌丝不敢跟女神搭讪'
];
//第一次 each
$data = each($kongjie);
echo '<pre>';
var_dump($data);
echo '</pre>';

?>
结果:
array(4) {
  [1]=>
  string(15) "穿黑衣服的"
  ["value"]=>
  string(15) "穿黑衣服的"
  [0]=>
  string(3) "gao"
  ["key"]=>
  string(3) "gao"
}


图示: 在这里插入图片描述

each特点:

  1. 读一次向后移动一次【可以想象有一个记录的箭头在移动】,将其中的每个元素拆解成一个新数组
  2. 读取到最后,没有可操作的元素了,所以返回了 false。

each和list结合使用

例子:

<?php
//定义一个变量叫$kongjie(空姐)
$kongjie=[
'gao'=>'穿黑衣服的',
'shou'=>'退特别长特别细',
'mei'=>'好白',
];
list($key,$value) = each($kongjie);
echo $key. '-----' .$value .'<br />';
?>
结果:
gao-----穿黑衣服的

总结:

  1. each 把变量拆成了 4 个元素
  2. 而 list 把 0 =>gao 赋值给了变量$key
  3. list 把 1 => 穿黑衣服的 赋值给了变量 $value

优化:

<?php
//定义一个变量叫$kongjie(空姐)
$kongjie=[
'gao'=>'穿黑衣服的',
'shou'=>'退特别长特别细',
'mei'=>'好白',
];
while(list($key,$value) = each($kongjie)){
echo $key. '-----' .$value .'<br />';
}
?>
结果:
gao-----穿黑衣服的
shou-----退特别长特别细
mei-----好白

5、常用操作数组的函数

在这里插入图片描述 array_shift

功能:弹出数组的第一个元素

用法:

mixed array_shift ( array &$array )

例子:

<?php
$mingren = array("邓超", "黄晓明", "宁泽涛", "钟汉良");
$dc = array_shift($mingren);
echo $dc .'<br />';
print_r($mingren);
?>
结果:
邓超
Array ([0] => 黄晓明 [1] => 宁泽涛 [2] => 钟汉良 ) 

结论:

  1. 将第一个数组元素弹出,改变了原数组的结果

  2. 弹出的值赋值给了$dc

    同类型函数:

    array_pop

    功能:弹出数组末尾的一个元素

    用法:

    mixed array_pop ( array &$array )
    

array_unshift

功能:

向指数组的开始处压入一个或多个元素,返回的是总个数。

用法:

int array_unshift ( array &$数组 , mixed $值 1 [, mixed
$... ] )

同类型函数

array_push

功能:向指数组末尾处压入一个或多个元素,返回的是总个数。

用法:

int array_push ( array &$array , mixed $value1 [, mixed
$... ] )

current,key,prev,next,reset 功能演示

<?php
$t=array(
'我们',
'yy'=>'永远',
'dbg'=>'需要不断奋进',
'djn'=>'才能开创未来'
);
//读取数组的值
echo current($t).'<br />';
//读取数组的键
echo key($t).'<br />';
//向后移动一下
next($t);
//再读值和键
echo current($t).'<br />';
echo key($t).'<br />';
//向后移动一下
next($t);
echo current($t).'<br />';
echo key($t).'<br />';
//向前移动一下
prev($t);
echo current($t).'<br />';
echo key($t).'<br />';
//移到末尾
end($t);
echo current($t).'<br />';
echo key($t).'<br />';
//移至开始处
reset($t);
echo current($t).'<br />';
echo key($t).'<br />';
//销毁数组
unset($t);
var_dump($t);
?>

数组的常用函数 在这里插入图片描述

五、PHP中的正则表达式

世界上最难懂的是道士的鬼符、医生的处方和程序员的正则表达式

正则表达式主要用在以下一些地方:

  1. 匹配邮箱、手机号码、验证码
  2. 替换敏感的关键词。例如:涉及政治和骂人的话
  3. 文章采集。
  4. 早期的表情替换技术,ubb 文件编码、markdown 编辑器替换等
  5. 以后自己写模板引擎也需要用到正则表达示

1、正则表达式的定界符

定界符,不能用a-zA-Z0-9\ 其他的都可以用,必须成对出现

例子

/中间写正则 /	$中间写正则$		%中间写正则%
^中间写正则^		@中间写正则@

\是转义字符,如果正则表达式里需要匹配/,则:

///

2、正则表达式里的原子

原子是正则表达式里面的最小单位,原子说白了就是需要匹配的内容,一成立的正则表达式当中必须至少要有一个原子

函数preg_match()

功能:根据正则变量,匹配正则变量,匹配字符串变量。如果存在则返回匹配的个数,把匹配到的结果放到$结果变量里。如果没有匹配到结果返回 0。

用法:

int preg_match ( string $正则 , string $字符串 [, array&$结果] )

例子:

<?php
$zz = '/wq/';
$string = 'ssssswqaaaaaa';
if(preg_match($zz, $string, $matches)){
echo '匹配到了,结果为:';
var_dump($matches);
}else{
echo '没有匹配到';
}
?>

特殊标识的原子

原子说明等价式
\d匹配一个0-9[0-9]
\D匹配除了0-9以外的所有字符[^0-9]
\w匹配a-zA-Z0-9[a-zA-Z0-9]
\W匹配除了a-zA-Z0-9以外的所有字符[^a-zA-Z0-9]
\s匹配所有空白字符\n \t \r 空格[\t\n\f\r]
\S匹配所有的非空白字符[^\t\n\f\r]
[]指定范围的原子[^]

注:^抑扬符在中括号的作用是不匹配中括号里的字符

3、正则表达式中的元字符

抛出问题: \d 代表匹配一个字符。而我现在想要匹配十个八个,任意多个 数字肿么办? 这个时候我们就要用到元字符。在使用原子的时候,发现只能够匹配一个字 符,可是要匹配多个字符就出现了问题。 这个时候,我们需要借助元字符来帮我们修饰原子,实现更多的功能。

元字符功能说明
*匹配前面的一个原子0次或任意多次
+匹配一次或多次前面的一个字符
前面的字符可有可无【可选】有或没有
.匹配除了\n以外的所有字符
|或者,优先级最低
必须要以抑扬符之后的字符开始
$必须要以$之前的字符开始
\b词边界
\B非边界
{m}有且只能出现m次
{n,m}可以出现n到m次
{m,}至少m次,最大次数不限制
0改变优先级或者将某个字符串视为一个整体,匹配到的数据取出来也可以使用它

4、正则表达式中的模式修正符

模式匹配符功能
i模式中的字符将同时匹配大小写字母
m字符串视为多行
s将字符串视为单行,换行符作为普通字符
x将模式中的空白忽略.
A强制仅从目标字符串的开头开始匹配.
D模式中的美元元字符仅匹配目标字符串的结尾.
U匹配最近的字符串.

模式匹配符的用法:

/正则表达式/模式匹配符

例子:

/\w+/s

5、写正则的常用规则

诀窍:写一点,测一点

我们需要不断的正则,用 preg_match 对比是不是能匹配成功。成 功了,再写后面的一点。直到写完,全部匹配成功为止。

例子,写一个匹配邮箱的正则表达式

常用的格式主要有这样一些。那我们就可以来分析:

  1. 先匹配@之前的字符 \w+(因为是 0-9A-Za-z_)

  2. 第二个跟一个@符

  3. 第三个再写上[a-zA-Z0-9-]+ 因为 qq 和 126 这些主域名是不能有下划 线的

  4. corp.baidu. 或者是 126. 通常邮箱后缀都是这样的。所以我们可以写成: ([a-zA-Z0-9-]+.){1,2}

  5. 上面的是将.转义,让它是本身的意思。括号重复的区间最少一次,最多 两次。

  6. 后面接下 com|cn|org|gov.cn|net|edu.cn 等就可以了 因此,我们的正则表达示在我使用:

/\w+@([a-zA-Z0-9-]+.){1,2}(com|cn|org|gov.cn|net|edu.cn)/邮箱的正则就被我写成功了。

常用的正则表达式函数

函数名功能
preg_filter执行一个正则表达式搜索和替换
preg_grep返回匹配模式的数目条目
preg_match执行一个正则表达式匹配
preg_match_all执行一个全局正则表达式匹配
preg_replace_callback_array传入数组,执行一个正则表达式搜索和替换使用回调
preg_replace_callback执行一个正则表达式搜索并且使用一个回调进行替换
preg_replace执行一个正则表达式的搜索和替换
preg_split通过一个正则表达式分割字符串

常用到的正则表达式

面试中经常考到的几个正则达达示是:
1. 匹配邮箱
2. 匹配手机号
3. 匹配一个网址
4. 用正则匹配某个格式,取出某个个例
5. 写一个采集器
                                           |

| {m} | 有且只能出现m次 | | {n,m} | 可以出现n到m次 | | {m,} | 至少m次,最大次数不限制 | | 0 | 改变优先级或者将某个字符串视为一个整体,匹配到的数据取出来也可以使用它 |

4、正则表达式中的模式修正符

模式匹配符功能
i模式中的字符将同时匹配大小写字母
m字符串视为多行
s将字符串视为单行,换行符作为普通字符
x将模式中的空白忽略.
A强制仅从目标字符串的开头开始匹配.
D模式中的美元元字符仅匹配目标字符串的结尾.
U匹配最近的字符串.

模式匹配符的用法:

/正则表达式/模式匹配符

例子:

/\w+/s

5、写正则的常用规则

诀窍:写一点,测一点

我们需要不断的正则,用 preg_match 对比是不是能匹配成功。成 功了,再写后面的一点。直到写完,全部匹配成功为止。

例子,写一个匹配邮箱的正则表达式

常用的格式主要有这样一些。那我们就可以来分析:

  1. 先匹配@之前的字符 \w+(因为是 0-9A-Za-z_)

  2. 第二个跟一个@符

  3. 第三个再写上[a-zA-Z0-9-]+ 因为 qq 和 126 这些主域名是不能有下划 线的

  4. corp.baidu. 或者是 126. 通常邮箱后缀都是这样的。所以我们可以写成: ([a-zA-Z0-9-]+.){1,2}

  5. 上面的是将.转义,让它是本身的意思。括号重复的区间最少一次,最多 两次。

  6. 后面接下 com|cn|org|gov.cn|net|edu.cn 等就可以了 因此,我们的正则表达示在我使用:

/\w+@([a-zA-Z0-9-]+.){1,2}(com|cn|org|gov.cn|net|edu.cn)/邮箱的正则就被我写成功了。

常用的正则表达式函数

函数名功能
preg_filter执行一个正则表达式搜索和替换
preg_grep返回匹配模式的数目条目
preg_match执行一个正则表达式匹配
preg_match_all执行一个全局正则表达式匹配
preg_replace_callback_array传入数组,执行一个正则表达式搜索和替换使用回调
preg_replace_callback执行一个正则表达式搜索并且使用一个回调进行替换
preg_replace执行一个正则表达式的搜索和替换
preg_split通过一个正则表达式分割字符串

常用到的正则表达式

面试中经常考到的几个正则达达示是:
1. 匹配邮箱
2. 匹配手机号
3. 匹配一个网址
4. 用正则匹配某个格式,取出某个个例
5. 写一个采集器