面试题总结101-)

101.常见框架有哪些php

laravel , thinkPHP,yii,ci,目前市场上用得最多的大概就这几个框架吧。你学好一个框架就有饭吃的咯。html

 

102. 经常使用魔术方法的触发时机?mysql

 1)__autoload() :当程序实例化某个类,而该类没有在当前文件中被引入。此时会触发执行__autoload()。程序但愿经过该方法,自动引入这个类文件。该方法有一个参数,即就是那个忘记引入的类的名称。__autoload()方法的工做原理是什么?当程序执行到实例化某个类的时候,若是在实例化前没有引入这个类文件,那么就自动执行__autoload()函数。这个函数会根据实例化的类的名称来查找这个类文件的路径,当判断这个类文件路径下确实存在这个类文件后,就执行include或者require来载入该类,而后程序继续执行,若是这个路径下不存在该文件时就提示错误。使用自动载入的魔术函数能够没必要要写不少个include或者require函数。jquery

 

 2)__construct()  :这个是魔术构造方法。构造方法是实例化对象的时候自动执行的方法,做用就是初始化对象。该方法能够没有参数,也能够有多个参数。若是有参数,那么new这个对象的时候要记得写上相应的参数。在php5之前,没有魔术构造方法,普通构造方法是一个跟类名同名的方法来实现构造的。若是一个类中既写了魔术构造方法,又定义了普通构造方法。那么php5以上版本中,魔术方法起做用,普通构造方法不起做用。反之,在php5之前版本中,不认识魔术构造方法,只是把该方法当作普通的方法。laravel

 

 3)__destruct()  :这个是魔术析构方法。析构方法的做用和构造方法正好相反,是对象被销毁时被自动调用的,做用是释放内存。析构方法没有参数。程序员

 

 4)__call() :当程序调用一个不存在或不可见的成员方法时,自动触发执行__call()。它有两个参数,分别是未访问到的方法名称和方法的参数。而第二个参数是数组类型。正则表达式

 

 5)__get() :当程序调用一个未定义或不可见的成员属性时,自动触发执行__get()。它有一个参数,表示要调用的属性的名称。sql

 

 6)__set():当程序试图写入一个不存在或不可见的成员属性时,PHP就会自动执行__set()。它包含两个参数,分别表示属性名称和属性值。数据库

 

 7)__tostring()  :当程序使用echo或print输出对象时,会自动调用该方法。目的是但愿经过该方法将对象转化为字符串,再输出。__tostring() 无参数,可是该方法必须有返回值。编程

 

 8)__clone()  :当程序clone一个对象的时候,能触发__clone()方法,程序但愿经过这个魔术方法实现:不只仅单纯地克隆对象,还须要克隆出来的对象拥有原来对象的全部属性和方法。

 

103. MVC的概念是什么?

 MVC(即模型-视图-控制器)是80年代发明的一种软件设计模式或者说编程思想。

 M指模型层,V是指视图层(显示层或者用户界面),C是指控制层。

 使用mvc的目的是实现M和V分离,从而使得一个程序能够轻松使用不一样的用户界面。

 C存在的目的则是在M和V之间起到调节做用,确保M和V的同步,一旦M改变,V应该能同步更新。

 将M和V分离,就能够作到同一个网页,在不一样节日到来的时候能显示不一样的页面风格,这只须要提早制做多个视图层模板页面,

 而无需更改M层程序。

 MVC作到了编程中的分工合做,代码的可重用性获得最大化体现,程序逻辑更加清晰而富有条理,便于后期维护管理。

 

10四、 访问权限修饰符有哪几种,对比解释

 答:一、public 表示公共的,在本类中和子类中以及类外,能够对其调用

 二、protected表示受保护的,能够在本类中和子类中调用

 三、private表示私有的,只能在本类中调用

 四、var,效果等同于public

 

10五、 Class关键词前能够有哪些修饰词

 a) Final修饰,表示该类是最终的,没法继承

 b) Abstract修饰,表示该类是抽象类

 

10六、 做用域操做符在那些场合下使用

 答:做用于操做符的使用场合

 a) 本类中:

  i. self::类常量

  ii. self::静态属性

  iii. self::方法()   parent::方法()

 b) 子类中:

  i. parent::类常量

  ii. parent::静态属性(public或者protected)

  iii. parent::方法()(public或者protected)

 c) 类外:

  i. 类名::类常量

  ii. 类名::静态属性(public)

  iii. 类名::静态方法(public)

 

