首页 > PHP技术 > ThinkPHP框架 > ThinkPHP面试题(最全干货!!!)
2020
12-19

ThinkPHP面试题(最全干货!!!)

attachments-2020-12-wr2kSbK35fdd5a567f1df.png

面试背景

先说说thinkphp面试的背景,一般来说tp是大部分小白上手的框架,简易,入手快,开发快,所以一般面试官在考你tp内容的同时一定会问到你一些基础性的内容,那么下面就是我准备的一些基础和tp面试题:


1、HTTP状态码
点击这儿查看HTTP状态码详解
常见的HTTP状态码:
200 - 请求成功
301 - 资源(网页等)被永久转义到其他URL
404 - 请求的资源(网页等)不存在
505 - 内部服务器错误
HTTP状态码分类:
1** - 信息,服务器收到的请求,需要请求者继续执行操作
2** - 成功,操作被成功接收并处理
3** - 重定向,需要进一步的操作以完成请求
4** - 客户端错误,请求包含语法错误或者无法完成请求
5** 服务器错误,服务器在处理请求的过程
中发生了错误


2、什么是魔术引号
魔术引号是一个将自动将进入PHP脚本的数据进行转义的过程,最好在编码时不要转义而在运行时根据需要而转义


3、说明php中传值与传引用的区别,并说明传值什么时候传引用?
变量默认总是传值赋值,那也就是说,当将一个表达式的值赋予一个变量时,整个表达式的值被赋值到目标变量,这意味着:当一个变量的赋予另外一个变量时,改变其中一个变量的值,将不会影响到另外一个变量


4、语句include和require的区别是什么?为避免多次包含同一文件,可以用(?)语句代替他们
require是无条件包含,也就是如果一个流程里加入require,无论条件成立与否都会先执行require,当文件不存在或者无法打开的时候,会提示错误,并且会终止程序执行
include有返回值,而require没有(可能因为如此require的速度比include快),如果被包含的文件不存在的化,那么会提示一个错误,但是程序会继续执行下去
注意:包含文件不存在或者语法错误的时候require是致命的,而include不是
require_once表示了只包含一次,避免了重复包含


5、是否使用过模板引擎?使用的模板引擎的名字是?
Smarty:Smarty算是一种很老的PHP模板引擎了,它曾是我使用这门语言模板的最初选择。虽然它的更新已经不算频繁了,并且缺少新一代模板引擎所具有的部分特性,但是它仍然值得一看。


6、SESSION与COOKIE的区别?
(1)存储位置:session存储于服务器,cookie存储于浏览器
(2)安全性:session安全性比cookie高
(3)session为‘会话服务’,在使用时需要开启服务,cookie不需要开启,可以直接用


7、如何理解TP中的单一入口文件?
答:ThinkPHP采用单一入口模式进行项目部署和访问,无论完成什么功能,一个项目都有一个统一(但不一定是唯一)的入口。应该说,所有项目都是从入口文件开始的,并且所有的项目的入口文件是类似的,入口文件中主要包括:
  定义框架路径、项目路径和项目名称(可选)
  定义调试模式和运行模式的相关常量(可选)
  载入框架入口文件(必须)


8、ThinkPHP中的MVC分层是什么?(理解)
MVC 是一种将应用程序的逻辑层和表现层进行分离的方法。ThinkPHP 也是基于MVC设计模式的。MVC只是一个抽象的概念,并没有特别明确的规定,ThinkPHP中的MVC分层大致体现在:
  模型(M):模型的定义由Model类来完成。
  控制器(C):应用控制器(核心控制器App类)和Action控制器都承担了控制器的角色,Action控制器完成业务过程控制,而应用控制器负责调度控制。
  视图(V):由View类和模板文件组成,模板做到了100%分离,可以独立预览和制作。
  但实际上,ThinkPHP并不依赖M或者V ,也就是说没有模型或者视图也一样可以工作。甚至也不依赖C,这是因为ThinkPHP在Action之上还有一个总控制器,即App控制器,负责应用的总调度。在没有C的情况下,必然存在视图V,否则就不再是一个完整的应用。
  总而言之,ThinkPHP的MVC模式只是提供了一种敏捷开发的手段,而不是拘泥于MVC本身。


