面试题总结(61-100)

61. session和cookie的使用步骤分别是什么?什么是sesssion和cookie的生命周期?session和cookie的区别是什么?

 cookie是保存在客户端机器的,对于未设置过期时间的cookie,cookie值会保存在机器的内存中,只要关闭浏览器则cookie自动消失。如果设置了cookie的过期时间,那么浏览器会把cookie以文本文件的形式保存到硬盘中,当再次打开浏览器时cookie值依然有效。

 

 session是把用户需要存储的信息保存在服务器端。每个用户的session信息就像是键值对一样存储在服务器端,其中的键就是sessionid,而值就是用户需要存储信息。服务器就是通过sessionid来区分存储的session信息是哪个用户的。

 

 两者最大的区别就是session存储在服务器端,而cookie是在客户端。session安全性更高,而cookie安全性弱。

 session在web开发中具有非常重要的份量。它可以将用户正确登录后的信息记录到服务器的内存中,当用户以此身份

 访问网站的管理后台时,无需再次登录即可得到身份确认。而没有正确登录的用户则不分配session空间,即便输入了

 管理后台的访问地址也不能看到页面内容。通过session确定了用户对页面的操作权限。

  使用session的步骤:

 1. 启动session:

  使用session_start()函数来启动。

 2. 注册会话:

     直接给$_SESSION数组添加元素即可。

 3. 使用会话:

  判断session是否为空或者是否已经注册,如果已经存在则像普通数组使用即可。

 4. 删除会话:

  1.可以使用unset删除单个session;

  2.使用$_SESSION=array()的方式,一次注销所有的会话变量;

  3.使用session_destroy()函数来彻底销毁session。

 cookie怎么使用?

 1. 记录用户访问的部分信息

 2. 在页面间传递变量

 3. 将所查看的internet页存储在cookies临时文件夹中,可以提高以后的浏览速度。

 创建cookie:

  setcookie(string cookiename , string value , int expire);

 读取cookie:

  通过超级全局数组$_COOKIE来读取浏览器端的cookie的值。

 删除cookie:有两种方法

  1.手工删除方法:

   右击浏览器属性,可以看到删除cookies,执行操作即可将所有cookie文件删除。

  2.setcookie()方法:

   跟设置cookie的方法一样,不过此时将cookie的值设置为空,有效时间为0或小于当前时间戳。

 

62. 如何设置一个cookie的名字为username,值为jack,并且让此cookie一周后失效?

 一个浏览器最多可以产生多少个cookie,每个cookie文件最大不能超过多少?

 setcookie(‘username’,’jack’,time()+7*24*3600);

 最多可以产生20个cookie,每个最多不超过4K

 

63. 设置或读取session之前,需要做什么?

 可以直接在php.ini中开启session.auto_start = 1或者在页面头部用session_start();

 开启session,session_start()前面不能有任何输出,包括空行。

 

64. 在实际开发中,session在哪些场合使用?

 session用来存储用户登录信息和用在跨页面传值。

 1)常用在用户登录成功后,将用户登录信息赋值给session;

 2)用在验证码图片生成,当随机码生成后赋值给session。

 

65. 注销session会话的形式有几种?

 unset() 

 $_SESSION=array();

 session_destroy();

66. 什么是OOP?什么是类和对象?什么是类属性?

 OOP(object oriented programming),即面向对象编程,其中两个最重要的概念就是类和对象。

 世间万物都具有自身的属性和方法,通过这些属性和方法可以区分出不同的物质。

 属性和方法的集合就形成了类,类是面向对象编程的核心和基础,

 通过类就将零散的用于实现某个功能的代码有效地管理起来了。

 

 类只是具备了某些功能和属性的抽象模型,而实际应用中需要一个一个实体,也就是需要对类进行实例化,

 类在实例化之后就是对象。★类是对象的抽象概念,对象是类的实例化。

 OOP具有三大特点:1. 封装性(又叫做隐藏性);2. 继承性; 3. 多态性。

 OOP的优点:1、代码重用性高(省代码) 2、使程序的可维护性高(扩展性) 3、灵活性

 