10七、 $this,self, parent分别表明什么?哪些场合下使用

 答:$this表明的是当前对象

 self表明的是当前的类

 parent表明的是当前类的父类

 使用场合:

 $this只能使用在当前类中,经过$this->能够调用当前类中的属性和方法;

 self只能在当前类中使用,经过做用域操做符::访问当前类中的类常量、当前类中的静态属性、当前类中的方法;

 parent只能使用在有父类的当前类中,经过做用域操做符::访问父类中的类常量、父类中的静态属性、父类中的方法。

 

10八、 说明是接口、抽象类两者有何相同和不一样的地方?

 一、接口是帮助php实现功能意义上的多继承的,用interface来声明,其方法没有方法体,使用implemens关键词来实现接口。

 接口中只能包含抽象方法和类常量,不能够包含成员属性。

 二、抽象类是一种不能被实例化的类,只能做父类,用abstract class来定义,抽象类和普通类能够没有区别,类中能够包含成员属性、类常量、方法。

 子类得用extends来继承,并且只能是单继承。

 二者相同点是都不能够被实例化,都是须要被继承才可使用。

 二者的最大区别是接口能够实现多继承,而抽象类只能是单继承。

 接口中不能包含成员属性,而抽象类中能够有成员属性。

 接口中的抽象方法必须是public或者无访问修饰词,接口中的抽象方法不能用abstract来修饰。

 抽象类中的方法能够是普通方法,也能够是抽象方法,若是是抽象方法,必定须要使用abstract来修饰。

 

10九、 解释PHP中单例模式?

 又叫作单态模式、单元素模式、singleton pattern。

 单例模式指在PHP的应用程序的范围内只对指定的类建立一个实例。使用单例模式的类称为单例类。

 在php中单例类必需要有一个私有的构造方法,还要有一个私有的魔术克隆方法(该方法体中为空)

 和一个私有的静态的成员属性$_instance.

 私有构造方法防止除自身之外的类来实例化它。私有的方法体为空的克隆方法防止该类被克隆。

 $_instance用来存储被自身实例化后的对象。

 还必需要有一个公共的静态的方法getInstance()。该方法返回已经存储了实例对象的$_instance。

 

 1十、 什么是SQL注入?

 SQL注入攻击是黑客对数据库进行攻击的经常使用手段之一。一部分程序员在编写代码的时候,

 没有对用户输入数据的合法性进行判断,注入者能够在表单中输入一段数据库查询代码并提交,

 程序将提交的信息拼凑生成一个完整sql语句,服务器被欺骗而执行该条恶意的SQL命令。注入者根据程序返回的结果,

 成功获取一些敏感数据,甚至控制整个服务器,这就是SQL注入。

111,如何防止SQL注入?(可扩展)

 要对提交的信息进行过滤,对单引号进行转义。

 首先能够在php.ini中设置,让全部的单引号在提交后都进行转义。或者使用addslashes().

 

1十二、 FCKEditor自动过滤的解决办法?

 若是您须要编辑模板页,默认的FCK设置是会去掉<HTML></HTML><BODY></BODY>标签,并且会给你加上<P></P>标签的,若是须要保留的话,只要更改下设置能够了。

 在fckconfig.js里面有:FCKConfig.FullPage = false ;

 改成:FCKConfig.FullPage = true;

 若是想去掉自动添加<P>的代码就能够在这里设置

 默认是

 FCKConfig.EnterMode = 'p' ;    // p | div | br

 FCKConfig.ShiftEnterMode = 'br' ; // p | div | br

 改为

 FCKConfig.EnterMode = 'br' ;    // p | div | br

 FCKConfig.ShiftEnterMode = 'p' ; // p | div | br 

 

11三、 $_REQUEST、$_GET、$_POST、$_COOKIE 的关系和区别: 

 1.关系:$_REQUEST包含了$_GET、$_POST、$_COOKIE等的全部内容,是它们的集合体。

 2.经过$_REQUEST获取变量值,PHP页面由于不肯定它是哪一种传值方式,

 所以会根据php.ini中的配置来接收值。

 php.ini里能够设置,variables_order = “GPC”。其含义是GET,POST,COOKIE.

 因此PHP页面会先从$_GET中获取,再从$_POST中获取,而后从$_COOKIE中获取。

 新得到的值会覆盖以前获取到的值。

 所以从表现形式上看,$_REQUEST最后是获取$_COOKIE中的值,若是$_COOKIE中没有值,

 会获取$_POST中的值,若是$_POST没有获取到 ,就去$_GET中获取。

 若是$_GET中也没有该值,那么$_REQUEST就返回null。

  

