PHP部分面试题

1. 什么是MVC?

mvc是一种开发模式,M(model)模型,V(view)视图,C(controller)控制器。客户端请求控制器,控制器从模型种获取数据,再通过视图展现出来。

2. 什么是面向对象OOP?

面向对象编程是一种计算机编程架构,OOP的一条基本原则是:计算机程序是由单个能够起到子程序作用的单元或对象组合而成。

三大特点:

<1>封装性:也称为信息隐藏,就是将一个类的使用和实现分开,只保留部分接口和方法与外部联系。或者说,只公开了一些供开发人员使用的方法。因此,开发人员只需要关注这个类如何使用,而不用去关心其具体实现过程。这样就能实现MVC分工合作,也能有效避免程序间的相互依赖,实现代码间的松耦合。

<2>继承性:就是子类自动继承父类的属性和方法。并可以添加新的属性和方法或者对部分属性和方法进行重写。继承增加了代码的可重用性,PHP只支持单继承,也就是说一个子类只能继承一个父类。

<3>多态性:子类继承了来自父类的属性和方法,并对其中的属性和方法进行了重写。于是多个子类中虽然都具有同一个方法,但是这些子类实例化的对象调用这些相同的方法后却可以获得完全不同的结果。这种技术就是多态性,多态性增加了软件的灵活度。

3. 面向过程和面向对象的区别以及优缺点

<1>思想上的区别:面向过程是一种以过程为中心的的编程思想,面向过程强调流程化、线性化、步骤化的思考方式。面向对象是软件开发方法和编程思想,首先强调整体性和差异性,即可以将任何一个事物看成是一个有机统一的整体来研究,然后通过派生的方法实现差异性来降低高耦合的可能。其次强调行为的多样性和多态性,然后强调高度可扩展性,由此也说明了面向对象的四个基本特征:抽象、封装、继承、多态。

<2>面向过程的优缺点:优点:流程明确、效率高、短小精悍;缺点:重用性低、扩展能力差、维护难度高。

<3>面向对象的优缺点:优点:易维护、质量高、易扩展、实现简单;缺点:高度抽象、复杂度较高。

4. 数据库可以从哪几个角度进行优化?

<1>从结构层:服务器采用负载均衡服务器,数据库服务器采用主从复制、读写分离。

<2>从储存层:采用合适的储存引擎,采用三范式。

<3>从设计层:采用分区分表,建索引,表的字段采用合适的字段属性,适当的采用逆范式,开启mysql缓存。

<4>从sql语句:结果一样的情况下,采用效率高,速度快,节省资源的sql语句。

5. cookie与session

<1>cookie:cookie是http协议下,服务器或脚本可以维护客户工作站上信息的一种方式,cookie是由web服务器保存在用户浏览器上的小文本文件,它可以包含有关用户的信息。无论何时用户连接到服务器,web站点都可以访问cookie信息。

<2>session:session是以文本形式储存在服务器端的会话,是服务器给客户端的一个编号。

<3>两者区别:cookie数据存放在客户的浏览器上,session数据放在服务器上。cookie不是很安全,可以进行cookie伪装。session存放在服务器上,当访问增多时,会比较占用服务器性能。单个cookie保存的数据不能超过4K。

6. 什么是单品、商品、SPU、SKU?

<1>单品:iphone是一个单品,但是在淘宝上当很多商家同时出售这个单品的时候,iphone就是一个商品了。

<2>商品:商品特指与商家有关的商品,每个商品有一个商家编码,每个商品下面有多个颜色,款式,可以有多个SKU。

<3>SPU:Standard Product Unit(标准化产品单元),SPU是商品信息聚合的最小单位,是一组可复用、易检索的标准化信息的集合,该集合描述了一个产品的特性。通俗点讲,属性值、特性相同的商品就可以称为一个SPU。例如,iphone8就是一个SPU,小米8也是一个SPU,这个与商家无关,与颜色、款式、套餐也无关。