67. 常用的属性的访问修饰符有哪些?分别代表什么含义?(重点)

 private,protected,public。

 

 类外:public 

 子类中:public,protected 

 本类中:private,protected,public 

 类前面:只能加final,abstract

 属性前面:必须有访问修饰符(private,protected,public)

 方法前面:static,final,private,protected,public ,abstract

 

68. $this和self、parent这三个关键词分别代表什么?在哪些场合下使用?

 $this 当前对象

 self  当前类

 parent  当前类的父类

 

 $this在当前类中使用,使用->调用属性和方法。

 self也在当前类中使用,不过需要使用::调用。

 parent在类中使用。

 

69.类中如何定义常量、如何类中调用常量、如何在类外调用常量。(扩展)

 类中的常量也就是成员常量,常量就是不会改变的量,是一个恒值。

 定义常量使用关键字const.

 例如:const PI = 3.1415326;

 无论是类内还是类外,常量的访问和变量是不一样的,常量不需要实例化对象,

 访问常量的格式都是类名加作用域操作符号(双冒号)来调用。

 即:类名 :: 类常量名; 

 

70. 作用域操作符::如何使用?都在哪些场合下使用?(扩展)

 调用类常量

 调用静态方法

 

71. 什么是魔术方法?常用的魔术方法有哪几个?(重点)

 以__开头的系统自定义的方法。

 __construct()

 __destruct()

 __autoload()

 __call()

 __tostring()

 

72. 什么是构造方法和析构方法?

 构造方法就是在实例化一个对象的同时自动执行的成员方法,作用就是初始化对象。

 php5之前,一个跟类名完全相同的方法是构造方法,php5之后魔术方法__construct()就是构造方法。

 如果类中没有定义构造方法,那么php会自动生成一个,这个自动生成的构造方法没有任何参数,

 没有任何操作。

 构造方法的格式如下:

 function __construct(){}

 或者:function 类名(){}

 构造方法可以没有参数,也可以有多个参数。

 析构方法的作用和构造方法正好相反,是对象被销毁时被自动调用的,作用是释放内存。

 析构方法的定义方法为:__destruct();

 因为php具有垃圾回收机制,能自动清除不再使用的对象,释放内存,一般情况下可以不手动创建析构方法。

 

73. __autoload()方法的工作原理是什么?(重点)

 使用这个魔术函数的基本条件是类文件的文件名要和类的名字保持一致。

 当程序执行到实例化某个类的时候,如果在实例化前没有引入这个类文件,那么就自动执行__autoload()函数。

 这个函数会根据实例化的类的名称来查找这个类文件的路径,当判断这个类文件路径下确实存在这个类文件后

 就执行include或者require来载入该类,然后程序继续执行,如果这个路径下不存在该文件时就提示错误。

 使用自动载入的魔术函数可以不必要写很多个include或者require函数。

 

74. 什么是抽象类和接口?抽象类和接口有什么不同和相似的地方?

 抽象类是一种不能被实例化的类,只能作为其他类的父类来使用。

 抽象类是通过关键字 abstract 来声明的。

 抽象类与普通类相似,都包含成员变量和成员方法,两者的区别在于,抽象类中至少要包含一个抽象方法,

 抽象方法没有方法体,该方法天生就是要被子类重写的。

 抽象方法的格式为:abstract function abstractMethod();

  

 因为php中只支持单继承,如果想实现多重继承,就要使用接口。也就是说子类可以实现多个接口。

 接口类是通过interface关键字来声明的,接口类中的成员变量和方法都是public的,方法可以不写关键字public,

 接口中的方法也是没有方法体。接口中的方法也天生就是要被子类实现的。

 抽象类和接口实现的功能十分相似,最大的不同是接口能实现多继承。在应用中选择抽象类还是接口要看具体实现。

 子类继承抽象类使用extends,子类实现接口使用implements。

 

 抽象类至少有一个抽象方法吗?

 答:如果一个类声明成抽象类,里面可以没有抽象方法

     如果一个类中有抽象方法,这个类必须是抽象类

 

