2017面试遇到的一些面试题
分享一些今年所遇到的面试题。
1、写一个函数,尽可能高效的,从一个标准url里取出文件的扩展名例如: http://www.test.com.cn/abc/de/fg.PHP?id=1需要取出php或.php
1 第一种写法: 2 function getExt1($url){ 3 $arr = parse_url($url); 4 $file = basename($arr['path']); 5 $ext = explode('.',$file); 6 return $ext[1]; 7 } 8 第二种写法: 9 function getExt2($url){ 10 $b=parse_url($url); 11 echo substr($b['path'],strpos($b['path'],'.')); 12 } 13 第三种写法: 14 function getExt3($url){ 15 $b=parse_url($url); 16 $ext = explode('.',$b['path']); 17 echo end($ext); 18 } 19 20 $a="http://www.test.com.cn/abc/de/fg.php?id=1"; 21 echo getExt($a);
2、使用五种以上方式获取一个文件的扩展名
1 function get_ext1($file_name){ 2 returnsubstr(strrchr($file_name, '.'),1); 3 } 4 function get_ext2($file_name){ 5 returnsubstr(substr($file_name, strrpos($file_name, '.')),1); 6 } 7 function get_ext3($file_name){ 8 $a=explode('.', $file_name); 9 returnarray_pop($a); 10 } 11 function get_ext4($file_name){ 12 returnpathinfo($file_name, PATHINFO_EXTENSION); 13 } 14 function get_ext5($file_name){ 15 returnstrrev(substr(strrev($file_name), 0, strpos(strrev($file_name), '.'))); 16 }
3、HTTP中POST、GET、PUT、DELETE方式的区别
HTTP定义了与服务器交互的不同的方法,最基本的是POST、GET、PUT、DELETE,与其比不可少的URL的全称是资源描述符,我们可以这样理解:url描述了一个网络上资源,而post、get、put、delete就是对这个资源进行增、删、改、查的操作!
3.1表单中get和post提交方式的区别
- get是把参数数据队列加到提交表单的action属性所指的url中,值和表单内各个字段一一对应,从url中可以看到;post是通过HTTPPOST机制,将表单内各个字段与其内容防止在HTML的head中一起传送到action属性所指的url地址,用户看不到这个过程
- 对于get方式,服务器端用Request.QueryString获取变量的值,对于post方式,服务器端用Request.Form获取提交的数据
- get传送的数据量较小,post传送的数据量较大,一般被默认不受限制,但在理论上,IIS4中最大量为80kb,IIS5中为1000k,get安全性非常低,post安全性较高
- 3.2
- GET请求会向数据库发索取数据的请求,从而来获取信息,该请求就像数据库的select操作一样,只是用来查询一下数据,不会修改、增加数据,不会影响资源的内容,即该请求不会产生副作用。无论进行多少次操作,结果都是一样的。
- 与GET不同的是,PUT请求是向服务器端发送数据的,从而改变信息,该请求就像数据库的update操作一样,用来修改数据的内容,但是不会增加数据的种类等,也就是说无论进行多少次PUT操作,其结果并没有不同。
- POST请求同PUT请求类似,都是向服务器端发送数据的,但是该请求会改变数据的种类等资源,就像数据库的insert操作一样,会创建新的内容。几乎目前所有的提交操作都是用POST请求的。
- DELETE请求顾名思义,就是用来删除某一个资源的,该请求就像数据库的delete操作。
4、优化数据库的方法
1、选取适当的字段属性。
2、使用连接查询代替子查询。
3、使用联合查询代替手动创建的临时表
4、使用事务。
5、锁定表。
6、使用外键。
7、使用索引
8、优化查询语句
详情可以看我之前发表的《优化数据库的八种方法》
5、对于大流量网站,采用什么方法来解决访问量的问题
1、首先,确认服务器硬件是否足够支持当前的流量
普通的P4服务器一般最多能支持每天10万独立IP,如果访问量比这个还要大,那么必须首先配置一台更高性能的专用服务器才能解决问题,否则怎么优化都不可能彻底解决性能问题。
2、数据库的读写分离,优化表结构;
读写分离:频繁请求数据库时会造成堵塞,增加数据的读取与写入时间。读写分离可使不同的数据库分担不同的任务,减少每个数据库的连接数,加快数据读取速度;
3、缓存技术的合理运用,减少数据库的频繁操作;
优化数据库访问前台实现完全的静态化当然最好,可以完全不用访问数据库,不过对于频繁更新的网站, 静态化往往不能满足某些功能。
缓存技术就是另一个解决方案,就是将动态数据存储到缓存文件中,动态网页直接调用 这些文件,而不必再访问数据库,WordPress和Z-Blog都大量使用这种缓存技术 如果确实无法避免对数据库的访问,那么可以尝试优化数据库的查询SQL.避免使用 Select * from这样的语句,每次查询只返回自己需要的结果,避免短时间内的大,尽量做到"所查即所得" ,遵循以小表为主,附表为辅,查询条件先索引,先小后大的原则,提高查询效率.量SQL查询。
4、程序功能规则,减少外部盗链;
外部网站的图片或者文件盗链往往会带来大量的负载压力,因此应该严格限制外部对于自身的图片或者文件盗链,好在目前可以简单地通过refer来控制盗链,Apache自 己就可以通过配置来禁止盗链,IIS也有一些第三方的ISAPI可以实现同样的功能。当然,伪造refer也可以通过代码来实现盗链,不过目前蓄意伪造refer盗链的还不多, 可以先不去考虑,或者使用非技术手段来解决,比如在图片上增加水印。
5、控制大文件的上传与下载;
大文件的下载会占用很大的流量,并且对于非SCSI硬盘来说,大量文件下载会消耗 CPU,使得网站响应能力下降。因此,尽量不要提供超过2M的大文件下载,如果需要提供,建议将大文件放在另外一台服务器上。
6、使用不同主机分流主要流量
将文件放在不同的主机上,提供不同的镜像供用户下载。比如如果觉得RSS文件占用流量大,那么使用FeedBurner或者FeedSky等服务将RSS输出放在其他主机上,这样别人访问的流量压力就大多集中在FeedBurner的主机上,RSS就不占用太多资源了
7、使用流量分析统计软件
在网站上安装一个流量分析统计软件,可以即时知道哪些地方耗费了大量流量,哪些页面需要再进行优化,因此,解决流量问题还需要进行精确的统计分析才可以。
6、数据库中的事务是什么?
事务(transaction)是作为一个单元的一组有序的数据库操作。如果组中的所有操作都成功,则认为事务成功,即使只有一个操作失败,事务也不成功。如果所有操作完成,事务则提交,其修改将作用于所有其他数据库进程。如果一个操作失败,则事务将回滚,该事务所有操作的影响都将取消。ACID 四大特性,原子性、隔离性、一致性、持久性。
7、了解XSS攻击吗?如何防止?
XSS跨站脚本攻击指攻击者在网页中嵌入客户端脚本(例如JavaScript),当用户浏览此网页时,脚本就会在用户的浏览器上执行,从而达到攻击者的目的,比如获取用户的Cookie,导航到恶意网站,携带木马等。
如何防止XSS跨站脚本攻击:
原则:不相信用户输入的数据
- 将重要的cookie标记为http only,这样的话Javascript 中的document.cookie语句就不能获取到cookie了
- 只允许用户输入我们期望的数据。例如:年龄的textbox中,只允许用户输入数字,而数字之外的字符都过滤掉
- 对数据进行Html Encode 处理。< 转化为 <、> 转化为 >、& 转化为 &、' 转化为 '、" 转化为 "、空格 转化为
- 过滤或移除特殊的Html标签。例如:<script>、<iframe>、< for <、> for >、" for
5. 过滤JavaScript 事件的标签。例如 “onclick=”、”onfocus”等等
很多浏览器都加入了安全机制来过滤XSS
注意:攻击代码不一定在<script></script>中
8、SQL注入漏洞产生的原因?如何防止?
所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。
如何防止SQL注入:
- 永远不要信任用户的输入。对用户的输入进行校验,可以通过正则表达式,或限制长度;对单引号和双”-“进行转换等。
- 永远不要使用动态拼装sql,可以使用参数化的sql或者直接使用存储过程进行数据查询存取
- 永远不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接
- 不要把机密信息直接存放,加密或者hash掉密码和敏感的信息
应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装
9、对于关系型数据库而言,索引是相当重要的概念,请回答有关索引的几个问题:
a)、索引的目的是什么?
- 快速访问数据表中的特定信息,提高检索速度
- 创建唯一性索引,保证数据库表中每一行数据的唯一性。
- 加速表和表之间的连接
- 使用分组和排序子句进行数据检索时,可以显著减少查询中分组和排序的时间
b)、索引对数据库系统的负面影响是什么?
负面影响:
创建索引和维护索引需要耗费时间,这个时间随着数据量的增加而增加;索引需要占用物理空间,不光是表需要占用数据空间,每个索引也需要占用物理空间;当对表进行增、删、改、的时候索引也要动态维护,这样就降低了数据的维护速度。
c)、为数据表建立索引的原则有哪些?
- 在最频繁使用的、用以缩小查询范围的字段上建立索引。
- 在频繁使用的、需要排序的字段上建立索引
d)、什么情况下不宜建立索引?
- 对于查询中很少涉及的列或者重复值比较多的列,不宜建立索引。
- 对于一些特殊的数据类型,不宜建立索引,比如文本字段(text)等。
e)索引的副作用
(1)索引是有大量数据的时候才建立的,没有大量数据反而会浪费时间,因为索引是使用二叉树建立.
(2)当一个系统查询比较频繁,而新建,修改等操作比较少时,可以创建索引,这样查询的速度会比以前快很多,同时也带来弊端,就是新建或修改等操作时,比没有索引或没有建立覆盖索引时的要慢。
(3)索引并不是越多越好,太多索引会占用很多的索引表空间,甚至比存储一条记录更多。
对于需要频繁新增记录的表,最好不要创建索引,没有索引的表,执行insert、append都很快,有了索引以后,会多一个维护索引的操作,一些大表可能导致insert 速度非常慢。
10、简述在MySQL数据库中MyISAM和InnoDB的区别
区别于其他数据库的最重要的特点就是其插件式的表存储引擎。切记:存储引擎是基于表的,而不是数据库。
MyISAM是MySQL的默认数据库引擎(5.5版之前),由早期的ISAM(Indexed Sequential Access Method:有索引的顺序访问方法)所改良。虽然性能极佳,但却有一个缺点:不支持事务处理(transaction)。不过,在这几年的发展下,MySQL也导入了InnoDB(另一种数据库引擎),以强化参考完整性与并发违规处理机制,后来就逐渐取代MyISAM。
InnoDB,是MySQL的数据库引擎之一,为MySQL AB发布binary的标准之一。InnoDB由Innobase Oy公司所开发,2006年五月时由甲骨文公司并购。与传统的ISAM与MyISAM相比,InnoDB的最大特色就是支持了ACID兼容的事务(Transaction)功能,类似于PostgreSQL。目前InnoDB采用双轨制授权,一是GPL授权,另一是专有软件授权。
MyISAM与InnoDB的区别是什么?
1、存储结构
MyISAM:每个MyISAM在磁盘上存储成三个文件。第一个文件的名字以表的名字开始,扩展名指出文件类型。.frm文件存储表定义。数据文件的扩展名为.MYD (MYData)。索引文件的扩展名是.MYI (MYIndex)。
InnoDB:所有的表都保存在同一个数据文件中(也可能是多个文件,或者是独立的表空间文件),InnoDB表的大小只受限于操作系统文件的大小,一般为2GB。
2、存储空间
MyISAM:可被压缩,存储空间较小。支持三种不同的存储格式:静态表(默认,但是注意数据末尾不能有空格,会被去掉)、动态表、压缩表。
InnoDB:需要更多的内存和存储,它会在主内存中建立其专用的缓冲池用于高速缓冲数据和索引。
3、可移植性、备份及恢复
MyISAM:数据是以文件的形式存储,所以在跨平台的数据转移中会很方便。在备份和恢复时可单独针对某个表进行操作。
InnoDB:免费的方案可以是拷贝数据文件、备份 binlog,或者用 mysqldump,在数据量达到几十G的时候就相对痛苦了。
4、事务支持
MyISAM:强调的是性能,每次查询具有原子性,其执行数度比InnoDB类型更快,但是不提供事务支持。
InnoDB:提供事务支持事务,外部键等高级数据库功能。 具有事务(commit)、回滚(rollback)和崩溃修复能力(crash
recovery capabilities)的事务安全(transaction-safe (ACID compliant))型表。
5、 AUTO_INCREMENT
MyISAM:可以和其他字段一起建立联合索引。引擎的自动增长列必须是索引,如果是组合索引,自动增长可以不是第一列,他可以根据前面几列进行排序后递增。
InnoDB:InnoDB中必须包含只有该字段的索引。引擎的自动增长列必须是索引,如果是组合索引也必须是组合索引的第一列。
6、表锁差异
MyISAM:只支持表级锁,用户在操作myisam表时,select,update,delete,insert语句都会给表自动加锁,如果加锁以后的表满足insert并发的情况下,可以在表的尾部插入新的数据。
InnoDB:支持事务和行级锁,是innodb的最大特色。行锁大幅度提高了多用户并发操作的新能。但是InnoDB的行锁,只是在WHERE的主键是有效的,非主键的WHERE都会锁全表的。
7、全文索引
MyISAM:支持 FULLTEXT类型的全文索引
InnoDB:不支持FULLTEXT类型的全文索引,但是innodb可以使用sphinx插件支持全文索引,并且效果更好。
8、表主键
MyISAM:允许没有任何索引和主键的表存在,索引都是保存行的地址。
InnoDB:如果没有设定主键或者非空唯一索引,就会自动生成一个6字节的主键(用户不可见),数据是主索引的一部分,附加索引保存的是主索引的值。
11、解释MySQL外连接、内连接与自连接的区别
先说什么是交叉连接: 交叉连接又叫笛卡尔积,它是指不使用任何条件,直接将一个表的所有记录和另一个表中的所有记录一一匹配。
内连接 则是只有条件的交叉连接,根据某个条件筛选出符合条件的记录,不符合条件的记录不会出现在结果集中,即内连接只连接匹配的行。
外连接 其结果集中不仅包含符合连接条件的行,而且还会包括左表、右表或两个表中的所有数据行,这三种情况依次称之为左外连接,右外连接,和全外连接。
左外连接,也称左连接,左表为主表,左表中的所有记录都会出现在结果集中,对于那些在右表中并没有匹配的记录,仍然要显示,右边对应的那些字段值以NULL来填充。右外连接,也称右连接,右表为主表,右表中的所有记录都会出现在结果集中。左连接和右连接可以互换,mysql目前还不支持全外连接。
12、列举流行的Ajax 框架?说明 Ajax 实现原理是什么及json在 Ajax 中起什么作用?
流行的 Ajax 框架有 jQuery,Prototype,Dojo,MooTools。
Ajax 的工作原理是一个页面的指定位置可以加载另一个页面所有的输出内容,这样就实现了一个静态页面也能获取到数据库中的返回数据信息了。所以 Ajax 技术实现了一个静态网页在不刷新整个页面的情况下与服务器通信,减少了用户等待时间,同时也从而降低了网络流量,增强了客户体验的友好程度。
在使用 Ajax 时,涉及到数据传输,即将数据从服务器返回到客户端,服务器端和客户端分别使用不同的脚步语言来处理数据,这就需要一种通用的数据格式,XML 和json就是最常用的两种,而json比 XML 更简单。
13、谈谈你对MVC的认识
MVC是Model—View—Controler的简称。即模型—视图—控制器。MVC是一种设计模式,它强制性的把应用程序的输入、处理和输出分开。
MVC中的模型、视图、控制器它们分别担负着不同的任务。
视图: 视图是用户看到并与之交互的界面。视图向用户显示相关的数据,并接受用 户的输入。视图不进行任何业务逻辑处理。
模型: 模型表示业务数据和业务处理。一个模型能为多个视图提供数据。这提高了应用程序的重用性。
控制器: 当用户单击Web页面中的提交按钮时,控制器接受请求并调用相应的模型去处理请求。然后根据处理的结果调用相应的视图来显示处理的结果。
MVC的处理过程:首先控制器接受用户的请求,调用相应的模型来进行业务处理,并返回数据给控制器。控制器调用相应的视图来显示处理的结果。并通过视图呈现给用户。
一、MVC的优点
1、可以为一个模型在运行时同时建立和使用多个视图。变化-传播机制可以确保所有相关的视图及时得到模型数据变化,从而使所有关联的视图和控制器做到行为同步。
2、视图与控制器的可接插性,允许更换视图和控制器对象,而且可以根据需求动态的打开或关闭、甚至在运行期间进行对象替换。
3、模型的可移植性。因为模型是独立于视图的,所以可以把一个模型独立地移植到新的平台工作。需要做的只是在新平台上对视图和控制器进行新的修改。
4、潜在的框架结构。可以基于此模型建立应用程序框架,不仅仅是用在设计界面的设计中。
MVC的不足
MVC的不足体现在以下几个方面:
(1)增加了系统结构和实现的复杂性。对于简单的界面,严格遵循MVC,使模型、视图与控制器分离,会增加结构的复杂性,并可能产生过多的更新操作,降低运行效率。
(2)视图与控制器间的过于紧密的连接。视图与控制器是相互分离,但确实联系紧密的部件,视图没有控制器的存在,其应用是很有限的,反之亦然,这样就妨碍了他们的独立重用。
(3)视图对模型数据的低效率访问。依据模型操作接口的不同,视图可能需要多次调用才能获得足够的显示数据。对未变化数据的不必要的频繁访问,也将损害操作性能。
(4) 目前,一般高级的界面工具或构造器不支持MVC架构。改造这些工具以适应MVC需要和建立分离的部件的代价是很高的,从而造成使用MVC的困难。
14、用过缓存技术吗?说说对Memcache的理解
概念
Memcache是一个高性能的分布式的内存对象缓存系统。是个开源的软件,可以通过简单的方法,管理数据库在内存中的存取。简单的说就是缓存数据库查询结果(数据)到内存中,然后从内存中读取,从而大大提高读取速度,减少数据库访问参数,以提高动态web应用的速度,提高可扩展性
怎么理解Memcache?
Memcache 是只有一张表的数据库,这张表有两个字段分别是主键key 和value,value就是我们要保存的数据,key就是这个数据的id,用来保证我们查找时候的唯一性
Memcache 使用场景
非持久化存储:对数据存储要求不高,服务停止后,里面的数据就会丢失
分布式存储:单台数据的内存容量有限,可以在多个电脑上安装memcache 服务
Key/Value存储:需要缓存的对象或数据以“key/value”对的形式保存在服务器端
Memcache 在WEB中的应用
MemCache缓存系统最主要的就是为了提高动态网页应用,分担数据库检索的压力。对于网站流量比较大的,可以使用memcache缓解数据库的压力,主要的焦点集中在以下两个方面:
1. 使用MemCache作为中间缓存层减少数据库的压力。
2. MemCache分布式的应用
连接memcache
实例化memcache类
$memcache=new memcache;
连接memcache服务器
格式:$memcache->connect('127.0.0.1','11211');
参数1:主机(必写);
参数2:Memcached服务的端口号,默认11211(可选)
关闭服务器连接
$memcache->close()
15、Memcache与Redis的区别
NoSQL因其优势,目前是大行其道,而Memcached和Redis更是NoSQL中的明星。二者同为Key-Value型,且同样优秀,少不了一番比较。以下是一些简单的比较,不涉及底层基础等。
1.存储最大值
Memcached的key最大为250字节,value最大为1MB;Redis的key和value最大都是512MB。
2.数据类型
Memcached存储的类型仅支持key-value类型;Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。
3.数据备份
Memcached不支持数据备份;Redis支持master-slave模式的数据备份,教程在此:Redis数据备份与恢复。
4.灾难恢复
Memcached不可恢复,即restart之后数据也会清空;Redis可以恢复。
5.性能比较
放上引用的一段话,链接地址会在下文给出:
由于Redis只使用单核,而Memcached可以使用多核,所以在比较上,平均每一个核上 Redis在存储小数据时Memcached性能更高。而在100k以上的数据中,Memcached性能要高于Redis,虽然Redis最近也在存储大数据的性能上进行优化,但是比起Memcached,还是稍有逊色。说了这么多,结论是,无论你使用哪一个,每秒处理请求的次数都不会成为瓶颈。
6.持久化
这一点可以说是二者之间本质上的区别,同时也是上一点灾难恢复的基础。Memcached不可以持久化,所有的数据都在内存中。Redis有两种持久化的方式:RDB(快照)方式和AOF(追加)方式,教程在此:Redi持久化。
7.使用场景
私以为,Memcached足以应对一般网站的缓存需求,此博客既是使用Memcached。如果有更多的需求,如持久化、可靠性或者更多数据类型,应当考虑Redis。
16、Apache与Nginx的区别
nginx 相对 apache 的优点:
轻量级,同样起web 服务,比apache 占用更少的内存及资源
抗并发,nginx 处理请求是异步非阻塞的,而apache 则是阻塞型的,在高并发下nginx 能保持低资源低消耗高性能
高度模块化的设计,编写模块相对简单
社区活跃,各种高性能模块出品迅速啊
apache 相对nginx 的优点:
rewrite ,比nginx 的rewrite 强大
模块超多,基本想到的都可以找到
少bug ,nginx 的bug 相对较多
超稳定
存在就是理由,一般来说,需要性能的web 服务,用nginx 。如果不需要性能只求稳定,那就apache 吧。后者的各种功能模块实现得比前者,例如ssl 的模块就比前者好,可配置项多。
这里要注意一点,epoll(freebsd 上是 kqueue )网络IO 模型是nginx 处理性能高的根本理由,但并不是所有的情况下都是epoll 大获全胜的,如果本身提供静态服务的就只有寥寥几个文件,apache 的select 模型或许比epoll 更高性能。当然,这只是根据网络IO 模型的原理作的一个假设,真正的应用还是需要实测了再说的。
1、作为 Web 服务器:相比 Apache,Nginx 使用更少的资源,支持更多的并发连接,体现更高的效率,这点使 Nginx 尤其受到虚拟主机提供商的欢迎。在高连接并发的情况下,Nginx是Apache服务器不错的替代品: Nginx在美国是做虚拟主机生意的老板们经常选择的软件平台之一. 能够支持高达 50000 个并发连接数的响应, 感谢Nginx为我们选择了 epoll and kqueue 作为开发模型.
Nginx作为负载均衡服务器: Nginx 既可以在内部直接支持 Rails 和 PHP 程序对外进行服务, 也可以支持作为 HTTP代理 服务器对外进行服务. Nginx采用C进行编写, 不论是系统资源开销还是CPU使用效率都比 Perlbal 要好很多.
2、Nginx 配置简洁, Apache 复杂 ,Nginx 启动特别容易, 并且几乎可以做到7*24不间断运行,即使运行数个月也不需要重新启动. 你还能够不间断服务的情况下进行软件版本的升级 . Nginx 静态处理性能比 Apache 高 3倍以上 ,Apache 对 PHP 支持比较简单,Nginx 需要配合其他后端来使用 ,Apache 的组件比 Nginx 多.
3、最核心的区别在于apache是同步多进程模型,一个连接对应一个进程;nginx是异步的,多个连接(万级别)可以对应一个进程 .
4、nginx的优势是处理静态请求,cpu内存使用率低,apache适合处理动态请求,所以现在一般前端用nginx作为反向代理抗住压力,apache作为后端处理动态请求
17、用PHP写出一个安全的用户登录系统需要注意哪些方面
1、密码要使用MD5(密码+字符串)进行加密
2、登录表单的名称不要跟数据库字段一样,以免暴露表字段.
3、要使用验证码验证登陆,以防止暴力破解
4、登陆后台处理代码数据库部分可以使用预处理,做好过滤,防止sql注入
18、Composer是什么,怎么应用?
Composer 是 PHP5.3以上的一个依赖管理工具。它允许你申明项目所依赖的代码库,它会在你的项目中为你安装他们。Composer 不是一个包管理器。是的,它涉及 "packages" 和 "libraries",但它在每个项目的基础上进行管理,在你项目的某个目录中(例如 vendor)进行安装。默认情况下它不会在全局安装任何东西。因此,这仅仅是一个依赖管理。
19、类的多继承怎么实现?
一:traits实现多继承:
PHP 5.4.0 开始,PHP 实现了代码复用的一个方法,称为 traits。
Traits 是PHP中一种类似多继承的方法。Trait 为了减少单继承语言的限制,使开发人员能够自由地在不同层次结构内独立的类中复用方法集。Traits 和类组合的语义是定义了一种方式来减少复杂性,避免传统多继承和混入类相关的典型问题。
Trait 和一个类相似,但仅仅旨在用细粒度和一致的方式来组合功能。Trait 不能通过它自身来实例化。它为传统继承增加了水平特性的组合;
二:接口实现多继承:
在PHP的接口中,接口可以继承接口。虽然PHP类只能继承一个父类(单继承),但是接口和类不同,接口可以实现多继承,可以继承一个或者多个接口。当然接口的继承也是使用extends关键字,要多个继承的话只要用逗号把继承的接口隔开即可。
需要注意的是当你接口继承其它接口时候,直接继承父接口的静态常量属性和抽象方法,所以类实现接口时必须实现所有相关的抽象方法。
20、include与require的区别
· require是无条件包含,也就是如果一个流程里加入require,无论条件成立与否都会先执行require,当文件不存在或者无法打开的时候,会提示错误,并且会终止程序执行
· include有返回值,而require没有(可能因为如此require的速度比include快),如果被包含的文件不存在的化,那么会提示一个错误,但是程序会继续执行下去
注意:包含文件不存在或者语法错误的时候require是致命的,而include不是
require_once表示了只包含一次,避免了重复包含
21、说说什么是面向对象?什么是面向过程?面向过程与面向对象的区别
“面向过程”是一种以过程为中心的编程思想。
就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。
“面向对象”(Object Oriented,简称OO)是一种以事物为中心的编程思想。
就是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。
面向过程的优点:流程化使得编程任务明确,在开发之前基本考虑了实现方式和最终结果;效率高,面向过程强调代码的胆小精悍,善于结合数据结构来开发高效率的程序。。流程明确,具体步骤清楚,便于节点分析。缺点是:需要深入的思考,耗费精力,代码重用性低,扩展能力差,维护起来难度比较高,对复杂业务来说,面向对象的模块话难度较高,耦合度也比较高。
面向对象的优点:结构清晰,程序便于模块化,结构化,抽象化,更加符合人类的思维方式;封装性,将事务高度抽象,从而便于流程中的行为分析,也便于操作和自省; 容易扩展,代码重用率高,可继承,可覆盖;实现简单,可有效地减少程序的维护工作量,软件开发效率高。面向对象的缺点:效率低,面向对象在面向过程的基础上高度抽象,从而和代码底层的直接交互非常少机会,从而不适合底层开发和游戏甚至多媒体开发;复杂性,对于事务开发而言,事务本身是面向过程的,过度的封装导致事务本身的复杂性提高。
22、AJAX请求和普通HTTP请求区别
两者本质区别:
AJAX通xmlHttpRequest象请求服务器服务器接受请求返数据实现刷新交互
普通http请求通httpRequest象请求服务器接受请求返数据需要页面刷新
AJAX请求头会多一个x-requested-with参数,值为XMLHttpRequest
String requestType = request.getHeader("X-Requested-With");
23、Thinkphp 5 新特性
1.支持 Composer,PHPunit(中大型项目必备的依赖管理和测试框架)
2.使用同 yii2 一样的类惰性加载(性能暴升)
3.大量参考了 Laravel 风格,还保证了以往
ThinkPHP 简单易学(优雅并且易学)
4.引入了 php5.4 特性 Traits 拓展(多重继承,以前的关联模型,视图模型混合一起用)
5.终于遵循 PSR 规范了!终于遵循 PSR 规范了!终于遵循 PSR 规范了!
符合PSR-4的自动加载规范(专门写给CI党:PSR-4 是命名空间的自动加载规范哦)
6.以前单字母全局函数改成了别名函数(M,D,S,C等,除了易学好用还不会污染全局)
7.兼容 php 7,局部兼容 hhvm
24、HTTP状态中302、403、 500代码含义?
300重定向、403服务器拒绝访问、500服务器内部错误。
25、请问get和post方法有什么区别?
我们再网页上填写的表单信息都可以通过这两个方法将数据传递到服务器上,当我们使用get方法是,所有的信息都会出现在url地址中,并且使用get方法最多只能传递1024个字符,所以如果在传输量小或者安全性不那么重要的情况下可以使用get方法。说到post方法,最多可以传输2mb字节的数据,而且可以根据需要调节。
26、php中获取图像尺寸大小的方法是什么?
getimagesize () 获取图片的尺寸
imagesx () 获取图片的宽度
imagesy () 获取图片的高度
27、如何用php和mysql上传视频?
我们可以在数据库中存放视频的地址,而不需要将真正的视频数据存在数据库中。可以将视频数据存放在服务器的指定文件夹下,上传的默认大小是2mb,但是我们也可以在php.ini文件中修改max_file size选项来改变
28、php中的错误类型有哪些?
php中遇到的错误类型大致有3类。
提示:这都是一些非常正常的信息,而非重大的错误,有些甚至不会展示给用户。比如访问不存在的变量。
警告:这是有点严重的错误,将会把警告信息展示给用户,但不会影响代码的输出,比如包含一些不存在的文件。
错误:这是真正的严重错误,比如访问不存在的php类
29、session机制与cookie机制?session与cookie区别?
30、引用传值和非引用传值的区别,什么时候该用引用传值?什么时候该用非引用传值?
答:按值传递:函数范围内对值的改变在函数外都会被忽略。
按引用传递:函数范围内对值的任何改变在函数外也将反应出这些修改。
按值传递时,php必须复制值,如果操作的是大型的对象和字符串,这将是一个代价很大的操作。按引用传递不需要复制值,因此对性能的提高有好处。
31、写几个魔术方法并说明作用?
__call()当调用不存在的方法时会自动调用的方法
__autoload()在实例化一个尚未被定义的类是会自动调用次方法来加载类文件
__set()当给未定义的变量赋值时会自动调用的方法
__get()当获取未定义变量的值时会自动调用的方法
__construct()构造方法,实例化类时自动调用的方法
__destroy()销毁对象时自动调用的方法
__unset()当对一个未定义变量调用unset()时自动调用的方法
__isset()当对一个未定义变量调用isset()方法时自动调用的方法
__clone()克隆一个对象
__tostring()当输出一个对象时自动调用的方法
32、$_REQUEST、$_POST、$_GET、$_COOKIE、$_SESSION、$_FILE的意思是什么?
答:它们都是PHP预定义变量。
$_REQUEST用来获取post或get方式提交的值
$_POST用来获取post方式提交的值
$_GET用来获取get方式提交的值
$_COOKIE用来获取cookie存储的值
$_SESSION用来获取session存储的值
$_FILE用来获取上传文件表单的值
33、++i和i++哪一个效率高,为什么?
++i效率比i++的效率更高,因为++i少了一个返回i的过程。
34、用过哪些版本控制器?说说SVN与GIT优缺点?
1.SVN优缺点
优点:
1、管理方便,逻辑明确,符合一般人思维习惯。
2、易于管理,集中式服务器更能保证安全性。
3、代码一致性非常高。
4、适合开发人数不多的项目开发。
缺点:
1、服务器压力太大,数据库容量暴增。
2、如果不能连接到服务器上,基本上不可以工作,看上面第二步,如果服务器不能连接上,就不能提交,还原,对比等等。
3、不适合开源开发(开发人数非常非常多,但是Google app engine就是用svn的)。但是一般集中式管理的有非常明确的权限管理机制(例如分支访问限制),可以实现分层管理,从而很好的解决开发人数众多的问题。
2.Git优缺点
优点:
1、适合分布式开发,强调个体。
2、公共服务器压力和数据量都不会太大。
3、速度快、灵活。
4、任意两个开发者之间可以很容易的解决冲突。
5、离线工作。
缺点:
1、学习周期相对而言比较长。
2、不符合常规思维。
3、代码保密性差,一旦开发者把整个库克隆下来就可以完全公开所有代码和版本信息。
35、请问php中echo和print有什么区别?
答:这两个看起来很相似,因为它们都是将一些值打印在屏幕上。但是echo和print的本质区别在于:echo用来输出字符串,显示多个值的时候可以用逗号隔开。只支持基本类型,print不仅可以打印字符串值,而且可以打印函数的返回值。
先到这里了,会持续更的,希望对有所需要的同行有所帮助。