9、如何理解 ThinkPHP架构(核心 + 行为 + 驱动)中的行为?
答:核心 + 行为 + 驱动
TP官方简称为:CBD
  核心(Core):就是框架的核心代码,不可缺少的东西,TP本身是基于MVC思想开发的框架。
  行为(Behavior) :行为在新版ThinkPHP的架构里面起着举足轻重的作用,在系统核心之上,设置了很多标签扩展位,而每个标签位置可以依次执行各自的独立行为。行为扩展就因此而诞生了,而且很多系统功能也是通过内置的行为扩展完成的,所有行为扩展都是可替换和增加的,由此形成了底层框架可组装的基础。
  驱动( Driver ):数据库驱动、缓存驱动、标签库驱动和模板引擎驱动,以及外置的类扩展。
  框架,即framework。其实就是某种应用的半成品,就是一组组件,供你选用完成你自己的系统。简单说就是使用别人搭好的舞台,你来做表演。而且,框架一般是成熟的,不断升级的软件。


10、 ThinkPHP如何防止SQL注入?(理解)
  (1)查询条件尽量使用数组方式,这是更为安全的方式;
  (2)如果不得已必须使用字符串查询条件,使用预处理机制;
  (3)开启数据字段类型验证,可以对数值数据类型做强制转换;(3.1版本开始已经强制进行字段类型验证了)
  (4)使用自动验证和自动完成机制进行针对应用的自定义过滤;
  (5)使用字段类型检查、自动验证和自动完成机制等避免恶意数据的输入。


11、 如何开启调试模式?调试模式有什么好处?
  开启调试模式很简单,只需要在入口文件中增加一行常量定义代码:

<?php   //开启调试模式    define('APP_DEBUG', true);

  //加载框架入口文件    require './ThinkPHP/ThinkPHP.php';

  在完成开发阶段部署到生产环境后,只需要删除调试模式定义代码即可切换到部署模式。开启调试模式后,系统会首先加载系统默认的调试配置文件,然后加载项目的调试配置文件,调试模式的优势在于:
  开启日志记录,任何错误信息和调试信息都会详细记录,便于调试;
  关闭模板缓存,模板修改可以即时生效;
  记录SQL日志,方便分析SQL;
  关闭字段缓存,数据表字段修改不受缓存影响;
  严格检查文件大小写(即使是Windows平台),帮助你提前发现Linux部署问题;
  可以方便用于开发过程的不同阶段,包括开发、测试和演示等任何需要的情况,不同的应用模式可以配置独立的项目配置文件。


12.TP中支持哪些配置模式?优先级?

ThinkPHP在项目配置上面创造了自己独有的分层配置模式,其配置层次体现在:
  惯例配置->项目配置->调试配置->分组配置->扩展配置->动态配置
  以上是配置文件的加载顺序,因为后面的配置会覆盖之前的同名配置(在没有生效的前提下),所以优先顺序从右到左。


13. TP中的URL模式有哪几种?默认是哪种?
ThinkPHP支持四种URL模式,可以通过设置URL_MODEL参数来定义,包括普通模式、PATHINFO、REWRITE和兼容模式。
  默认模式为:PATHINFO模式,设置URL_MODEL 为1


14、TP中系统变量有哪些?如何获取系统变量?
获取系统变量的方法:
  只需要在Action中调用下面方法:
$this->方法名("变量名",["过滤方法"],["默认值"])


15、ThinkPHP框架中D函数与M函数的区别是什么?
答:M方法实例化模型无需用户为每个数据表定义模型类,D方法可以自动检测模型类,如果存在自定义的模型类,则实例化自定义模型类,如果不存在,则会自动调用M方法去实例化Model基类。同时对于已实例化过的模型,不会重复去实例化(单例模式)。


16、双引号和单引号的区别
双引号解释变量,单引号不解释变量
双引号里插入单引号,其中单引号里如果有变量的话,变量解释
双引号的变量名后面必须要有一个非数字、字母、下划线的特殊字符,或者用{}讲变量括起来,否则会将变量名后面的部分当做一个整体,引起语法错误
双引号解释转义字符,单引号不解释转义字符,但是解释'\和\
能使单引号字符尽量使用单引号,单引号的效率比双引号要高(因为双引号要先遍历一遍,判断里面有没有变量,然后再进行操作,而单引号则不需要判断)


17、对于大流量网站,采用什么方法来解决访问量的问题
确认服务器硬件是否能够支持当前的流量
数据库读写分离,优化数据表
程序功能规则,禁止外部的盗链
控制大文件的下载
使用不同主机分流主要流量

以下是当我们的项目慢慢出现卡顿,用户量增加,我们需要去做优化需要学习了解的内容,性能优化 可以使用缓存Redis,数据量优化,可以去了解mysql优化,索引。

扫码芷若 获取免费视频学习资料

编程学习

查 看2019高级编程视频教程免费获取