2020年终小结

一、PHP

1、什么是PHP

PHP 全称 PHP Hypertext Preprocessor,是“超文本预处理器”的意思。

2、PHP变量的作用域

PHP 有四种不同的变量作用域:

  • local :局部作用域
  • global : 全局作用域
  • static : 静态作用域
  • parameter : 参数作用域

局部和全局作用域
在所有函数外部定义的变量,拥有全局作用域。除了函数外,全局变量可以被脚本中的任何部分访问,要在一个函数中访问一个全局变量,需要使用 global 关键字。
static 作用域
当一个函数完成时,它的所有变量通常都会被删除。然而,有时候您希望某个局部变量不要被删除,可以使用 static关键字。
参数作用域
参数是通过调用代码将值传递给函数的局部变量。参数是在参数列表中声明的,作为函数声明的一部分。

3、 echo、print_r、print、var_dump之间的区别

① echo和print都只能打印字符串,print_r和var_dump可以打印复合类型,数组和对象等。
② echo不是函数,没有返回值。print也不是个函数,是一种语言结构,但是print的速度比echo 慢。
③ print_r可以用来打印复杂的数据类型,但是也只能打印数据类型本身。var_dump同样可以打印复杂的数据类型,却可以打印出详细的信息,比如打印数据会显示数组的长度,每一项的数据类型,字节数等。

4、 include、include_once和require、require_once的区别?

① include() 、require()语句包含并运行指定文件。这两结构在包含文件上完全一样,唯一的区别是对于错误的处理。require()语句在遇到包含文件不存在,或是出错的时候,就停止即行,并报错。include()则继续即行。
tips:include() 产生一个警告,而require() 则导致一个致命错误
② include_once()函数的作用与include相同,不过它会首先验证是否已经包含了该文件。如果已经包含,则不再执行include_once。否则,则必须包含该文件。除了这一点与include完全相同。
③ require_once函数确保文件只包含一次。在遇到require_once后,后面再试图包含相同的文件时将被忽略。

5、 sesson和cookie的区别?如何实现session共享?

1、首先谈谈为什么有session,由于http协议是无状态的,所以服务器要记录用户状态时,就必须要某种机制,于是就产生了session。
2、区别:
① session是储存在服务器的,cookie是保存在浏览器的,所以session相对于cookie比较安全。
② session 可以存储的数据类型很多,数组对象都支持。而cookie只能存储单一的字符串,bool和int。
③ 单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie,session没有大小限制,存储就是看服务器的存储能力,因此session较多会服务器的性能。
④ session的生命周期默认是30分钟,关闭浏览器也会直接结束回话。cookie则可以长期保存。
⑤ 禁用cookie后,session是不能正常使用的。
3、下面我们看看session的工作原理
在这里插入图片描述4、我们可以使用redis对session进行存储,从而实现session共享。

6、 get和post的区别?

① 从字面上理解 get 是用来获取数据的,post 是用来提交数据的。
② get传参是放在浏览器的url上的所以参数的长度和大小都受限制,一般是小于2000字符,不能大于2kb。post理论上是没有限制的。
③ get安全性非常低,post安全性较高。
④ get产生一个tcp数据包;post产生两个tcp数据包。post请求浏览器先发送header,服务器响应100后,再发送data。

7、 常用的http状态码

一二三四五原则:(即一:消息系列;二:成功系列; 三:重定向系列;四:请求错误系列;五:服务器端错误系列。)

状态码英文名称中文说明
100Continue继续。客户端应继续其请求
200OK请求成功。一般用于GET与POST请求
301Moved Permanently永久重定向
302Found临时重定向
304Not Modified未修改。所请求的资源未修改
400Bad Request客户端请求的语法错误,服务器无法理解
403Forbidden拒绝执行此请求
404Not Found服务器无法根据客户端的请求找到资源
500Internal Server Error服务器内部错误
502Bad Gateway网关错误
504Gateway Time-out充当网关或代理的服务器,未及时从远端服务器获取请求

8、php中传值与传引用的区别?

传值:在函数范围内,改变变量值得大小,都不会影响到函数外边的变量值。
传引用:在函数范围内,对值的任何改变,在函数外部也有所体现,因为传引用传的是内存地址。
下面通过一道题讲解一下引用:

