Thinkphp⾯试问题
1.如何理解TP中的单⼀⼊⼝⽂件?
  答:ThinkPHP采⽤单⼀⼊⼝模式进⾏项⽬部署和访问,⽆论完成什么功能,⼀个项⽬都有⼀个统⼀(但不⼀定是唯⼀)的⼊⼝。应该说,所有项⽬都是从⼊⼝⽂件开始的,并且所有的项⽬的⼊⼝⽂件是类似的,⼊⼝⽂件中主要包括:
  定义框架路径、项⽬路径和项⽬名称(可选)
  定义调试模式和运⾏模式的相关常量(可选)
  载⼊框架⼊⼝⽂件(必须)
2.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本⾝。
3.如何理解 ThinkPHP 3.0 架构(核⼼ + ⾏为 + 驱动)中的⾏为?
  答:核⼼ + ⾏为 + 驱动
  TP官⽅简称为:CBD
mvc实例  核⼼(Core):就是框架的核⼼代码,不可缺少的东西,TP本⾝是基于MVC思想开发的框架。
  ⾏为(Behavior):⾏为在新版ThinkPHP的架构⾥⾯起着举⾜轻重的作⽤,在系统核⼼之上,设置了
很多标签扩展位,⽽每个标签位置可以依次执⾏各⾃的独⽴⾏为。⾏为扩展就因此⽽诞⽣了,⽽且很多系统功能也是通过内置的⾏为扩展完成的,所有⾏为扩展都是可替换和增加的,由此形成了底层框架可组装的基础。
  驱动( Driver ):数据库驱动、缓存驱动、标签库驱动和模板引擎驱动,以及外置的类扩展。
  框架,即framework。其实就是某种应⽤的半成品,就是⼀组组件,供你选⽤完成你⾃⼰的系统。简单说就是使⽤别⼈搭好的舞台,你来做表演。⽽且,框架⼀般是成熟的,不断升级的软件。
4. ThinkPHP如何防⽌SQL注⼊?(理解)
  (1)查询条件尽量使⽤数组⽅式,这是更为安全的⽅式;
  (2)如果不得已必须使⽤字符串查询条件,使⽤预处理机制;
  (3)开启数据字段类型验证,可以对数值数据类型做强制转换;(3.1版本开始已经强制进⾏字段类型验证了)
  (4)使⽤⾃动验证和⾃动完成机制进⾏针对应⽤的⾃定义过滤;
  (5)使⽤字段类型检查、⾃动验证和⾃动完成机制等避免恶意数据的输⼊。
5. 如何开启调试模式?调试模式有什么好处?
  开启调试模式很简单,只需要在⼊⼝⽂件中增加⼀⾏常量定义代码:
  <?php
  //开启调试模式
    define('APP_DEBUG', true);
  //加载框架⼊⼝⽂件
  require './ThinkPHP/ThinkPHP.php';
  在完成开发阶段部署到⽣产环境后,只需要删除调试模式定义代码即可切换到部署模式。开启调试模式后,系统会⾸先加载系统默认的调试配置⽂件,然后加载项⽬的调试配置⽂件,调试模式的优势在于:
  开启⽇志记录,任何错误信息和调试信息都会详细记录,便于调试;
  关闭模板缓存,模板修改可以即时⽣效;
  记录SQL⽇志,⽅便分析SQL;
  关闭字段缓存,数据表字段修改不受缓存影响;
  严格检查⽂件⼤⼩写(即使是Windows平台),帮助你提前发现Linux部署问题;
  可以⽅便⽤于开发过程的不同阶段,包括开发、测试和演⽰等任何需要的情况,不同的应⽤模式可以配置独⽴的项⽬配置⽂件。
6. TP中⽀持哪些配置模式?优先级?
  ThinkPHP在项⽬配置上⾯创造了⾃⼰独有的分层配置模式,其配置层次体现在:
    惯例配置->项⽬配置->调试配置->分组配置->扩展配置->动态配置
   以上是配置⽂件的加载顺序,因为后⾯的配置会覆盖之前的同名配置(在没有⽣效的前提下),所以优先顺序从右到左。
7. TP中的URL模式有哪⼏种?默认是哪种?
  ThinkPHP⽀持四种URL模式,可以通过设置URL_MODEL参数来定义,包括普通模式、PATHINFO、
REWRITE和兼容模式。
    默认模式为:PATHINFO模式,设置URL_MODEL 为1
8. TP中系统变量有哪些?如何获取系统变量?
  获取系统变量的⽅法:
  只需要在Action中调⽤下⾯⽅法:
  $this->⽅法名("变量名",["过滤⽅法"],["默认值"])
13、ThinkPHP框架中D函数与M函数的区别是什么?
   答:M⽅法实例化模型⽆需⽤户为每个数据表定义模型类,D⽅法可以⾃动检测模型类,如果存在⾃定义的模型类,则实例化⾃定义模型类,如果不存在,则会⾃动调⽤M⽅法去实例化Model基类。同时对于已实例化过的模型,不会重复去实例化(单例模式)。