<4>SKU:Stock Keeping Unit(库存量单位),SKU即库存进出计量的单位, 可以是以件、盒、托盘等为单位。在服装、鞋类商品中使用最多最普遍。 例如纺织品中一个SKU通常表示:规格、颜色、款式。

SKU是物理上不可分割的最小存货单元。在使用时要根据不同业态,不同管理模式来处理。比如一香烟是50条,一条里有十盒,一盒中有20支,这些单位就要根据不同的需要来设定SKU。

7. 什么是单点登录SSO?

单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一。SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。

单点登录的三种实现方式:以Cookie作为凭证媒介,通过JSONP实现,通过页面重定向的方式。

一般说来,大型应用会把授权的逻辑与用户信息的相关逻辑独立成一个应用,称为用户中心。用户中心不处理业务逻辑,只是处理用户信息的管理以及授权给第三方应用。第三方应用需要登录的时候,则把用户的登录请求转发给用户中心进行处理,用户处理完毕返回凭证,第三方应用验证凭证,通过后就登录用户。

8. 怎么实现第三方登录?

第三方登陆主要是基于author协议来实现,实现流程:

<1>首先我们需要以开发者的身份向第三方登陆平台申请接入应用,申请成功后,我们会获得一个appID和一个secrectID。

<2>当我们的网站需接入第三方登陆时,会引导用户跳转到第三方的登陆授权页面,此时把之前申请的appID和secrectID带给登陆授权页面。

<3>用户登陆成功后即得到授权,第三方会返回一个临时的code给我们的网站。

<4>我们的网站接受到code后,再次向我们的第三方发起请求,并携带接收的code,从第三方获取access_token。

<5>第三方处理请求后,会返回一个access_token给我们的网站,我们的网站获取到access_token后就可以调用第三方提供的接口了,比如获取用户信息等。最后把该用户信息存入到我们站点的数据库,并把信息保存到session中,实现用户的第三方登陆。

9. 如何处理负载、高并发?

<1>HTML静态化:其实大家都知道,效率最高、消耗最小的就是纯静态化的html页面,所以我们尽可能使我们的网站上的页面采用静态页面来实现,这个最简单的方法其实也是最有效的方法。

<2>图片服务器分离:把图片单独存储,尽量减少图片等大流量的开销,可以放在一些相关的平台上。

<3>数据库集群和库表散列及缓存:数据库的并发连接为100,一台数据库远远不够,可以从读写分离、主从复制,数据库集群方面来着手。另外尽量减少数据库的访问,可以使用缓存数据库如memcache、redis。

<4>镜像:尽量减少下载,可以把不同的请求分发到多个镜像端。

<5>负载均衡:Apache的最大并发连接为1500,只能增加服务器,可以从硬件上着手,如F5服务器。当然硬件的成本比较高,我们往往从软件方面着手。负载均衡 (Load Balancing) 建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力,同时能够提高网络的灵活性和可用性。目前使用最为广泛的负载均衡软件是Nginx、LVS、HAProxy。

10. echo、print、print_r、var_dump的区别

<1>echo:echo可以一次输出多个值,多个值之间用逗号分隔。echo是php的内部指令,不是函数,无返回值。

<2>print:print只能打印出简单类型变量的值(如int、string),如果字符串成功显示则返回true,否则返回false

<3>print_r:可以把字符串和数字简单地打印出来,而数组则以括起来的键和值得列表形式显示,并以Array开头。但print_r()输出布尔值和NULL的结果没有意义,因为都是打印"\n"。因此用var_dump()函数更适合调试。print_r是函数,可以打印出比较复杂的变量(如数组,对象),有返回值。

<4>var_dump:判断一个变量的类型与长度,并输出变量的数值,如果变量有值,输出的是变量的值并回返数据类型。此函数显示关于一个或多个表达式的结构信息,包括表达式的类型与值。数组将递归展开值,通过缩进显示其结构。