$a = "hello";
$b = &$a;
unset($b);
$b = "world";
echo $a; 
echo "\n";
echo $b;

输入结果是:hello world

$a 指向的是一个地址,内容是hello,$b=&$a$b引用了$a,也就是$b也指向了这个地址,那么此时$b等于hello,unset($b)是将$b的那个指向给去掉,不会影响到内容,所有$a还是等于hello

在这里插入图片描述

9、冒泡算法。

 <?php
 $arr = [1, 43, 2, 65, 342, 3, 7, 4, 23, 88];
 for ($i = 0; $i < count($arr); $i++) {
     for ($j = 0; $j < count($arr) - 1; $j++) {
         if ($arr[$j] > $arr[$j + 1]) {
             $temp = $arr[$j];
             $arr[$j] = $arr[$j + 1];
             $arr[$j + 1] = $temp;
         }
     }
 }

10、php7的新特性

① 标量类型与返回值类型声明,也就是说PHP也可以是强类型的语言了。

declare(strict_types=1); 

代码中通过指定 strict_types的值(1或者0),1表示严格类型校验模式,作用于函数调用和返回语句;0表示弱类型校验模式。

<?php
declare(strict_types=1);

function returnIntValue(int $value): int
{
   return $value;
}

print(returnIntValue(5));

② NULL 合并运算符
这个简直太好用了,直接看试例

<?php
//以前的写法
$fabulous = isset($_GET['fabulous']) ? $_GET['fabulous'] : '点赞';
//现在的写法
$fabulous = $_GET['fabulous'] ?? '点赞';

③ 太空船运算符(组合比较符),用于比较两个表达式 $a 和 $b,如果 $a 小于、等于或大于 $b时,它分别返回-1、0或1。

<?php
print( 1 <=> 1);print(PHP_EOL);
print( 1 <=> 2);print(PHP_EOL);
print( 2 <=> 1);print(PHP_EOL);
//输出结果
0 
-1
1

④ use 语句。这个就不多说了,用过框架的都知道。
⑤ Session 选项,session_start() 函数可以接收一个数组作为参数,可以覆盖 php.ini 中 session 的配置项。
⑥ intdiv() 函数,新增加了 intdiv() 函数,接收两个参数,返回值为第一个参数除于第二个参数的值并取整。
⑦ 常量数组。PHP 5.6 中仅能通过 const 定义常量数组,PHP 7 可以通过 define() 来定义。
还有一些我没有写出来,想知道的朋友自己百度一下

11、PHP的魔术方法

注意: 所有的魔术方法 必须 声明为 public
__construct(),类的构造函数
__destruct(),类的析构函数
__call(),在对象中调用一个不可访问方法时调用
__callStatic(),用静态方式中调用一个不可访问方法时调用
__get(),获得一个类的成员变量时调用
__set(),设置一个类的成员变量时调用
__isset(),当对不可访问属性调用isset()或empty()时调用
__unset(),当对不可访问属性调用unset()时被调用。
__sleep(),执行serialize()时,先会调用这个函数
__wakeup(),执行unserialize()时,先会调用这个函数
__toString(),类被当成字符串时的回应方法
__invoke(),调用函数的方式调用一个对象时的回应方法
__set_state(),调用var_export()导出类时,此静态方法会被调用。
__clone(),当对象复制完成时调用
__autoload(),尝试加载未定义的类
__debugInfo(),打印所需调试信息

12、常用的超全局变量

$GLOBALS — 引用全局作用域中可用的全部变量
$_SERVER — 服务器和执行环境信息
$_GET — HTTP GET 变量
$_POST — HTTP POST 变量
$_FILES — HTTP 文件上传变量
$_REQUEST — HTTP Request 变量
$_COOKIE — HTTP Cookies
$_SESSION — Session 变量 (注意:要先session_start())
$_REQUEST — HTTP Request 变量
$_ENV — 环境变量

13、什么是面向对象?面向对象主要特征是什么?