75. __call的参数有几个,类型是什么,意义是什么?

 魔术方法__call()的作用是当程序调用一个不存在或不可见的成员方法时,php会先调用__call()方法,

 将那个不存在的方法的方法名和参数都存储下来。

 __call()包含两个参数,  第一个参数是那个不存在的方法的方法名,是个字符串类型;

    第二个参数是那个不存在的方法的所有参数,是个数组类型。

 本人认为__call()方法的意义更多在于调试,可以定位到错误。同时可以捕捉异常,如果某个方法不存在,

 则执行其它可替代方法。

76. smarty模板技术的用途是什么?

 为了php与html分开,美工和程序员各司其职,互不干扰。

 

77. smarty配置主要有哪几项?

 1. 引入smarty.class.php;

 2. 实例化smarty对象;

 3. 重新修改默认的模板路径;

 4. 重新修改默认的编译后文件的路径;

 5. 重新修改默认的配置文件的路径;

 6. 重新修改默认的cache的路径。

 7. 可以设置是否开启cache。

 8. 可以设置左侧和右侧定界符。

 

78. smarty在使用过程中需要注意哪些细节?

 Smarty是基于MVC概念的一种模板引擎,它将一个页面程序分成了两部分来实现:即视图层和控制层,

 也就是说smarty技术将用户UI与php代码分离开。

 这样程序员和美工各司其职,互不干扰。

 

 smarty运用过程中要注意以下几个问题:

 1.正确配置smarty。主要要实例化smarty对象,配置smarty模板文件的路径;

 2.php页面中使用assign赋值 和 display显示页面;

 3.smarty模板文件中不允许出现php代码段,所有的注释,变量,函数都要包含在定界符内。

  A.{}

  B. foreach

  C. if else

  D. include

  E. literal

 

79. MVC的概念是什么?各层主要做什么工作?

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

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

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

 在网站开发中,

 模型层一般负责对数据库表信息进行增删改查,

 视图层负责显示页面内容,

 控制器层在M和V之间起到调节作用,控制器层决定调用哪个model类的哪个方法,

 执行完毕后由控制器层决定将结果assign到哪个view层。

 

80. oop中的多态性跟方法重写有什么关系?

态性是面向对象编程的一种特性,和方法无关。

简单说,就是同样的一个方法能够根据输入数据的不同,做出不同的处理,即方法的重载——有不同的参数列表(静态多态性)

而当子类继承自父类的相同方法,输入数据一样,但要做出有别于父类的响应时,你就要覆盖父类的方法,即在子类中重写该方法——相同参数,不同实现(动态多态性)

81. php支持方法的重载吗?很多参考书中提到的php重载实际上该如何正确理解?

 答: php不支持方法的重载,很多书里提到的PHP‘重载’应该是‘重写’

 

82. final关键字能定义类中的成员属性吗?

 答:不能,类的成员属性只能有public ,private , protected  来定义

 

83. final关键字定义的类能够被继承吗?

 答:final定义的类不能被继承

 

84. 说说static关键字的使用场合?static能用在class前吗?

static可以跟public,protected,private一起使用吗?构造方法可以是static的吗?

答: static可以在属性和方法前面使用,调用static属性或者方法时,只要将类载入就可用,不用实例化

static不能用在class的前面

static可以跟public,protected,private一起使用,在方法的前面;

▲构造方法不能是static

 

85. 接口可以实例化吗?抽象类能实例化吗?

 答:接口和抽象类都不能被实例化

 

86. class前面能加访问修饰符吗?如果能加,只能是哪几个访问修饰符?可以是权限访问修饰符public,protected,private吗?

 答:class前面可以加final,static; 

 ★class前面不能加public,protected,private

 

87. 类中属性前可以不加访问修饰符吗?成员变量前的修饰符只能是public,protected,private吗?还可以是哪几个?

 答:类中的属性必须加修饰符,除了那3个以外,还可以加var

 