11. 单引号和双引号的区别

<1>单引号内部的变量不会执行, 双引号会执行。

<2>单引号解析速度比双引号快。

<3>单引号只能解析部分特殊字符,双引号可以解析所有特殊字符。

12. 索引的优缺点、使用场景

优点:

<1>建立索引的列可以保证行的唯一性,生成唯一的rowId。

<2>建立索引可以有效缩短数据的检索时间。

<3>建立索引可以加快表与表之间的连接。

<4>为用来排序或者是分组的字段添加索引可以加快分组和排序顺序。

缺点:

<1>创建索引和维护索引需要时间成本,这个成本随着数据量的增加而加大。

<2>创建索引和维护索引需要空间成本,每一条索引都要占据数据库的物理存储空间,数据量越大,占用空间也越大(数据表占据的是数据库的数据空间)。

使用场景:

<1>数据量大,经常进行查询操作的表要建立索引。

<2>表与表连接用于多表联合查询的约束条件的字段应当建立索引。

<3>用于排序的字段可以添加索引,用于分组的字段应当视情况看是否需要添加索引。

<4>添加多列索引的时候,对应的多条件查询可以触发该索引的同时,索引最左侧列的单条件查询也可以触发。

<5>如果有些表注定只会进行查询所有,也就没必要添加索引,因为查询全部只能进行全量搜索即扫描全表。

13. MySQL事务

MySQL 事务主要用于处理操作量大,复杂度高的数据。比如说,在人员管理系统中,你删除一个人员,你即需要删除人员的基本资料,也要删除和该人员相关的信息,如消息、文章等等。这样,这些数据库操作语句就构成一个事务!

事务必须满足的4个条件(ACID):

<1>原子性(Atomicity,或称不可分割性):一个事务中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚到事务开始前的状态,就像这个事务从来没有执行过一样。

<2>一致性(Consistency):在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。

<3>隔离性(Isolation,又称独立性):数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。

<4>持久性(Durability):事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。

MYSQL事务处理主要有两种方法:

<1>用 BEGIN,ROLLBACK,COMMIT来实现:BEGIN 开始一个事务,ROLLBACK 事务回滚,COMMIT 事务确认。

<2>直接用 SET 来改变 MySQL 的自动提交模式:SET AUTOCOMMIT=0 禁止自动提交,SET AUTOCOMMIT=1 开启自动提交。

14. MySQL引擎

MySQL存储引擎:MyISAM、InnoDB、MERGE、MEMORY(HEAP)、BDB(BerkeleyDB)、EXAMPLE、FEDERATED、ARCHIVE、CSV、BLACKHOLE。

MyISAM与InnoDB主要区别:

<1>事务:MyISAM是非事务安全型的,而InnoDB是事务安全型的,默认开启自动提交,宜合并事务,一同提交,减小数据库多次提交导致的开销,大大提高性能。

<2>锁:MyISAM锁的粒度是表级,而InnoDB支持行级锁定。

<3>全文索引:MyISAM支持全文类型索引,而InnoDB不支持全文索引。

<4>查询效率:MyISAM相对简单,所以在效率上要优于InnoDB,小型应用可以考虑使用MyISAM。

<5>外健:MyISAM不支持外健,InnoDB支持。

<6>count:MyISAM保有表的总行数,InnoDB只能遍历。

<7>MyISAM表是保存成文件的形式,在跨平台的数据转移中使用MyISAM存储会省去不少的麻烦。

<8>InnoDB表比MyISAM表更安全,可以在保证数据不会丢失的情况下,切换非事务表到事务表。

<9>MyIsam索引和数据分离,InnoDB在一起,MyIsam天生非聚簇索引,最多有一个unique的性质,InnoDB的数据文件本身就是主键索引文件,这样的索引被称为“聚簇索引”。

