概念
B/S 软件
使用技术
web 前端开发
Web后端开发 (服务器端)
PHP(原名 Personal Home Page的缩写,已经正式更名为 “PHP: HypertextPreprocessor”,中文名:“超文本预处理器”)是一种通用开源脚本语言。语法吸收了 C 语言、Java和 Perl 的特点,利于学习,使用广泛,主要适用于Web 开发领域。PHP 独特的语法混合了 C、Java、Perl 以及 PHP 自创的语法。用 PHP 做出的动态页面与其他的编程语言相比,PHP 是将程序嵌入到 HTML文档中,执行效率很高
1994年 Rasmus Lerdorf 设计了 PHP 的第一个版本 PHP1.0,并于 1995年将其通过社区发布。1996年又设计了 PHP2,1998年,由于 Zeev Suraski 和 Andi Gutmans 当时正在做毕业设计,需要一个用于开发 Web 程序的语言,他们也考虑了 asp 和jsp,但由于 ASP 只能运行在 Windows 平台,而 JSP 又过于复杂,因此,他们最后选择了 PHP,但他们发现,PHP 的功能当时还十分有限,因此,他们决定为 PHP重新编写底层的解析程序,这就是 PHP 的第一个被广泛使用的版本----PHP3.0。
任何一门编程语言,有优点就有缺点
要想使用这门语言,需要搭配相应的开发环境,主要包括:
运行原理:
//标准格式
....
?>
*注意:纯 php 脚本文件要求:
php标签之外是 html 语言环境,在纯 php代码环境下,这些 html 字符(包括看不
见的空格或者回车,制表符号)也会一同输出,引发意外错误。因此,在编码规范
中规定:库文件、class 类文件等只要是纯 php代码的文件,要删除结尾的 ?> 结束
标签。
// 单行注释
/* 多行注释 */
// 结束符使用英文分号 “;”
?>
注意:
var_dump中的变量必须是存在的,如果变量存在但值是空,则返回 false ;使用 define关键字定义常量,常量命名要全部大写,常量的数据类型不能是 资
源、对象
差异 | 变量 | 常量 |
---|---|---|
定义 | $声明 | define()函数定义 |
命名 | 大小写敏感 | 必须大写(行业规范) |
赋值 | 可以重新赋值 | 不能再赋值 |
数据类型 | 8种数据类型 | 只能是标量 |
销毁 | unset() 销毁 | 不能销毁 |
判断方法 | isset() 判断是否定义 | defined() 判断是否定义 |
作用域 | 局部作用域 | 全局作用域 |
八种数据类型
不同进制
对象型
具有一定功能和特征的单个事物,对象是属性和方法的集合资源型
变量可以是文件夹、一个文件、从数据库中得到的结果集等,操作这个变量,相当于操作这些资源。
NULL 型
null 也是数据,通常表示一种状态,变量没有任何值,就用 null 表示。以下情况会得到 null:
• 直接将一个变量赋值为 null
• 将一个变量销毁后再次使用该变量
• 直接使用一个不存在的变量
自动类型转换: 在特殊运算时,会有自动类型转换的情况
自动转换为: false | 自动转换为:true | 自动转换为:int | 自动转换为: string |
---|---|---|---|
整型: 0 | 非 0整数 | true : 1 | true : “1” |
浮点: 0.0或 0.00 | 非 0浮点数 | false : 0 | false : " " |
字符串: " " 或 “0” | 非空字符串 | null: 0 | null: " " |
数组:空数组 | 非空数组 | ||
null | 对象 | ||
未知变量(或被销毁变量) |
强制类型转换
// 强制类型转换:不改变原变量类型
// 定义一个存储变量
$num = 1;
$newNum; // 用于接收转换之后的变量
// 开始转换
$newNum = (Boolean) $num ; //true
$newNum = (Integer) $num; //1
$newNum = (Float) $num; //float 1
$newNum = (String) $num; //"1"
$newNum = (Array) $num; //Array
$newNum = (Object) $num; //Object
常用变量检测函数
函数 | 说明 |
---|---|
gettype() | 判断变量类型: 返回 boolean、integer、double( float 返回“double”)、string、array、object、resource、null、unknown type |
isset() | 检测变量是否存在 |
empty() | 判断一个变量是否为空(字符串、数组、0、null) |
其他 | 判断变量类型的系列函数 isarray() 、 isbool()、isfloat() 、isinteger()、isnull() 、 isnumeric()、isobject() 、 isresource()、 isstring()和 isscalar()是否为标量 |
常用数学运算函数
函数名 | 语法 | 说明 |
---|---|---|
rand | rand([int, int]) | 返回一个随机整数 |
mt_rand | mt_rand ([int, int]) | 使用 Mersenne Twister 算法返回随机整数 |
abs | abs (mixe) | 返回数字的绝对值 |
min | min(array) min(mixed,mixed [, …] ) | 返回最小值 |
max | max (array) max(mixed,mixed [, …] ) | 返回最大值 |
round | round (float [, int [, int]]) | 四舍五入 |
floor | floor (float) | 舍去小数部分取整 |
ceil | ceil ( float) | 小数部分非零返回整数部分就加 1 |
pow | pow(mixed, mixed) | 返回 base的 exp 次方的值 |
sqrt | sqrt (float) | 返回平方根 |
sin | sin (float) | 返回正弦值 |
cos | cos (float) | 返回余弦值 |
tan | tan (float) | 返回正切值 |
deg2rad | deg2rad (float) | 将角度转换为弧度 |
bindec | bindec (string) | 二进制转十进制 |
decbin | decbin (int) | 十进制转二进制 |
octdec | octdec (string) | 八进制转十进制 |
decoct | decoct (int) | 十进制转八进制 |
hexdec | hexdec (string) | 十六进制转十进制 |
dechex | dechex (int) | 十进制转十六进制 |
exp | float exp(float arg) | 返回 e 的 arg 幂次值,e 为自然对数的底数,值为 2.718282。 |
pi | float pi (void) | 返回圆周率的值 |
三种定义的方式
单引号 | 双引号 | 定界符 |
---|---|---|
不支持解析变量 | 支持解析变量,不支持表达式 | 支持解析变量,不支持表达式 |
不能插入单引号 | 不能插入双引号 | 可以插入双引号和单引号 |
只能转义 反斜杠 和 单引号 | 支持解析转义字符(\n、\t、\s等) | 同双引号 |
函数 | 功能 |
---|---|
trim() | 去除字符串首尾空白等特殊符号或指定字符序列 |
strtolower() | 转换为小写 |
strtoupper() | 转换为大写 |
htmlspecialchars() | 格式化字串中的 html标签 |
strip_tags() | 函数剥去 HTML、XML 以及 PHP 的标签 |
md5() | 计算字符串的 MD5 散列值 |
strlen() | 字节长度 utf8编码 西文:1 字节 汉字:3字节 |
mb_strlen() | 字符个数 |
substr() | 字符串截取函数(中文乱码) |
mb_substr() | 字符串截取函数(中文不乱码) |
strstr() | 查找字符串的首次出现,开始向后截取全部,并返回 |
strpos()、stripos() | 查找字符串在另一字符串中第一次、最后一次出现的位置 ( 不区分大小写) |
strrpos()、strripos() | 同上 ( 区分大小写) |
str_replace() | 字符串替换函数 |
str_repeat() | 重复一个字符串 |
ltrim() 、 trim() 、rtrim() | 去除左侧 、 两侧 、 右侧多余字符(默认删除空格) |
explode( 符号 , 字符串 ) | 字符串 → 数组 |
implode( 符号 , 数组 ) | 数组 → 字符串 |
md5()、sha1() | 字符串加密 |
数组类型
//for 遍历索引数组
$arr=[1,2,3,4,5];
for($i=0; $i < count($arr); $i++){
var_dump($arr[$i]);
};
//foreach遍历索引数组
$f_arr=["name"=>"zhangsan","age"=>18,"sex"=>"m"];
foreach ($f_arr as $key=>$value) {
echo $key.":".$value."
";
};
//list (只用于索引数组)
list($a,$b,$c,$d) = ["张三","李四","王五","赵六"];
echo $a,$b,$c,$d;
常用数组函数
函数 | 功能 |
---|---|
array_values() | 数组中所有的值放入一个新的索引数组,并返回 |
array_keys() | 数组中所有的键放入一个新的索引数组,并返回 |
array_reverse() | 颠倒数组顺序 |
in_array(元素,数组) | 检查数组中是否存在某个值 |
count() | 计算数组中的单元数目 或 对象中的属性个数 |
array_unshift() | 在数组开头插入一个或多个元素 |
array_push() | 在数组结尾插入一个或多个元素 |
array_unique() | 移除数组中重复的值 |
array_pop() | 删除数组最后一个元素 |
array_shift() | 删除数组开头的元素 |
array_splice(数组,索引,数量) | 删除指定元素( 删除元素后,会重排数组索引用 unset 删除不会重排数组索引) |
sort() | 排序 ( 升序 ) |
rsort() | 排序(降序) |
array_merge() | 合并一个或多个数组 |
函数 | 说明 |
---|---|
json_encode( 数组 ) | JSON 格式编码 (参数必须是 utf-8编码,否则会得到空字符或者 null) |
json_decode( 字符串,参数 ) | 对 JSON 格式的字符串进行解码,参数: true :返回 数组 false : 返回 对象 |
类型 | 运算符 |
---|---|
算术运算符 | + - * / % |
赋值运算符 | = += -= *= /= %= .= |
比较运算符 | > >= < <= != !== == === |
逻辑运算符 | && |
字符串运算符 | . |
其他运算符 | 三元运算符 ==? : |
错误抑制符 | @ |
提升优先级符号 | ( ) |
// 单一分支结构
if{
}
// 双向分支结构
if{
}else{
}
// 多向分支结构
// 判断学生成绩在那个分数段
$score = 100;
if($score>=90 && $score<=100){
echo "优+";
}else if($score>=80 && $score<=89){
echo "优";
}else if($score>=70 && $score<=79){
echo "良";
}else if($score>=60 && $score<=69){
echo "中";
}else($score>=0 && $score<=59){
echo "差";
}
// 多向分支结构
$action = 'submit';
// 分支
switch($action){
case 'submit':
echo "请输入手机号码!";
break;
case 'reset':
echo "数据已经清空";
break;
default:
echo "请输入信息";
}
While(条件表达式){
// 若条件成立,则执行这里的循环体
// 改变初值的条件 ;
}
do{
// 循环体
// 改变初值的条件 ;
}while(条件表达式);
// 语法格式
for(初值;范围;递增){
// 循环体
}
break:
在 switch分支当中和循环当中使用,代表结束当前分支或循环
continue:
在循环当中使用,代表跳过当前层循环,若指定数字,则跳过指定
层循环
函数命名:字母数字下划线,首字母不能为数字, 不会区分大小写 ,且不能使用关键字,函数名不能重复来定义
查看实参函数:
函数返回值:
局部变量:在函数内部定义,只作用于函数内部
默认情况下,函数参数通过值传递(因而即使在函数内部改变参数的值,它并不会改变函数外部的值)
在函数外部定义,作用于当前整个脚本,在函数内部使用需要使用global
关键字声明
注意:global 只能用于引入全局变量,子函数引入父函数变量,不能使用 global
使用 global 命令,将全局变量引入到函数内部,但这种方式不够灵活,可以使用引 引
用变量的方法:
在函数内部定义, 作用于函数内部 ,使用 static关键字声明
在全部作用域中始终可用的内置变量
$_GET
通过 URL 参数传递 ( get 请求 ) 给当前脚本的变量的数组
$_POST
通过 ‘post’ 方式给当前脚本的变量的数组
$_COOKIE
保存 Cookies信息的数组
$_SESSION
保存 SESSION 信息的数组
$_FILES
通过 HTTP POST 方式上传到当前脚本的项目的数组
$_ENV
包含服务器端环境变量(版本,目录,用户名等等)的数组
$_SERVER
服务器和执行环境信息
$_REQUEST
默认包含了 _ , _POST 和 $_COOKIE 的数组
获取 application/json 的 的 post
php://input 是一个流,可以读取没有处理过的 POST 数据(即原始数据)
$postjson = file_get_contents(“php://input”);
正则表达式(regular expression)描述了一种字符串匹配的模式,他是一个特殊的公式,由原子、元字符、模式修正符组成;它也是一个字符串!只不过是一个 特殊的字符串
正则表达式的主要作用:
php的正则是以文本方式声明
,文本当中用"/ /"
包裹正则内容,如果使用双引号
,
正则中的“$”
会被解析为变量(要加\转义符
),因此,用单引号定义正则更安全
。
PCRE(Perl Compatible Regular Expressions )是一个 Perl(一种功能丰富的计算机
程序语言)兼容的正则表达式库,是以 preg开头的一套函数:
函数 | 功能 |
---|---|
preg_match(正则 , 字符串 ,结果数组) | 单一匹配 结果数组: 第一个匹配到的结果 返回:匹配数量 (错误:false) |
pregmatchall(正则 , 字符串 ,结果数组) | 匹配所有 结果数组: 全部匹配到的结果 返回:匹配数量(错误:false) |
preg_replace(正则 , 替换 , 被替换字符串) | 替换 返回:替换后字符串 |
preg_split( 正则 , 字符串) | 用正则分割字符串 返回:数组 |
正则模式当中的元字符,通常都具有特殊的含义:
注意:
正则需要转义字符: ( ) { } ? * + . [ ] \ / ^ $ |
符号 | 说明 |
---|---|
i | 不区分大小写 |
s | 忽略换行符 |
U | 反转匹配模式(贪婪/非贪婪) |
子模式(子表达式 或 子匹配),在正则表达式中,可以使用 ( 和 ) 将模式中的子
字符串括起来,以形成一个子模式。
正则表达式一个最重要的特性就是将匹配成功的模式的某部分进行存储供以后使用
这一能力。
路径:
路径 | 说明 |
---|---|
/ | 绝对路径:硬盘根目录 |
./ | 相对路径:当前目录 |
…/ | 相对路径:上级目录 |
文件路径相关函数 | 说明 |
---|---|
basename() | 获取路径中的文件名部分 |
dirname() | 获取路径中的目录部分 |
pathinfo($path,参数) | 获取路径中的大部分信息,返回数组,参数: PATHINFODIRNAMEPATHINFOBASENAME PATHINFOEXTENSIONPATHINFOFILENAME |
函数 | 说明 |
---|---|
mkdir(完整路径目录) | 创建一个目录 |
rmdir(完整路径目录) | 删除一个目录 |
opendir(完整路径目录) | 打开目录 |
readdir(资源) | 读取目录 |
closedir(资源) | 关闭目录,释放内存 |
is_dir(完整路径目录) | 判断是否为一个有效目录 |
scandir(完整路径目录) | 扫描目录,返回文件数组 特例: count(数组)==2 是空目录 |
函数 | 说明 |
---|---|
filesize(完整路径文件名) | 取得一个文件的大小(字节) |
filectime(完整路径文件名) | 获取文件的创建时间(create) |
filemtime(完整路径文件名) | 获取文件的修改时间(modify) |
fileatime(完整路径文件名) | 获取文件的访问时间(access) |
函数 | 说明 |
---|---|
fopen(完整路径文件名 , 参数) | 打开文件(参数:r只读 w写入 x 创建写入) |
fread(资源 , 长度) | 读取文件 长度:字节 |
fwrite(资源 , 内容) | 写入的内容 |
fclose(资源) | 关闭文件(资源),释放内存 |
filegetcontents(完整路径文件名) | 将整个文件读入一个字符串 相当于 fopen fread fclose 组合动作 |
fileputcontents(完整路径文件名,要写入的数据,[FILE_APPEND]) | 将字符串写入文件 相当于 fopen fwrite fclose组合动作 FILE_APPEND:追加写入 |
readfile() | 将内容读入内存缓冲区 |
copy(源文件 , 目标文件) | 拷贝文件(如果目标文件已存在,将会被覆盖) |
unlink(完整路径文件名) | 删除文件 |
服务端设置 --> php.ini 中进行设置:
默认 uploadmaxfilesize = 2M,如果你想上传超过 8M 的文件,比如:20M,你在设
定 uploadmaxfilesize = 20M 的同时,还要修改 postmaxsize选项(默认为 8M)。否
则 post 数据超出限制,$_FILES 将会为空(报错)。
$_FILES数组
: $_FILES 超全局数组中,包含着从客户端提交文件的全部信息
error编号 | 说明 |
---|---|
0 | 上传过程中没有发生任何错误 |
1 | 上传的文件超过了 php.ini 中uploadmaxfilesize选项限制的值 |
2 | 超出了 HTML表单隐藏域属性的 MAX_FILE_SIZE元素所指定的最大值(浏览器兼容) |
3 | 文件只有部分上传 |
4 | 没有上传任何文件 |
5 | 上传文件大小为 0(已废弃) |
6 | 找不到临时文件夹 |
7 | 文件写入失败 |
move_uploaded_file(临时文件名 , 新文件名)
:将临时文件保存为正式文件
php处理:
GD库是 PHP 中的绘图工具
作用:绘制饼图、柱形图、折线图、验证码、水印、缩放等
支持:GIF、JPEG、PNG、WBMP 等格式
GD库图片函数的参数很多,这里常用的函数:
函数 | 说明 |
---|---|
imagecreate(宽,高) | 创建一个 256 色画布 |
imagecreatetruecolor(宽,高) | 创建一个真彩画布 |
imagecreatefromgif(完整路径文件名) | 将一张 gif图像放入画布 |
imagecreatefrompng(完整路径文件名) | 将一张 png图像放入画布 |
imagecreatefromjpeg(完整路径文件名) | 将一张 jpeg图像放入画布 |
imagecreatefromstring(字符串) | 从字符串中的图像流新建一图像 |
imagecolorallocate() | 定义颜色 |
imagecolorallocatealpha() | 定义带 alpha通道(透明)的颜色 |
imagefill() | 填充背景 |
imagesetpixel() | 绘制像素点 |
imageline() | 绘制线条 |
imagerectangle()、imagefilledrectangle() | 矩形线框、实心矩形框 |
imagepolygon()、imagefilledpolygon() | 多边形线框、实心多边形 |
imageellipse()、imagefilledellipse() | 椭圆线框、实心椭圆 |
imagearc()、imagefilledarc() | 圆弧、实心圆弧(扇形) |
imagettftext() | 绘制文本需引入字库(支持中文字库,输出中文) |
getimagesize(完整路径文件名) | 获取图像的宽、高、大小、类型等相关信息 成功返回:数组 失败返回:false |
imagesx(资源) | 取得图像宽度 |
imagesy(资源) | 取得图像高度 |
imagecopy() | 用于拷贝图像或图像的一部分 成功返回:true ,失败返回:false |
imagecopyresampled() | 用于拷贝部分图像并调整大小(重新采样) |
imagegif() | 输出 gif格式图像 |
imagejpeg() | 输出 jpeg格式图像 |
imagepng() | 输出 png格式图像 |
imagedestroy() | 释放资源 |
最基本的集合图形主要有点、线、圆、多边形等,有了基本几何图形,就可以演变
出更为复杂的图形。GD 库也提供了三个绘制基本图形的函数,imageline()
函数、
imagearc
()函数、imagerectangle
()函数分别用来绘制线段,弧形(包括圆弧),矩
形。
imageline()
函数用来绘制线段bool imageline(resource image, int x1, int y1, int x2, int y2, int color)
该函数参数表示使用 color颜色在图像 image上从坐标(x1,y1)到(x2,y2)画一条线段。在画布里,坐标原点为左上角,横坐标水平向右为正,纵坐标垂直向下为正。
imagearc()
函数用于绘制椭圆弧(包括圆弧)bool imagearc(resource image, int cx, int cy, int w, int h, int s, int e, int color)
该函数参数表示用 color颜色在图像 image上以(cx,cy)为中心,画一个椭圆弧,w和 h 分别是这个椭圆的宽和高,s 和 e都是角度,分别表示圆弧起点角度和圆弧终点角度0度位置在中心的三点钟位置(x 轴正轴方向)。
imagerectangle()
函数用来绘制一个矩形bool imagerectangel(resource image, int x1, int y1, int x2, int y2, int color)
该函数参数表示用 color颜色在图像 image上画一个矩形,左上角坐标为(x1,y1),右下角坐标(x2,y2)。
imagefill()函数用于图像区域填充
bool imagefill(resource image, int x, int y, int color)
该函数表示用 color 在 image图像的坐标(x,y)位置执行区域填充,与(x,y)点颜色相同且相邻的点都会被填充。
bool imagefilledarc(resource image, int cx, int cy, int w, int h, int s, int e, int color,int style)
它的参数说明同 imagearc()函数,与之相比,多了参数 style,它用来表示填充的方式,可选择有如下几种:
IMGARCPIE:普通填充,产生圆形边界
IMGARCCHORD:只是用直线连接了起始和结束点与 IMGARCPIE 互斥
IMGARCNOFILL:指明弧或弦只有轮廓,不填充
IMGARCEDGE:指明用直线将起始和结束点与中心点相连
bool imagefilledellipse(resource image, int cx, int cy, int width, int height, int color)
该函数表示用 color 颜色在 image图像上画一个填充的椭圆形,这个椭圆形的中心点在(cx,xy),宽为 windth,高为 height。
bool imagefilledrectangle(resource image, int x1, int y1, int x2, int y2, int color)
参数意义和 imagerectangle()函数一致,与之不同的是 imagefilledrectangle()函数会填充颜色。
bool imagefilledpolygon(resource image, array points, int numpoints, int color
该函数表示用 color 颜色在 image 图像上画一个填充的多边形,多边形的顶点按照顺序存储在 points 数组中, numpoints 表示多变形的边数,num_points 的数值必须大于等于3,且小于等于 points 数组的值个数的一半。
imagestring()的主要功能就是在图像中添加函数,它的语法格式
如下:
bool imagestring(resource image, int font, int x, int y, string string, int color)
该函数表示用 color颜色在 image图像上的(x,y)位置,使用 font字体绘制字符串string。绘制字符串的时候,是从(x,y)右下方开始绘制。通常情况下 font 使用 1,2,3,4,5等内置字体。
客户端第一次访问时将信息保存到服务器,同时分配给用户一个固定长度的字符串
(sessionID),并以 cookie方式保存在客户端
区别 | cookie | session |
---|---|---|
存放位置 | 客户端 | 服务器端 |
安全性 | 不够安全 | 安全 |
资源占用 | 存放在客户端,不占服务器资源 | 占服务器资源 |
生命周期 | 固定时长 | 每次访问,重新计算时长 |
文件大小 | 4k | 不限制 |
PHP 中把以两个下划线__
开头的函数(方法)称为魔术方法(Magic methods),
这些函数不需要显示的调用,而是由某种特定的条件触发。
魔术方法 | 功能 |
---|---|
__construct() | 类的构造函数,当一个类被实例化的时候自动调用 |
__destruct() | 类的析构函数,脚本执行结束的时候、销毁对象的时候、重新定义对象的时候 |
__get() | 读取不可访问或不存在属性时被调用 |
__set() | 当给不可访问或不存在属性赋值时被调用 |
__isset() | 当对不可访问属性调用 isset()或 empty()时调用 |
__unset() | 当对不可访问属性调用 unset()时被调用 |
__sleep() | 当使用 serialize时被调用(不需要保存大对象的所有数据时很有用) |
__wakeup() | 当使用 unserialize时被调用,可用于做些对象的初始化操作 |
__toString() | 当一个类被转换成字符串时被调用 |
__clone() | 进行对象 clone时被调用,用来调整对象的克隆行为 |
__invoke() | 当以函数方式调用对象时被调用 |
_setstate() | 调用 var_export()导出类时,此静态方法会被调用 |
__call() | 调用非 public或不存在的方法时被调用 |
__callStatic() | 调用不可访问或不存在的静态方法时被调用 |
__debugInfo() | 打印所需调试信息 |
指针
指针 | 指向 | 说明 |
---|---|---|
$this | 实例化对象 | 只能应用于成员方法中 可以调用 本类 或从 父类 中继承来的属性和方法 避免用$this 引用静态成员属性和类常量(使用 self) |
self | 类本身 | 可以访问 本类 或 父类 中的静态属性和静态方法 |
parent | 父类 | 访问 父类 中的静态属性和方法 |
单例模式
单例模式确保某个类只有一个实例
考点知识回顾:
一. 1+X Web前端中级必考 | PHP 技术与应用
二. 1+X Web前端等级考证 | 详解jQuery基础
三. 1+X Web前端等级考证 | 深入浅出MySQL数据库
四. 1+X Web前端等级考证 | Web中级12月最新模拟题
…
1+X Web前端等级考证 | 2020 12月Web前端开发中级理论 (试卷2) 附答案
1+X Web前端等级考证 | 2020 12月Web前端开发中级实操 (试卷2) 附答案
1+X Web前端等级考证 | 2020 12月Web前端开发中级实操 (试卷3) 附答案
1+X Web前端等级考证 | 2020 12月Web前端开发中级理论 (试卷3) 附答案
1+X Web前端等级考证 | 2020 12月Web前端开发中级实操 (试卷4) 附答案
1+X Web前端等级考证 | 2020 12月Web前端开发中级理论 (试卷4) 附答案
1+X Web前端等级考证 | 2020 12月Web前端开发中级实操 (试卷5) 附答案
1+X Web前端等级考证 | 2020 12月Web前端开发中级理论 (试卷5) 附答案
有时间会持续更新关于1+X 方面的~~