1.把数据及对数据的操作方法放在一起,作为一个相互依存的整体——对象,对同类对象抽象出其共性,形成类。类中的大多数数据,只能用本类的方法进行处理。类通过一个简单的外部接口与外界发生关系,对象与对象之间通过消息进行通信。程序流程由用户在使用中决定。
2.主要特征:封装 ,继承 ,多态

14、PHP遍历文件夹下所有文件

<?php
$dir = "D:\\";
function renderDir($dir)
{
    $handle = opendir($dir);
    if ($handle) {
        while (($fl = readdir($handle)) !== false) {
            $subFile = $dir . '\\' . $fl;
            if (is_dir($subFile) && $fl != '.' && $fl != '..') {
                echo '目录:' . $subFile . '<br>';
                renderDir($subFile);
            } else {
                if ($fl != '.' && $fl != '..') {
                    echo '文件:' . $subFile . '<br>';
                }
            }
        }
    }
}
renderDir($dir);

15、说一下单引号双引号?

① 双引号可以解析变量,单引号不能解析变量。
② 点引号的速度比双引号快

16、在PHP中error_reporting这个函数有什么作用?

error_reporting()设置错误报告级别,并返回该错误级别。

<?php
 // 关闭错误报告
 error_reporting(0);
 // 报告 runtime 错误
 error_reporting(E_ERROR | E_WARNING | E_PARSE);
 // 报告所有错误
 error_reporting(E_ALL);
 // 等同 error_reporting(E_ALL);
 ini_set("error_reporting", E_ALL);
 // 报告 E_NOTICE 之外的所有错误
 error_reporting(E_ALL & ~E_NOTICE);

17、简述 private、 protected、 public修饰符的访问权限。

private 私有成员,在该类里才能访问。
protected 受保护成员,在该类里和继承了该类的类里都能访问。
public 公共成员,没有限制。

18、PHP abstract与interface之间的区别

详见:https://blog.csdn.net/fzx_javascript/article/details/115018180

19、PHP处理跨域

header设置允许跨域

//  指定允许其他域名访问
header('Access-Control-Allow-Origin:*');
// 响应类型
header('Access-Control-Allow-Methods:GET, POST, OPTIONS');
// 响应头设置
header('Access-Control-Allow-Credentials:false');

二、mysql

1、数据表的约束

详见:https://blog.csdn.net/fzx_javascript/article/details/89385788

2、MyISAM和 InnoDB 的基本区别?

① InnoDB支持事务,MyISAM不支持事务。
② InnoDB支持行锁,MyISAM只支持表锁。
③ InnoDB支持外键,MyISAM不支持外键。
④ InnoDB表必须有主键,MyISAM可以没有。
⑤ 清空整个表时,InnoDB是一行一行的删除,效率非常慢。MyISAM则会重建表。
因为上面的种种原因,所以MyISAM的查询速度比InnoDB要快,要是一张表只需要查询操作的话建议使用MyISAM,而要对表进行增删改的话选择InnoDB比较好。

3、索引的作用?和它的优点缺点是什么?

索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。
索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容,提高性能(查询速度)。
优点:
1.通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。
2.加快数据的检索速度。
3.可以加速表和表之间的连接。
4.在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。
缺点:
1.创建和维护索引要耗费时间,这种时间随着数据量的增加而增加。
2.索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚集索引那么需要的空间就会更大。
3.当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。

4、事务的隔离级别

一、事务的基本要素(ACIB)
1.原子性(Atomicity):事务开始后所以的操作,要么全部做完,要么全部不做,不可能停滞在中间的某个环节。事务执行过程中出错,会回滚到事务开始前的状态,所以的操作就像没发生一样,也就是说事务是个不可分割的整体。
2.一致性(Consistency):事务开始前和结束后,数据库的完整性约束没有被破坏。比如A向B转账,不可能A扣了钱,B却没收到。
3.隔离性(Isolation):同一时间,只允许一个事务请求同一数据,不同的事务之间彼此没有任何干扰。比如A正在从一张银行卡中取钱,在A取钱的过程结束前,B不能向这张卡转账。
4.持久性(Durability):事务完成后,事务对数据库的所有更新将被保存到数据库,不能回滚。
二、事务的并发问题
1、脏读:事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据
2、不可重复读:事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果 不一致。
3、幻读:系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级,但是系统管理员B就在这个时候插入了一条具体分数的记录,当系统管理员A改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样,这就叫幻读。
三、MySQL事务隔离级别