88. 如果echo一个数组,页面输出什么?echo一个对象呢?print一个数组或者对象呢?

 答:页面只能输出“Array”;echo一个对象会出现“Catchable fatal error: Object of class t2 could not be converted to string in G:\php2\t2.php on line 33”

     print一个数组时也只是输出“Array”,print一个对象出现“Catchable fatal error: Object of class t2 could not be converted to string in G:\php2\t2.php ”

     ▲print和echo是一样的  

 

89. __tostring()魔术方法在什么时候被自动执行? __tostring()魔术方法必须要return返回值吗?

 当echo或者print一个对象时,就是自动触发。而且__tostring()必须要返回一个值 

 

90. 什么是抽象方法?

 答:在方法前面有abstract,而且方法没有方法体,连“{ }”也不能有

91. 如果一个类中有一个方法是抽象方法,而这个类没有定义成抽象类,会报错吗? 

 答:会,"Fatal error: Class t2 contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (t2::ee) in"

 

92. 如果一个类是抽象类,而类中的方法都是非抽象的方法,会报错吗?

 答:不会报错,如果一个类是抽象类,其中可以没有抽象方法,但是一个类中有个方法是抽象方法,那么这个类一定是一个抽象类

 

93 PHP有哪些设计模式?

 

单例模式

  1. $_instance必须声明为静态的私有变量

  2. 构造函数和析构函数必须声明为私有,防止外部程序new 类从而失去单例模式的意义

  3. getInstance()方法必须设置为公有的,必须调用此方法 以返回实例的一个引用

  4. ::操作符只能访问静态变量和静态函数

  5. new对象都会消耗内存

  6. 使用场景:最常用的地方是数据库连接。

  7. 使用单例模式生成一个对象后, 该对象可以被其它众多对象所使用。

  8. 私有的__clone()方法防止克隆对象

单例模式,使某个类的对象仅允许创建一个。构造函数private修饰, 
申明一个static getInstance方法,在该方法里创建该对象的实例。如果该实例已经存在,则不创建。比如只需要创建一个数据库连接。

工厂模式

工厂模式,工厂方法或者类生成对象,而不是在代码中直接new。 
使用工厂模式,可以避免当改变某个类的名字或者方法之后,在调用这个类的所有的代码中都修改它的名字或者参数

注册模式

注册模式,解决全局共享和交换对象。已经创建好的对象,挂在到某个全局可以使用的数组上,在需要使用的时候,直接从该数组上获取即可。将对象注册到全局的树上。任何地方直接去访问。

适配器模式

将各种截然不同的函数接口封装成统一的API。 
PHP中的数据库操作有MySQL,MySQLi,PDO三种,可以用适配器模式统一成一致,使不同的数据库操作,统一成一样的API。类似的场景还有cache适配器,可以将memcache,redis,file,apc等不同的缓存函数,统一成一致。 
首先定义一个接口(有几个方法,以及相应的参数)。然后,有几种不同的情况,就写几个类实现该接口。将完成相似功能的函数,统一成一致的方法。

策略模式

策略模式,将一组特定的行为和算法封装成类,以适应某些特定的上下文环境。 
eg:假如有一个电商网站系统,针对男性女性用户要各自跳转到不同的商品类目,并且所有的广告位展示不同的广告。在传统的代码中,都是在系统中加入各种if else的判断,硬编码的方式。如果有一天增加了一种用户,就需要改写代码。使用策略模式,如果新增加一种用户类型,只需要增加一种策略就可以。其他所有的地方只需要使用不同的策略就可以。 
首先声明策略的接口文件,约定了策略的包含的行为。然后,定义各个具体的策略实现类。

观察者模式

1:观察者模式(Observer),当一个对象状态发生变化时,依赖它的对象全部会收到通知,并自动更新。 
2:场景:一个事件发生后,要执行一连串更新操作。传统的编程方式,就是在事件的代码之后直接加入处理的逻辑。当更新的逻辑增多之后,代码会变得难以维护。这种方式是耦合的,侵入式的,增加新的逻辑需要修改事件的主体代码。 
3:观察者模式实现了低耦合,非侵入式的通知与更新机制。 
定义一个事件触发抽象类。

