一、列举一些PHP的设计模式

  • 单例模式:保证在整个应用程序的生命周期中,任何一个时刻,单例类的实例都只存在一个,同时这个类还必须提供一个访问该类的全局访问点。
  • 工厂模式:定义一个创建对象的接口,但是让子类去实例化具体类。工厂方法模式让类的实例化延迟到子类中。
  • 观察者模式:观察者模式有时也被称作发布/订阅模式,该模式用于为对象实现发布/订阅功能:一旦主体对象状态发生改变,与之关联的观察者对象会收到通知,并进行相应操作。
  • 适配器模式:适配器模式将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作。
  • 依赖注入模式:依赖注入(Dependency Injection)是控制反转(Inversion of Control)的一种实现方式。要实现控制反转,通常的解决方案是将创建被调用者实例的工作交由 IoC 容器来完成,然后在调用者中注入被调用者(通过构造器/方法注入实现),这样我们就实现了调用者与被调用者的解耦,该过程被称为依赖注入。
  • 门面模式:门面模式(Facade)又称外观模式,用于为子系统中的一组接口提供一个一致的界面。

二、单例模式代码示例

  

三、PHP7 和 PHP5 的区别,具体多了哪些新特性?

  1. 性能提升了两倍
  2. 增加了结合比较运算符 (<=>)  , 以及 ?? 等。
  3. 增加了标量类型声明、返回类型声明
  4. try...catch 增加多条件判断,更多 Error 错误可以进行异常处理      Error 和 Exception 的捕获手段不同
  5. 增加了匿名类,现在支持通过new class 来实例化一个匿名类,这可以用来替代一些“用后即焚”的完整类定义。

   为什么性能提升了2倍?

  1. 变量存储字节减小,减少内存占用,提升变量操作速度
  2. 改善数组结构,数组元素和 hash 映射表被分配在同一块内存里,降低了内存占用、提升了 cpu 缓存命中率
  3. 改进了函数的调用机制,通过优化参数传递的环节,减少了一些指令,提高执行效率(在vm栈中的指令send_val和recv参数的指令是相同,PHP7通过减少这两条重复,来达到对函数调用机制的底层优化)

四、web常见的攻击手段

  1. CSRF  跨站伪造请求

    盗用用户身份,欺骗服务器,完成攻击请求。

    防范手段:  使用验证码, 为每个请求添加token验证。

  2. XSS 攻击   跨站脚本攻击。

    攻击者往页面里嵌入恶意js代码,攻击用户。

    防范手段: 核心就在于,永远不要相信用户的输入数据,始终对用户输入的数据保持过滤。

  3. SQL注入 攻击者在提交数据等场景 提交了一些非法的sql,导致数据库被注入大量垃圾数据,运行缓慢。或者暴露系统隐私数据。

    防范手段:核心依然在于永远不要相信用户输入的数据,不要使用动态拼装的sql,对隐私数据加密,禁止明文存储。

         其次,可以借助php.ini 里的一个配置magic_quotes_gpc = on 开启用户提交对查询时的字符转义 比如把'转义成\。 或者使用其他自定义函数进行过滤。

  Laravel 防sql注入相关策略:

  

五、框架相关-Laravel的服务容器

DI 依赖注入  所需要的依赖类都通过参数的形式传入。

IOC 控制反转  将依赖类的控制权交出去,由主动变为被动。

参考大佬文章 https://learnku.com/articles/19195

laravel 和 tp 的区别:

1.tp 5以前不支持composer。

2.tp 路由和文件名称位置绑定。 laravel重路由,有专门的路由文件。

3.laravel 在表单里提交时有对csrf攻击的防护处理,tp完全需要自己编写相应逻辑。

4.tp没有原生中间件层。

5.tp里没有.env这种灵活的系统配置。

六、四大排序算法实现