<10>InnoDB提供多版本数据支持,MyIsam不支持。

<11>两者都仅支持B+树索引,不支持hash索引。

MyISAM与InnoDB应用场景:

<1>MyISAM管理非事务表。它提供高速存储和检索,以及全文搜索能力。如果应用中需要执行大量的SELECT查询,那么MyISAM是更好的选择。

<2>InnoDB用于事务处理应用程序,具有众多特性,包括ACID事务支持。如果应用中需要执行大量的INSERT或UPDATE操作,则应该使用InnoDB,这样可以提高多用户并发操作的性能。

15. PHP浮点数比较

PHP 比较运算符(==、===)用于比较两个值(数字或字符串)

请不要在程序中直接使用等号、大于、加、减、乘、除等操作浮点数,如果需要对浮点数进行以上操作,请使用BC系列函数。以确保准确性及精度。

bcadd:将二个高精确度数字相加。

bccomp:比较二个高精确度数字。

bcdiv:将二个高精确度数字相除。

bcmod:取得高精确度数字的余数。

bcmul:将二个高精确度数字相乘。

bcpow:求一高精确度数字次方值。

bcscale:配置程序中所有 BC 函数库的默认小数点位数。

bcsqrt:求一高精确度数字的平方根。

bcsub:将二个高精确度数字相减。

16. PHP常用关键字

final :

<1>final不能修饰成员属性,只能修饰类和方法。

<2>使用final修饰的类不能被子类继承,不能被子类覆盖。

static:

<1>使用static可以修饰成员的属性和方法,不能修饰类。

<2>使用static修饰的成员属性,可以被同一个类的所有对象共享。

<3>静态的数据是存在内存中的数据段中(初始化静态段)。

<4>静态的数据是在类在一次加载时,分配到内存中的,以后再用到类时就直接从数据段中获取。

<5>什么是类被加载?只要在程序中使用到这个类(有这个类名出现)。

<6>static在函数中第一次调用时执行,不同的函数中名称相同的变量互不影响,static修饰的变量与名称相同的全局变量不冲突。

<7>静态方法(static修饰的方法),不能访问非静态的成员(在非静态的方法中,可以访问静态成员),因为非静态的成员,就必须用对象来访问,访问内部的成员使用的就是$this,静态方法不用使用对象来调用,也就没有对象,$this也就不能代表什么对象,非静态的成员还必须使用对象,如果你确定一个方法不使用非静态的成员,则可以将这个方法声明为 静态方法(不用创建对象,直接使用类名就可以访问)。

<8>静态成员:类名::成员,在内部访问其它成员:self::成员。

<9>可以被子类继承和覆盖。

const:

<1>只能修饰成员属性。

<2>类名中声明常量属性使用const。

<3>一个常量一旦被定义,就不能再改变或取消定义。

<4>可以被子类继承,但是不能被覆盖。

<5>访问方式和静态属性是一样的。

<6>常量一定要在声明时给初值。

17. PHP命名空间

使用命名空间的目的:团队合作项目时,避免与团队其它成员新建的类发生冲突;个人负责项目时,避免前后新建的类发生冲突。

namespace:

<1> namespace后命名的定义不区分大小写。

<2> 没有定义命名空间,就理解为使用顶级命名空间。new类时,可以在类前加上反斜杠,也可以不加。

<3> new类或指定命名空间时,一定用反斜杠“\”。

<4> 命名空间声明后的代码便属于这个命名空间,即使有include或require也不影响。

<5> namespace里不包含类名称,即使存在与类名称同名的部分,那也不代表类。

<6> 一个php文件中可以存在多个命名空间,第一个命名空间前不能有任何代码。

use:

<1> new类时,最前面无需用反斜杠。

<2> namespace后面不建议加类名,但use后可以。

<3> use animal\dog as dog;new dog\Dog()。

18. PHP常用函数