11四、 什么是多条件查询(复合查询),如何实现多条件查询?(重点)

 如何实现万能查询呢?查询的时候要填写查询条件,这些条件会经过表单进行提交。

 首先须要检查提交的条件是否为空。若是不为空,就认为这个值是要被看成条件,

 咱们就可使用字符串链接的方式来组合一个sql查询语句。

 当执行后获取查询结果。

 

115. 文件上传须要注意哪些细节?怎么把文件保存到指定目录?怎么避免上传文件重名问题?

 1). 首现要在php.ini中开启文件上传;

 2). 在php.ini中有一个容许上传的最大值,默认是2MB。必要的时候能够更改;

 3). 上传表单必定要记住在form标签中写上enctype="multipart/form-data";

 4). 提交方式 method 必须是 post;

 5). 设定 type="file" 的表单控件,而且必须具备name属性值;

 6). 为了上传成功,必须保证上传文件的大小是否超标、文件类型是否符合要求,上传后存放的路径是否存在;

 7). 表单提交到接收页面,接收页面使用$_FILES来接收上传的文件。

 $_FILES是个多维数组。第一维下标是上传控件的name,二维下标分别为name/type/tmp_name/size/error。分别表明

 文件名、文件类型、上传到临时目录下的临时文件名、文件大小、是否有错误。

 若是是批量上传,那么二维下标就是数组,而并不是是字符串。

 8). 文件上传后是被放置在服务器端临时路径下,须要使用move_uploaded_file ()函数,才能够将上传后的

 文件保存到指定目录。

 9). 为了不上传文件重名,能够经过上传的文件名获取到文件后缀,而后使用时间戳+文件后缀的方式为文件从新命名。

116.  使用GD2库建立图像的步骤?

 1). 建立一个画布:

  imagecreate(); 

 2). 设置画布背景颜色,使用RGB设置颜色:

  imagecolorallocate();

 3). 设置文字颜色:

  imagecolorallocate();

 4). 在画布上书写文字:

  imagestring();

 5).  以 JPEG 格式将图像输出到浏览器或文件:【根据图片格式不一样,函数还能够是imagepng()、imagegif()等】

  imagejpeg();

 6). 清除图像资源:

  imagedestroy();

 

117.   GD2库生成缩略图的步骤是什么?

 1). 读取但愿生成缩略图的源图像,建立图像对象:【根据图片格式不一样,函数也相应不一样】

  $src_image = imagecreatefromjpeg();

 2). 获取原图像的宽度和高度$srcW,$srcH,根据缩放比例计算出新图像的宽度和高度$dstW、$dstH:

 3). 建立一个真色彩的图像对象,宽度和高度设置成刚才计算出的宽度和高度:

  $dst_image = imagecreatetruecolor($dstW,$dstH); 

 4). 拷贝图像并调整大小:

  imagecopyresized();

 5). 将图像输出:【根据图片格式不一样,函数也相应不一样】

  imagejpeg();

 6). 清除图像资源(将源图像资源和目标图像资源都清除)

  imagedestroy();

 

118.   GD2库给图片增长水印如何作?

 1. 添加简单的文本水印:

  利用imagestring()函数就能够在图片上写文本水印。

 2. 增长一个图形水印:

  1). 读取但愿增长水印的源图片,建立图像对象:【根据图片格式不一样,函数也相应不一样】

   $image = imagecreatefromjpeg();

  2). 建立一个水印图片的图像对象:

   $watermark = imagecreatefrompng();

  3). 拷贝并合并图像:

   imagecopymerge();

  4). 将图像输出:【根据图片格式不一样,函数也相应不一样】

   imagejpeg();

  5). 清除图像资源(将源图像资源和水印图像资源都清除)

   imagedestroy();

 

119.  什么是事务?什么是回滚?事务的做用是什么?

 事务就是组合起来的几个独立的sql操做。若是其中一项失败,那么就让这几个组合起来的sql操做都

 回退到未执行状态。这就是事务的回滚。

 mysql中MyISAM存储引擎的表不支持事务,只有InnoDB 存储引擎的表才支持事务,为了让事务正常执行,

 就须要让参与事务的全部数据表都设置成innoDB类型。

 事务被包装在了 BEGIN 和 COMMIT 语句之间。在没有使用 COMMIT 语句的状况下,对数据库的操做不是永久的,

 一旦运行了 ROLLBACK,就会被回退。只有执行了COMMIT,数据表中的信息才被改动。

 事务的目的就是为了保证数据的完整性。

 