// 冒泡排序
function mpSort($a = []){
$count = count($a);
if($count <= 1){
return $a;
}
for($i = 0; $i < $count; $i++){
for($j = $count - 1; $j > $i; $j--){
if($a[$j] > $a[$i]){
$tmp = $a[$j];
$a[$j] = $a[$i];
$a[$i] = $tmp;
}
}
}
return $a;
} //快速排序
function ksSort($a = []){
$count = count($a);
if($count <= 1){
return $a;
}
$aLeft = $aRight = [];
$nTarget = $a[0];
for($i = 1; $i < $count; $i ++ ){
if($a[$i] > $nTarget){
$aRight[] = $a[$i];
}else{
$aLeft[] = $a[$i];
}
}
$aLeft = ksSort($aLeft);
$aRight = ksSort($aRight);
return array_merge($aLeft, [$nTarget], $aRight);
} //选择排序
function selectSort($a = []){
$count = count($a);
if($count <= 1) {
return $a;
}
for($i = 0; $i < $count -1; $i ++) {
$min = $i;
for($j = $i + 1; $j < $count ; $j++) {
if($a[$j] < $a[$min]){
$min = $j;
}
}
if($min != $i){
$tmp = $a[$min];
$a[$min] = $a[$i];
$a[$i] = $tmp;
}
}
return $a;
} // 插入排序
function insertSort($a = []){
$count = count($a);
if($count <= 1){
return $a;
}
for($i = 1; $i < $count; $i ++){
for($j = $i; $j > 0; $j--){
if($a[$j - 1] > $a[$j]){
$tmp = $a[$j - 1];
$a[$j-1] = $a[$j];
$a[$j] = $tmp;
}
}
}
return $a;
} //二分查找普通
function halfSelect($arr , $target){

 $count = count($arr);
  if($count <= 0 || !is_numeric($target)){
    return false;
  }

$i = 0;
  $j = $count -1;
  while($j >= $i){
    $tmp = floor(($i + $j) /2);
    if($arr[$tmp] == $target){
      return true;
    }
    if($arr[$tmp] < $target){
    $i = $tmp + 1;
    }
    if($arr[$tmp] > $target){
    $j = $tmp - 1;
    }
  }
  return false;
}

 

七、static关键字

1. static 修饰的变量和方法创建后,始终使用同一块内存。 而实例的方式,会创建多块内存。

2.static 修饰的变量和方法,不需要实例化类即可调用。 实例化类时,不会再次声明 static 修饰的属性。

3. 效率上讲, static要比普通实例化的方法高一些。 但是static的不会自动销毁, 实例化的方法会随着实例自动销毁。

引用一段话,说明下static 使用场景。

八、interface 工厂模式、抽象类相关

PHP的工厂模式大多采用interface去做,interface里的方法必须是public的,并且不能带函数体。

当interface的子类实现接口函数时,如果不想开发全部的函数实体,可以采用抽象类中转实现interface,再由子类继承抽象类来做,将子类不想实现的函数在抽象类中定义为普通函数(必须带函数体),不加abstract修饰。  加abstract修饰的函数不能带函数体。

// 抽象类 or 接口挺相似的作用。使用场景主要由子类是否是一些关联性比较强的类,如果是,就使用抽象类。 不是 就使用接口。 再有就是看 子类是不是需要实现多个接口以及静态成员变量之类的。

<?php
2
3 // 工厂interface
4 interface FactoryTest{
5 public function getName();
6 public function getPrice();
7 }
8 // 手机抽象类
9 abstract class Mobile implements FactoryTest{
10 abstract public function getName();
11 public function getPrice(){
12
13 }
14 }
15 // 手机品牌子类
16 class Apple extends Mobile{
17 public function getName(){
18 echo 'Iphone';
19 }
20 }
21
22
23 $obj = new Apple();
24 echo $obj->getName(); 

