简介
php(Hypertext Preprocessor ,超文本预处理器),是一种通用开源脚本语言,php主要应用是将程序嵌入到HTML文档中去执行,执行效率高。php是一款弱数据语言,语法相对简单并且提供了丰富的类库。php主要是结合了Linux、Nginx、Apache、MySql可以更加方便快捷的搭建一套系统。现目前使用最多的就是动态生成网页,自身加以学习运用为网络安全打好基础。
基本知识
1、注释
PHP注释和其他语言一样两种方式,行注释和块注释如下:
# 这是一个行注释
// 这也是一个行注释
/*
这是一个
块注释
*/
2、变量
PHP的所有变量都是以 "$“符号开始,并且要以”;"结束语句,简单介绍四种流程:
$num = 10 ; //赋值
echo $num; //访问
$num = 'Hello word'; //修改
unset($num); //删除
2.1 预定义变量
PHP系统内部制定了变量,也是PHP自动收集的数据结果,目的是为了方便开发者使用,他们同样也是变量并且都是数组,系统提供了九个预定义变量每个都有自己特定的数据。
预定义变量名称 | 描述 |
---|---|
$_GET | 用户通过get方式提交的数据 |
$_POST | 用户通过post方式提交的数据 |
$_REQUEST | 用户通过post方式和get方式提交的数据 |
$_SERVER | 用户和服务器的基本信息数据(数据由系统定义好) |
$_FILES | 用户提交的文件数据 |
$_SESSION | session数据 (服务器端存储的会话信息) |
$_cookie | cookie数据(客户端存储的文本文件) |
$GLOBALS | 所有全局变量,也是唯一一个不是以下划线开始的预定义变量 |
$_ENV | 环境数据 |
举个例子:一个用户在前端页面通过form表单中的input标签中name传值,而PHP就利用$_POST接收。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<form action="./a.php" method="post">
<input type="text" name="user">
<input type="password" name="password">
<input type="submit" name="submit">
</form>
</body>
</html>
<?php
$user = $_POST['user'];
$password = $_POST['password'];
echo '账号:'.$user;
echo '密码'.$password;
?>
2.2 变量传值
变量传值分为值传递和引用传递其中:
1、值传递:自身不受影响
2、引用传递:变量代表地址传递,一个改变影响多个
//值传递
$a = 10;
$b = $a;
//引用传递
$c = 10;
$d = &$c;
3、常量
常量是一种存储数据的符号,常量通常写大写字母,一旦定义将不可改变。
1、定义常量
(1)、使用函数:define(‘常量名’,常量值);
(2)、使用关键字:const 常量名 = 常量值;
2、访问
(1)、直接访问
(2)、用constant(‘常量名’);访问
//定义
define('VERSION',10);
const VERSION = 10;
//访问
echo VERSION;
echo constant('VERSION');
//定义数组常量
const MATH = array('PI' => 3.14,'E' => 2.72);
echo MATH['PI'];
3.1 系统常量
系统常量也分为两种一种是固定系统常量还有一种是魔术常量其中:
1、固定系统常量:值固定的。
2、魔术常量:值可以变但是不是自己控制是随系统参数而变。
系统常量
名称 | 介绍 |
---|---|
PHP_VERSION | PHP版本号 |
PHP_INT_SIZE | PHP中整数所占用的字节数 |
PHP_INT_MAX | PHP中整数所能表示的最大数 |
魔术常量
这里是两个下横线“- -DIR- -”
名称 | 介绍 |
---|---|
_DIR _ | 当前运行文件所在的绝对路径 |
_FILE _ | 当前运行文件的绝对路径并且带文件名 |
_LINE _ | 当前代码所在行号 |
_FUNCTION _ | 函数内部使用,表示当前函数的名字 |
_CLASS _ | 类内部方法使用,表示当前类的名字 |
_METHOD _ | 类内部方法使用,表示当前方法的名字并且带类名 |
_NAMESPACE _ | 当前所属命名空间的名字 |
使用直接输出即可
<?php
echo '这是第 " ' . __LINE__ . ' " 行';
?>
4、数据类型
数据类型通俗来说分为三大类和八小类
-
基本数据类型
- 整型(int/integer)
- 浮点型(float)
-
布尔型(bool/boolean)
:字符串型(string)
复合数据类型
- 数组型(array)
- 对象型(object) 特殊数据类型
- 资源型(resource)
- 空型(null)
可以利用var_dump()系统函数查看变量详细情况;数据大小(或长度)、数据类型。
4.1 整型
$int1 = 123; //十进制 --> %d
$int2 = 0123; //八进制 --> %o
$int3 = 0x123 //十六进制 --> %x
$int4 = 0b101 //二进制 --> %b
$int5 = -123 //负数 --> %d
其中最大的整数位PHP_INT_MAX (9223372036854775807)也是最大正数,而最大负数位PHP_INT_MAX - 1 。如果在最大整数在加一就会被浮点数所接收。
php也提供了进制转换的函数
转换 | 函数名 |
---|---|
二 —> 十 | bindec |
十 —> 二 | decbin |
十 —> 八 | decoct |
八 —> 十 | octdec |
十 —> 十六 | dechex |
十六 —> 十 | hexdec |
4.2 浮点型
浮点型也就是小数如(1.2),其中还包括了科学计数法产生的数,超过最大整数的数PHP_INT_MAX + 1,浮点数的存储空间有八个字节,有效精度13-14位,超过的将会四舍五入,在14位之前的数肯定精准,最大1.8e308,不适用于精度要求比较高的地方使用,也不适用于进行精确比较。
$floata = 1.2;
4.3 布尔型
布尔类型就两个值 true 和 false 不区分大小写
4.4 字符串型
字符串型分为三种分别为单引号包裹、双引号包裹、界定符包裹(<<<)
$str1 = 'hello world';
$str2 = "hello world";
$str3 = <<<EOT //EOT后不允许有任何字符包括空格
$str1
EOT;
其中:
1、单引号只能解析少量的转义符号比如:单引号('),反斜杠(\)。
echo 'hello \'\'\\word';
2、双引号就有较多的转义符:($)、(")、(\)、(\r|n)、(\t)、有php变量也可以解析。
echo "hello\"\$\\\r\t word";
$a = "hello";
//假如输出$a
echo "$abc"; //并不会单独输出a而是abc
//建议使用
echo "{$a}bc";
4.5 数组
1、创建
$arr1 = array();
$arr2 = [];
$arr3 = [1,2,3];
$arr4 = ['Name'=>'张三','age'=>30];
2、添加
$arr5[] = 10; //自动生成下标
$arr6['Name'] = '男'; //下标为Name
3、删除
unset($arr);
二维数组
$p1 = array('name'=>'张三','age'=>18);
$p2 = array('name'=>'李四','age'=>19);
$p = array($p1,$p2); //二维数组
echo $p[0]['name']; //抓取第一个人名字
4.6 类型判定和转换
类型判定不需要特意去记忆用 is_+数据类型,is_ 即可以查看所有,有特殊的比如is_numeric 判定数据是否为数值是则返回true,is_scalar 查看是否为标量(是否为基础数据类型)是返回true.
类型转换,类型转换php一般都会自动帮你转换自己也可以强制转换。
1、不改变原来数据类型
$a = 1;
$b = (boolean)$a;
2、改变原来数据类型
$a = 1;
settype($a,'bool');
资源和NULL不能强制转换
5、运算
5.1 普通运算符
//普通运算符+ - * / % **
$a = 1;
$b = 2;
$c = $a + $b; //相加
$c = $a - $b; //相减
$c = $a * $b; //相乘
$c = $a / $b; //相除
$c = $a % $b; //取余
$c = $a ** $b; //幂运算左底数右次方
5.2 错误抑制
错误抑制只对简单的错误有效比如(notice、warning)
$a = @(10/0);
5.3 飞船运算符
符号 | 介绍 |
---|---|
<=> | 左边大于右边返回1(int类型),小则返回-1 |
=== | 左边等于右边且两边数据类型一致返回true |
!== | 左边等于右边且两边数据类型不一致返回true |
5.4 合并运算符
合并运算符 $a??B
a
存在,整个表达式返回
a 存在,整个表达式返回
a存在,整个表达式返回a的值。
$a不存在,整个表达式返回B的值。
合并运算的目的是保证代码的逻辑完整性;既总有个结果不会不存在。
例:用户用POST提交数据
$gender = $_POST['gender'];
$gender = $_POST['gender']??'男';
5.5 连接运算符
连接运算符以“.”为代表。
$a = 'hello';
$b = 'world';
$c = $a.' '.$b;
5.6 三目运算符
$age = 15;
$res = $age >= 18?'上网':'不能上网';
// 条件 结果1 结果2
//满足条件则返回结果1 不满足则返回结果2
5.7 逻辑运算符
&& —>逻辑与and
|| ------>逻辑或or
逻辑运算为短路运算,实际开发大概率能判定结果的放在前面。比较是通过对两边的布尔结果进行比较
&& 只有两边同时为true结果才为true否则为false。如果第一个判断就为假那么后面的条件将不会判断。
|| 两边只要有一个true就判断为真,一个没有就为假。如果第一个判断为真那么后面的条件将不会判断
5.8 自增运算符
$a = 1;
$b = $a++; //先用后加 $b = 1;
$c = 1;
$d = ++$c; //先加后用 $d = 2;
5.9 运算符优先级
6、流程控制
执行的最后销毁所有资源
6.1 if
格式
1、 if(条件) {执行内容}
2、if(条件){执行内容}else{执行内容}
3、if(条件){执行内容}else if(条件){执行内容}…else{执行内容}
<?php
$age = 18;
if($age >= 18){
echo "已满十八岁";
}
?>
<?php
$age = 18;
if($age >= 18){
echo "已满十八岁";
}else{
echo "未成年";
}
?>
<?php
$age = 18;
if($age >= 18){
echo "已满十八岁";
}else if($age < 18 && $age > 0){
echo "未成年";
}else{
echo "您输错了";
}
?>
if语句内能嵌套if语句但是不建议超过三层。
6.2 switch
选择语句
<?php
$a = 1;
switch($a){
case 1 : echo '我是1';
break; //没有break程序将一直执行下去造成无必要消耗
case 2 : echo '我是2';
break;
default: echo '我不是1也不是2,我是除它们以外的任何';
break;
}
?>
7、循环
php循环分为四种分别为:while、for、foreach、do-while。
7.1 while
<?php
$a = 1;
while(true){ //条件为真运行
echo '这是个while循环';
$a++;
if($a == 10){
break;
}
}
?>
7.2 for
<?php
for($a = 1;$a <= 10;$a++){
echo '这是一个for循环';
}
?>
7.3 foreach
foreach是php专门用来遍历数组的关键字
语法:foreach(数组变量 as 下标变量 => 变量值){
通过下标变量读取数组中每个元素下标(可以没有)
通过值变量读取数组中每个元素的值
}
例:
$info = array('name' => '鸣人','skill' => '螺旋丸');
foreach($info as $key => $value){ //下标变量,变量值名字自取
echo $key.':'.$value.'<br/>';
}
7.4 do-while
do-while语句用处比较少,但也是必须要熟悉的,
do {
要执行的代码;
} while (条件为真);
<?php
$x=1;
do {
echo "这个数字是:$x <br>";
$x++;
} while ($x<=5);
?>
7.5 break/continue
其中还有比较重要的点是 break 和continue
break:终止循环
continue:终止本次循环
continue[N]:回到N层循环继续下一次循环开始
break[N]:跳出N+1层循环,没有则结束
8 、函数
php中函数关键字为function(){},运行时先加载到内存中(栈区),用完后释放,每个函数都有返回值,有return时候返回后面的值,没有return时返回NULL。return(强制结束)
<?php
function def(){
echo "这是一个函数";
}
def();
?>
<?php
function def2($a){ //形参
echo "\$a=".$a;
}
$b = 1;
def2($b); //实参
?>
在传值的过程中也分为普通传值和引用传值,引用传值函数内变量改变外部变量也会改变,普通传值则不会。
function sum(&$b){} //引用传递
sum($b)
9、函数高级
9.1 作用域
局部变量 | 函数内 |
全局变量 | 全局访问,函数内部不能访问 |
超全局变量 | $ GLOBALS全局变量都会被收纳在$GLOBALS中 |
可以利用超全局变量来保存数据,让数据不受作用域的限制。
<?php
$a = 100;
function display(){
echo $GLOBALS['a']; //可以输出a的值
$GLOBALS['b'] = 1000; //可以成功,相当于定义了一个全局变量,不会被释放
}
?>
跨作用域访问:即在局部作用域访问全局,或全局访问局部。在函数内部使用global关键字声明变量,在用global声明变量时候不能够赋值,内外部都是指向同一个内存。
例:
<?php
$a = 100;
function display(){
global $a; //声明不能赋值
echo $a++; //100
}
display();
echo $a; //101
?>
9.2 静态变量
静态变量在函数内部定义,可以在函数多次调用时,共用的局部变量。
静态变量在函数加载时(不是调用时)初始化(只初始化一次),静态变量可以在同一函数多次调用时共享数据的变化。
例:
<?php
function display(){
$count = 1;
static $count2 = 1;
echo $count1++.",".$count2++;
}
display(); //输出1,1
display(); //输出1,2
?>
9.3 强制类型
作用:
1、实参必须对应形参类型
2、保护函数内部运行逻辑正确
3、省去函数内部判定逻辑
4、提升解析效率
语法 function 名字(类型 变量名){}
想让强类型完全生效需要提前声明
declare(strict_types = 1);声明在最前面
<?php
declare(strict_types = 1);
function addNumbers(int $a, int $b): int {
return $a + $b;
}
?>
9.4 可变参数
可变参数 “…”
当函数获取不固定数量的形参时可以用可变参数 …
a
r
g
s
,多的实参会传进
args,多的实参会传进
args,多的实参会传进args。
<?php
function my_sum($a,$b,...$args){
$sum = $a + $b;
foreach($args as $v){
$sum = $v;
}
return $sum;
}
$sum = my_sum(1,2,3,4,5,6,7)
?>
9.5 可变函数
用一个变量来保存函数,可以变量访问函数
例
<?php
function display(){
echo _FUNCTION_;
}
$var = 'display';
$var();
?>
9.6 匿名函数
1、简单匿名函数
2、回调匿名函数
3、匿名函数闭包
变量 = function(){函数体 return 返回值};
简单匿名函数
$func = function($str){echo $str;};
$func('hello word'); //调用
回调匿名函数
将匿名函数定义在函数实参中,当做一个实参传递给形参
例:
<?php
//将数组内的每个参数三次方
$num = [1,2,3];
function my_cube($arr,$cube){
$list = [];
foreach($arr as $value){
$list[] = $cube($value);
}
return $list;
}
$res = my_cube($num,function($n){return $n**3}
print_r($res);
?>
匿名函数闭包
函数闭包代表定义在函数内部的函数,内部函数为匿名函数,内部函数不能直接访问外部函数的局部变量
<?php
function outer(){
$inner = function(){
echo 'hello'; //不能用外层函数参数,gloable也不行
};
$inner();
}
?>
9.7 系统函数
系统函数的效率比开发者自己用PHP封装的函数效率高,系统函数可以通过API文档(可以从官网下载)进行查看使用。
常用输出类 :echo、print_r、var_dump、exit/die(输出并终止)
常用时间类 :time、data、strtotime(转为时间戳)、microtime(时间戳,精度高)
常用数学类 :max、min、floor、ceil、mt_rand、round。
字符串类常用:
函数名 | 介绍 |
---|---|
addslashes | 对ASCII码中的特殊字符进行转义(防止SQL注入) |
htmlsmpecialchars | 将HTML特殊符号转为实体 |
htmlsmpecialchars_decode | 将实体符号转换为普通字符 |
chr | 将ASCII对应的数值转换成对应符号 |
ord | 将ASCII字符转换为对应数值 |
explode | 将字符串按照指定符号分隔,得一数组 |
md5 | 使用md5进行加密 |
str_repeat | 将字符串重复指定次数 |
str_shuffle | 随机打乱一个字符串 |
str_split | 按照指定长度将数组分割,返回数组 |
strip_tags | 去除HTML和PHP标记 |
strlen | 获取字符串长度 |
stripos/strpois | 查找字符串中首次出现目标字符串的位置 |
substr | 从字符串中截取指定位置的长度的子字符串 |
trim | 去除字符串两边空格,默认是空格也可以设置其他 |
vcfirst | 首字母大写 |
strtolower | 所有字母小写 |
strtoupper | 所有字母大写 |
strstr | 获取字符串中某个字符首次出现到最后的字符串 |
str_replace | 字符串替换 |
10、文件包含
文件包含的作用,作用数据或结构跨脚本使用,提升开发效率,提供代码复用,利于代码维护
使用被包含文件内容(被请求文件永远是主体)
实现:
include ‘文件名’ 包含
requier ‘文件名’ 必须要有
include_once ‘文件名’ 包含一次
requier_once ‘文件名’ 必须包含一次
例:
数据提供者 data.php
//data.php
$info = [
'name' => '张三',
'age' => '18',
'gender' => '男'
];
数据显示者 list.html
<html>
<head>
<title>显示个人信息</title>
</head>
<body>
姓名:
年龄:
性别:
</body>
</html>
逻辑处理者 controller.php
//想要使用data.php中的数据
include 'data.php'; //向上包含
include 'list.html';
然后进入到list.html里面
<html>
<head>
<title>显示个人信息</title>
</head>
<body>
姓名:<?php echo $info['name'];?>
年龄:<?php echo $info['age'];?>
性别:<?php echo $info['gender'];?>
</body>
</html>