原型模式

原型模式(对象克隆以避免创建对象时的消耗) 
1:与工厂模式类似,都是用来创建对象。 
2:与工厂模式的实现不同,原型模式是先创建好一个原型对象,然后通过clone原型对象来创建新的对象。这样就免去了类创建时重复的初始化操作。 
3:原型模式适用于大对象的创建,创建一个大对象需要很大的开销,如果每次new就会消耗很大,原型模式仅需要内存拷贝即可。

装饰器模式

1:装饰器模式,可以动态的添加修改类的功能 
2:一个类提供了一项功能,如果要在修改并添加额外的功能,传统的编程模式,需要写一个子类继承它,并重写实现类的方法 
3:使用装饰器模式,仅需要在运行时添加一个装饰器对象即可实现,可以实现最大额灵活性。

 

94. final 关键字的应用应注意的问题? 

 使用final关键字定义的类,禁止继承。

 使用final关键字定义的方法,禁止重写。

 

95. 如果一个类既要继承一个父类,又要实现多个接口,该如何写?

 书写格式例如: class MaleHuman extends Human implements Animal,Life { ... }

 

96. 什么是单点入口呢?

        所谓单点入口就是整个应用程序只有一个入口,所有的实现都通过这个入口来转发,

        比如说在上面我们就使用index.php作为程序的单点入口,当然这个是可以由你自己任意控制的。

 单点入口有几大好处:

     第一、一些系统全局处理的变量,类,方法都可以在这里进行处理。比如说你要对数据进行初步的过滤,你要模拟session处理,你要定义一些全局变量,甚至你要注册一些对象或者变量到注册器里面

     第二、程序的架构更加清晰明了。

 

97. PHP提供了2套正则表达式函数库,分别是哪两套?

 (1) PCRE   Perl兼容正则表达式         preg_   为前缀

 (2) POSIX  便携式的操作系统接口       ereg_   为前缀

 

98. 正则表达式的组成?

    由原子(普通字符,如英文字符)、 

    元字符(有特殊功用的字符)

    模式修正字符 

    一个正则表达式中,至少包含一个原子

 

99. 不常用魔术方法的触发时机?

 __isset()  __unset()的触发时机

 __sleep()、 __wakeup()  在对对象进行串行化的时候调用

 如果序列化对象的时候,不写__sleep()方法,则所有的成员属性都会被序列化,而定义了__sleep()方法,则只序列化指定数组中的变量。

 因此,如果有非常大的对象而并不需要完全储存下来时此函数也很有用。

 使用 __sleep 的目的是关闭对象可能具有的任何数据库连接,提交等待中的数据或进行类似的清除任务。此外,如果有非常大的对象而并不需要完全储存下来时此函数也很有用。 

 使用 __wakeup 的目的是重建在序列化中可能丢失的任何数据库连接以及处理其它重新初始化的任务。

 

100. OOP的三大特性是什么?

 1. 封装性:

    也称为信息隐藏,就是将一个类的使用和实现分开,只保留部分接口和方法与外部联系,或者说只公开了一些供开发人员使用的方法。

    于是开发人员只需要关注这个类如何使用,而不用去关心其具体的实现过程,这样就能实现MVC分工合作,也能有效避免程序间相互依赖,

      实现代码模块间松藕合。

 2. 继承性:

    就是子类自动继承其父级类中的属性和方法,并可以可以添加新的属性和方法或者对部分属性和方法进行重写。继承增加了代码的可重用性。

    php只支持单继承,也就是说一个子类只能有一个父类。

 3. 多态性:

    子类继承了来自父级类中的属性和方法,并对其中部分方法进行重写。

    于是多个子类中虽然都具有同一个方法,但是这些子类实例化的对象调用这些相同的方法后却可以获得完全不同的结果,这种技术就是多态性。

    多态性增强了软件的灵活性。

posted @ 2018-06-13 08:41  Kayle_zhao  阅读(125)  评论(0编辑  收藏  举报