2020PHP面试-PHP篇的更多相关文章

  1. 2020PHP面试-Redis篇

    一.Redis 数据类型 1. string 字符型. 2.hash hash  结构化的对象.  key不可重复 3.list 队列  lpush rpop  lpop rpush 4. set 集 ...

  2. 2020PHP面试-SQL篇

    一.乐观锁和悲观锁 1.悲观锁是指假设并发更新会发生冲突,不管冲突是否会发生,都会使用锁机制. 优点: 完全保证数据安全. 缺点:锁机制会有额外开销,并发度降低. 可能会产生死锁. 2. 乐观锁是指假 ...

  3. 2020PHP面试-网络篇

    一.网络协议分层 OSI七层: 物理层.数据链路层.网络层.传输层.会话层.表示层.应用层. TCP/IP四(五)层 : 物理层(主要是光电信号的传输). 数据链路层(MAC地址.以太网协议).网络层 ...

  4. .Net程序员面试 中级篇 (回答Scott Hanselman的问题)

    继<.Net 程序员面试 C# 语言篇 (回答Scott Hanselman的问题)>跟<.Net程序员面试 每个人都应知道篇 (回答Scott Hanselman的问题)>之 ...

  5. web前端开发面试被虐篇(一)

    地点:北京 职位:前端开发工程师 要求:达到中级开发,JS基础足够扎实,css基础扎实,要求纯手写代码 面试过程: 进门一个面相老成的大叔递给我一份题,说别的都不好使先做题看看水平,说话语气很温和明显 ...

  6. 互联网公司技术岗实习/求职经验(实习内推+简历+面试+offer篇)

    找工作的事基本尘埃落定了,打算把这大半年来积累的经验写下来,基本都是我希望当年找实习的时候自己能够知道的东西,帮师弟师妹们消除一点信息不平等,攒攒RP~ 不要像我当年那样,接到电话吓成狗,没接到电话吓 ...

  7. 前端面试——css篇

    css盒子模型 在W3C模型中: 总宽度 = margin-left + border-left + padding-left + width + padding-right + border-rig ...

  8. Hadoop大数据面试--Hadoop篇

    本篇大部分内容參考网上,当中性能部分參考:http://blog.cloudera.com/blog/2009/12/7-tips-for-improving-mapreduce-performanc ...

  9. Java 笔试面试 基础篇 一

    1. Java 基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法, 线程的语法,集合的语法,io 的语法,虚拟机方面的语法. 1.一个".java& ...

随机推荐

  1. python编写banner获取的常用模块

    模块的概念:模块也叫库,每个模块中都内置了大量的功能和函数.类和变量.它就像是积木,可以根据需要进行调用组合.模块就是程序,每个模块就是一个后缀为.py的Python程序.Python的模块分为标准模 ...

  2. 实训41 S7通信 单向连接 基于DP网络通信

    连接的基本概念? 连接是指两个通信伙伴之间执行通信服务建立的逻辑链路,而不是指两个站之间用物理媒体(例如电缆)实现的连接. 连接相当于 通信伙伴之间 一条虚拟的"专线". 一条物理 ...

  3. uni app中关于图片的分包加载

    因为在项目中使用了大量的静态资源图片,使得主包体积过大, 而把这些图片全部放到服务器又有点麻烦,就想能不能把图片也分包,但是直接放在分包下的话导致图片资源找不到了, 在社区中看到大佬分享的十分有用,特 ...

  4. vue - 子组件向父组件 传递方法和参数

    1,子组件 TodoItem.vue  : <template>   <div class="todo-item" :class="{'is-compl ...

  5. Pycharm激活码(失效更新)

    该方法不需要修改Hosts, 如果修改过请删除后再激活. 获取激活码: http://idea.medeming.com/jet/images/jihuoma.txt http://idea.mede ...

  6. python——字符输出ASCII码

    总是忘记事,赶紧记下来,Python字符转成ASCII需要用到一个函数ord # 用户输入字符 ch = input("请输入一个字符: ") # 用户输入ASCII码,并将输入的 ...

  7. Java容器--Queue

    ConcurrentLinkedQueue 参考 https://www.cnblogs.com/leesf456/p/5539142.html ConcurerntLinkedQueue一个基于链接 ...

  8. Redis集群环境之linux搭建多机版---已完结,跟着一步一步来你就可以集群成功

    上一篇踩着各种坑写了Redis集群环境之linux搭建单机版,这一篇准备就多机版集群进行搭建,主要目的一来是在上一篇的基础上进行精华提粹总结,二来是把单机版与多机版的区别进行记录. 首先软硬件环境: ...

  9. C++编程学习(十)引用

    引用变量是一个别名,也就是说,它是某个已存在变量的另一个名字.一旦把引用初始化为某个变量,就可以使用该引用名称或变量名称来指向变量. 注意以下几点与指针的区别: 不存在空引用.引用必须连接到一块合法的 ...

  10. TensorFlow2 Part1:基础

    TensorFlow™是一个基于数据流编程(dataflow programming)的符号数学系统,被广泛应用于各类机器学习(machine learning)算法的编程实现,其前身是谷歌的神经网络 ...