<1> 数学函数:abs() 求绝对值;ceil() 进一法取整;floor() 去尾法取整;fmod() 浮点数取余;pow() 返回数的n次方;round() 浮点数四舍五入;sqrt() 求平方根;max() 求最大值;min() 求最小值;rand() 随机数;mt_rand() 更好的随机数;pi() 获取圆周率值;

<2> 去空格或或其他字符:trim() 删除字符串两端的空格或其他预定义字符;rtrim() 删除字符串右边的空格或其他预定义字符;chop() rtrim()的别名;ltrim() 删除字符串左边的空格或其他预定义字符;dirname() 返回路径中的目录部分。

<3> 字符串生成与转化:str_pad() 把字符串填充为指定的长度;str_repeat() 重复使用指定字符串;str_split() 把字符串分割到数组中;strrev() 反转字符串;wordwrap() 按照指定长度对字符串进行折行处理;str_shuffle() 随机地打乱字符串中所有字符;parse_str() 将字符串解析成变量;number_format() 通过千位分组来格式化数字。

<4> 大小写转换:strtolower() 字符串转为小写;strtoupper() 字符串转为大写;ucfirst() 字符串首字母大写;ucwords() 字符串每个单词首字符转为大写;

<5> html标签关联:htmlentities() 把字符转为HTML实体;htmlspecialchars(): 预定义字符转html编码;nl2br() \n转义为<br>标签;strip_tags() 剥去 HTML、XML 以及 PHP 的标签;addcslashes() 在指定的字符前添加反斜线转义字符串中字符;stripcslashes() 删除由addcslashes()添加的反斜线;addslashes() 指定预定义字符前添加反斜线;stripslashes() 删除由addslashes()添加的转义字符;quotemeta() 在字符串中某些预定义的字符前添加反斜线;chr() 从指定的 ASCII 值返回字符;ord() 返回字符串第一个字符的ASCII值;

<6> 字符串比较:strcasecmp() 不区分大小写比较两字符串;strcmp() 区分大小写比较两字符串;strncasecmp() 比较字符串前n个字符,不区分大小写;strnatcmp() 自然顺序法比较字符串长度,区分大小写;strnatcasecmp() 自然顺序法比较字符串长度,不区分大小写;chunk_split() 将字符串分成小块;strtok() 切开字符串;explode() 使用一个字符串为标志分割另一个字符串;implode() 同join,将数组值用预订字符连接成字符串;substr() 截取字符串;

<7> 字符串查找替换:str_replace() 字符串替换操作,区分大小写;str_ireplace() 字符串替换操作,不区分大小写;substr_count() 统计一个字符串,在另一个字符串中出现次数;substr_replace() 替换字符串中某串为另一个字符串;similar_text() 返回两字符串相同字符的数量;strrchr() 返回一个字符串在另一个字符串中最后一次出现位置开始到末尾的字符串;strstr() 返回一个字符串在另一个字符串中开始位置到结束的字符串;strchr() strstr()的别名,返回一个字符串在另一个字符串中首次出现的位置开始到末尾的字符串;stristr() 返回一个字符串在另一个字符串中开始位置到结束的字符串,不区分大小写;strtr() 转换字符串中的某些字符;strpos() 寻找字符串中某字符最先出现的位置;stripos() 寻找字符串中某字符最先出现的位置,不区分大小写;strrpos() 寻找某字符串中某字符最后出现的位置;strripos() 寻找某字符串中某字符最后出现的位置,不区分大小写;strspn() 返回字符串中首次符合mask的子字符串长度;strcspn() 返回字符串中不符合mask的字符串的长度;

<8> 字符串统计:str_word_count() 统计字符串含有的单词数;strlen() 统计字符串长度;count_chars() 统计字符串中所有字母出现次数;md5() 字符串md5编码;

<9> 数组函数:array() 生成一个数组;array_combine() 生成一个数组,用一个数组的值;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值