本文已参与「新人创作礼」活动,一起开启掘金创作之路。
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;
?>
双引号和单引号的区别
- 双引号解析变量,但是单引号不解析变量。
- 在双引号里面插入变量,变量后面如果有英文或中文字符,它 会把这个字符和变量拼接起来,视为一整个变量。一定要在变量后面接上 特殊字符,例如空格等分开。
- 如果在双引号里面插变量的时候,后面不想有空格,可以拿大 括号将变量包起来。
- 双引号解析转义字符,单引号不解析转义字符。但,单引号能 解析' 和\
- 单引号效率高于双引号,尽可能使用单引号
- 双号和单引号可以互插!!!双引号当中插入单引号,单引号 当中插入变量,这个变量会被解析。
- 神奇的字符串拼接胶水——(.)点,用来拼接字符串。
- 我们将定界符声明字符串视为双引号一样的功能来看待
<?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、特点
函数是条狗,哪里需要哪里吼
通过上句话,我们能得到几个不同的规律:
- 需要用一个函数的时候,就吼一声它的名字
- 函数可以反复去吼,吼了它的名字它就过来了。也就是函数可以反复调用
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 和n 的值发生变化的时候。那么$foo 的值也发生变化
<?php
$foo=100;
function demo(&$n){
$n = 10;
return $n+$n;
}
echo demo($foo)."<br />";
echo $foo;
?>
结果:
20
10
6、递归函数
递归函数的规定:函数体内调用函数自己
- 代码是从上到下执行的,所有代码没有 exit 等停止符,函数必须执行完。
- 如果函数从函数 A 跳至函数 B 后,必须把函数 B 执行完成再执行函数 A 余下的代码。
- 递归函数必须要能执行完有结束条件,不然函数就会限入死循环。函数会 永远的自我执行下去。
<?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、使用系统内置函数
- 如果代码能赚钱,帮你赚钱最多的是基本语法
- 如果你还在当程序员,你看手册的时候可能比你看老婆的时间还长
使用函数的重点:
-
了解函数的功能,特别是常用函数的功能
-
了解函数的参数
-
了解函数的返回值
我们针对上面的三块,讲解 6 个函数,这 6 个函数,概况了函数的基本用 法的全部注意事项:
-
直接返回布尔型,如 bool copy ()
-
带有 MIXED 参数的函数如何调用。Mixed 表示任何类型的数据。如 Array_unshift()
-
参数中带有&符的参数,一定要传一个变量做为参数。函数里面改变了他 的值。
-
带有[]的参数,表示可选项。
-
带有…的参数,表示可以传任意多个参数。
-
带有 callback 的参数,表示回调函数。需要传一个函数进来。Array_map()
-
函数支持的版本你要了解 实验 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() | 浮点数取余 | "y = 1.3;x, 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、多维数组
- 一维数组 数组里面没有其他数组,只有单纯的一些变量或者值。
- 二维数组 数组里面插入了单层的一个数组,或者多个数组
- 三维数组 在数组(A)里面插入了一个数组(B),在 B 数组里面又插入 了一层级的数组(C),这种我们就称为三维数组
- 超过三维的,统统都叫多维数组。
二维数组的例子:
<?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----王五
-
将下标为 0 的张三赋值给了$one
-
将下标为 1 的李四赋值给了$two
-
将下标为 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特点:
- 读一次向后移动一次【可以想象有一个记录的箭头在移动】,将其中的每个元素拆解成一个新数组
- 读取到最后,没有可操作的元素了,所以返回了 false。
each和list结合使用
例子:
<?php
//定义一个变量叫$kongjie(空姐)
$kongjie=[
'gao'=>'穿黑衣服的',
'shou'=>'退特别长特别细',
'mei'=>'好白',
];
list($key,$value) = each($kongjie);
echo $key. '-----' .$value .'<br />';
?>
结果:
gao-----穿黑衣服的
总结:
- each 把变量拆成了 4 个元素
- 而 list 把 0 =>gao 赋值给了变量$key
- 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] => 钟汉良 )
结论:
-
将第一个数组元素弹出,改变了原数组的结果
-
弹出的值赋值给了$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中的正则表达式
世界上最难懂的是道士的鬼符、医生的处方和程序员的正则表达式
正则表达式主要用在以下一些地方:
- 匹配邮箱、手机号码、验证码
- 替换敏感的关键词。例如:涉及政治和骂人的话
- 文章采集。
- 早期的表情替换技术,ubb 文件编码、markdown 编辑器替换等
- 以后自己写模板引擎也需要用到正则表达示
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 对比是不是能匹配成功。成 功了,再写后面的一点。直到写完,全部匹配成功为止。
例子,写一个匹配邮箱的正则表达式
常用的格式主要有这样一些。那我们就可以来分析:
-
先匹配@之前的字符 \w+(因为是 0-9A-Za-z_)
-
第二个跟一个@符
-
第三个再写上[a-zA-Z0-9-]+ 因为 qq 和 126 这些主域名是不能有下划 线的
-
corp.baidu. 或者是 126. 通常邮箱后缀都是这样的。所以我们可以写成: ([a-zA-Z0-9-]+.){1,2}
-
上面的是将.转义,让它是本身的意思。括号重复的区间最少一次,最多 两次。
-
后面接下 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 对比是不是能匹配成功。成 功了,再写后面的一点。直到写完,全部匹配成功为止。
例子,写一个匹配邮箱的正则表达式
常用的格式主要有这样一些。那我们就可以来分析:
-
先匹配@之前的字符 \w+(因为是 0-9A-Za-z_)
-
第二个跟一个@符
-
第三个再写上[a-zA-Z0-9-]+ 因为 qq 和 126 这些主域名是不能有下划 线的
-
corp.baidu. 或者是 126. 通常邮箱后缀都是这样的。所以我们可以写成: ([a-zA-Z0-9-]+.){1,2}
-
上面的是将.转义,让它是本身的意思。括号重复的区间最少一次,最多 两次。
-
后面接下 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. 写一个采集器