120.  模拟SESSION机制实现数据库存放会话数据有什么做用?【重点】

   若是使用默认的SESSION机制,你们都知道默认的SESSION_ID是存放在COOKIE中,用户的身份是靠SESSION_ID来识别的,

 而COOKIE文件是存放在用户浏览器的客户端,这样就会带来一个问题,当用户在办公室选择一些商品到购物车,

 在准备下订单付款的时候,用户选择了支付宝在线的支付方式,恰巧办公室的电脑上面没有安装支付宝的数字证书,

 而在用户家里的电脑安装过数字证书,因此呢,用户就须要回家去支付。可是回家登陆商城以后,

 发现购物车中精心挑选的商品都不存在了。这是为何呢?问题就在家里电脑上的并无存放SESSION_ID的cookie文件,

 于是就没法正确的读取服务器上对应session文件中的数据,因此没法将原来的选择的商品息读取过来。

 这样的购物车功能给用户的用户体验式很是糟糕的,因此咱们就须要采起模拟SESSION机制使用数据库来存放会话数据。

121. 什么是无限极分类?

 要实现无限极分类,数据库建表是关键。

 表结构中至少须要三个字段,若是想避免递归循环,那么须要四个字段。

 1. id ,当前数据的惟一标识;

 2. typename ,类型名称;

 3. parentid , 当前类型的上一层父类型的id;

 4. path , 其中存储当前类型的id和它全部父级类型的id。

 这些id之间采用“-”隔开。

 5. 当经过如下sql语句就能够实现,相同顶级类下的信息都在一块儿集中显示。

 select * from 表名 where 条件 order by path;

 

122.    分页原理是什么?

 数据分页须要如下几个条件:

 1. 参与分页的总条数 【$msg_count】 ,该值经过数据库查询能够获取到;

 2. 每页显示的条数【$pagesize】 ,这个数值由本身定义;

 3. 当前页的页码数 【$page】,该数值经过地址栏传递和接收;

 4. 能够经过以上资料计算出总页数 【$pagecount】 ,此处须要借助ceil();

  【$pagecount = ceil($msg_count/$pagesize);】

 5. 数据库查询借助sql语句中的【limit】来实现数据的变化:

  例如:

  select * from 表名 where 条件 limit $startnum , $pagesize;

  而$startnum = ($page-1)*$pagesize;

 

12三、   如何在smarty模板语言中使用php代码?

 借助于两个smarty内建函数。

 1. inluce_php 函数用于在模板中包含 php 脚本。例如:

 {include_php file="test.php"}

 2. php 标签容许在模板中直接嵌入 php 脚本。例如:

 {php}

  echo "这个是php内建函数的做用";

 {/php}

 

12四、   请列出至少五个smarty中的变量调节符并说明功能?

 default  例如:{$arr|default:’xxxx’} ,默认变量调节器,当变量为空时显示给定的默认值;

 truncate   例如:{$articleTitle|truncate:10} , 切割字符串长度为指定的长度;

 count_characters   例如:{$articleTitle|count_characters} ,获取字符串长度;

 strip_tags   例如:  {$articleTitle|strip_tags} ,去除字符串中的全部html标签;

 date_format  例如:{$smarty.now|date_format(‘’)} ,格式化时间戳。

 

12五、   写程序实现以下功能:

 a.如何判断一个字符串中是否存在一个字符?

 echo strstr('abcdefgcd'  , 'cd');

 echo strpos('ab0defgcd'  , 'cd');

 b.如何判断一个字符串中一个字符出现的次数?

 echo substr_count('abcdefgcd'  , 'cd');

 c.如何去掉一个字符串的最后一个字符

 echo substr('abcdefgcd'  , 0 ,  -1);