事务的隔离级别脏读不可重复读幻读
读未提交(read-uncommitted)
不可重复读(read-committed)
可重复读(repeatable-read)
串行化(serializable)

5、数据库三范式

1NF:原子性:字段不可分。列如:地址就必须把省市区拆分成3个字段。
2NF:唯一性:一个表只说明一个事物。
3NF:每列都与主键有直接关系,不存在传递依赖。

6、mysql 中有哪几种锁

① 表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。
② 行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。
③ 页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。

7、mysql 的优化

1、创建索引优化:
① 数据量较少的表无须建立索引。
② 避免对具有较少值的字段或者说重复较多的字段作为索引。
③ 避免选择大型数据类型的列作为索引。
④ 对经常修改的字段不要创建索引。
⑤ 在经常出现在where后的条件字段创建索引。
⑥ 经常出现在GROUP BY , ORDER BY后的字段建立索引。
注意: not in, in, !=, not exist会导致索引失效,对于like “%_” 百分号在前面也会导致索引失效。
2、查询优化:
① 减少select * 的查询。
② == null 用is null代替。
③ 将外连接转换成内连接。
④ 优化count()、max()和min()。
3、其他优化:
学会使用 explain 。

 -- explain包含的字段
id  -- select查询的序列号,包含一组数字,表示查询中执行select子句或操作表的顺序
select_type -- 查询类型
table -- 正在访问哪个表
partitions -- 匹配的分区
type -- 访问的类型
possible_keys -- 显示可能应用在这张表中的索引,一个或多个,但不一定实际使用到
key -- 实际使用到的索引,如果为NULL,则没有使用索引
key_len -- 表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度
ref -- 显示索引的哪一列被使用了,如果可能的话,是一个常数,哪些列或常量被用于查找索引列上的值
rows -- 根据表统计信息及索引选用情况,大致估算出找到所需的记录所需读取的行数
filtered -- 查询的表行占表的百分比
Extra -- 包含不适合在其它列中显示但十分重要的额外信息

三、Linux

1、基本命令

详见:https://blog.csdn.net/fzx_javascript/article/details/104298052

四、其他

1、Redis的基本数据类型及应用。

1.String 字符串:
格式: set key value
string类型是Redis最基本的数据类型,一个键最大能存储512MB。
应用场景:
1、字符串存储:字符串存储是最常用的,短信验证码的存储,普通字符串存储等。
2、限速:可以对发送短信验证码的接口进行限速等。
3、生成自增 id:当 redis 的 string 类型的值为整数形式时,redis 可以把它当做是整数一样进行自增(incr)自减(decr)操作。
2.Hash 哈希:
格式: hmset name key1 value1 key2 value2
hash 是一个键值(key=>value)对集合。
hash 是一个string类型的field和value的映射表,hash特别适合用于存储对象。
应用场景:
hash是以键值对的形式存储,所有存储用户的基本信息非常适合使用该类型。
3.List 列表:
Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)
格式: lpush name value
在 key 对应 list 的头部添加字符串元素
格式: rpush name value
在 key 对应 list 的尾部添加字符串元素
格式: lrem name index
key 对应 list 中删除 count 个和 value 相同的元素
格式: llen name
返回 key 对应 list 的长度
应用场景:
redis 的 list 数据类型对于大部分使用者来说,是实现队列服务的最经济,最简单的方式。
4.Set 集合:
格式: sadd name value
Redis的Set是string类型的无序集合。
集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。
应用场景:
适合集合取交集,并集,差集。
5.zset(sorted set:有序集合)
格式: zadd name score value
Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。
zset的成员是唯一的,但分数(score)却可以重复。
应用场景:
适合做排行榜。

2、常用端口号

名称端口号
HTTP服务器80
HTTPS服务器443
FTP21
SSH22
Oracle 数据库1521
mysql数据库3306
SQLServer数据库1433
Redis6379
mamcache11211
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值