12六、 如何使用smarty的缓存、步骤?什么叫单模板多缓存?

 若是给整个网站开启缓存,那么$smarty->caching=1,此时缓存的时间为smarty.class.php中默认的时间,也就是3600秒。

 若是对每个页面独立设置缓存,那么$smarty->caching=2 ,缓存时间就会跟display的参数模板页相挂钩,也就是能够实现对每一个模板页设置不一样的缓存时间。

 用法例如:

 if(!$smarty->is_cached('index.html')) {

  //此处能够执行数据库操做

  $smarty->cache_lifetime = 3600*6;

 }

 $smarty->display('index.html');

 

 对于例如新闻单条这样的页面,新闻的模板都是一个,若是开启缓存,那么全部的新闻单页的缓存都是一个,根本不会随着id的变化而变换内容。因此为了区分不一样的页面缓存,须要使用单模板多缓存技术。具体作法是以id做为display的第二个参数来实现。此外对于具备分页的列表页,也必须在display中使用第二个参数,可使用新闻类型id和当前页面合并成第二个参数。

 

12七、   写一个递归函数完成如下功能:向函数中传一个多维数组,对数组中全部的值作判断,若是值是’number’则设置该值为0?(提示:该题考的是递归的应用,由于传入的数组不肯定是多少维的,因此须要递归判断)

function recursive_array($arr) {
  if(is_array($arr)) {
   foreach($arr as $key=>$value) {
    if(is_array($value)) {
     $arr[$key] = recursive_array($value);
    } else {
     if($value=='number') {
      $arr[$key] = '0';     }
    }
   }
  }
  return $arr;
 } 

 

12八、   使用jquery写一个全选的例子?

//全选与取消全选
 function selectAll(flag) {
  for(var i=0; i<$("#fonds input").size(); i++) {
   $("#fonds input").get(i).checked=flag;
  }
 }
 //判断复选框已经被勾选了多少个?
 function checkFonds() {
  var count=0;
  for(var i=0; i<$("#fonds input").size(); i++) {
   if($("#fonds input").get(i).checked==true) {
    count++;
   }
  }
  alert(count);
 }
 //利用后代选择器和get()来获取指定的控件
 $(“div a”).get(2)

 

 

 

12九、 请说明smarty中fetch方法的功能?

 Fetch方法能够获取到页面全部的内容,而且赋值到一个变量中。

 若是第四个参数为true,则等同于display,直接输出到浏览器中。

 若是第四个参数为false,则不输出。

 Display方法就是第四个参数为true的fetch方法。

 Display = Fetch() + echo() 

 

130、   写出关于文件上传的相关函数?  

 strrchr($filename , '.');
 explode('.' , $filename);
 end($arr);
 strrpos($filename , '.');
 substr($filename , $pos+1);
 pathinfo($filename , PATHINFO_EXTENSION);
 date(‘YmdHis’)
 time()
 rand();
 mt_rand()
 move_uploaded_file()

 

 

 

13一、   如何将SESSION存放在数据库中,能够结合数据表设计说明.

 默认状况下php.ini中session.save_handler = files,也就是session是以文件形式存储的。

 若是想更改成数据库或其它存储方式,那么须要更改设置,让 session.save_handler = user。

 除了在php.ini中配置外,还能够在PHP页面中单独配置,用

 ini_set ('session.save_handler, 'user')来设置session的存储方式,设置为用户自定义存储方式。

 设置好存储方式后,须要使用session_set_save_handler()函数。

 该函数是设置用户级别的session保存过程的函数。该函数有6个参数,这6个参数实际上是6个自定义函数的名称,分别表明对session的开启,关闭,读,写 ,销毁,gc(垃圾回收)。

 示例代码以下:

 function open () { }

 function close() { }

 function read () { }

 function write () {}

 function destroy () {}

 function gc () {}

 session_set_save_handler ("open", "close", "read", "write", "destroy",  "gc");

 session_start();

 如今你就能够象往常同样地使用session了。

 数据库结构以下:

 Session_id , session_value ,expire_time , 分别存储sessionid的id和值以及失效时间。

 

13二、  经常使用的正则表达式写法:

 中文:/^[\u4E00-\u9FA5]+$/

 手机号码:/^(86)?0?1\d{10}$/

 EMAIL:

 /^[\w-]+[\w-.]?@[\w-]+\.{1}[A-Za-z]{2,5}$/

 密码(安全级别中):

 /^(\d+[A-Za-z]\w*|[A-Za-z]+\d\w*)$/

 密码(安全级别高):

 /^(\d+[a-zA-Z~!@#$%^&(){}][\w~!@#$%^&(){}]*|[a-zA-Z~!@#$%^&(){}]+\d[\w~!@#$%^&(){}]*)$/

相关文章
相关标签/搜索