PHP面试会问到的一些问题整理
什么是面向对象(OOP):
概念:封装、多态、继承(多态字面理解,多种形态。使用同一个方法,出现不同的产出。比如定义个接口类,后者2个类都实现这个接口类。里面可以对接口里面的方法进行重载覆盖。)
常用的设计模式:
观察者设计模式定义了对象间的一种一对多的组合关系,以便一个对象的状态发生变化时,所有依赖于它的对象都得到通知并自动刷新。
工厂模式:如果一个类的主要功能,是用于生产特定的对象。它提供了一种创建对象的最佳方式。可以让类更好的初始化,而不用每次都写冗余的代码。
单例模式:在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中,应用该模式的类一个类只有一个实例。PHP通过静态化属性和私有化构造方法,屏蔽__copy魔术方法进行模拟。
PHP的工作原理。一个PHP程序执行的流程:
0、前置的调取配置文件,调用各个扩展的模块初始化方法,使其可用
1、将PHP代码转换为语言片段
2、将语言片段转换成有意义的表达式
3、将表达式编译成Opcode(zend_compire_file)
4、顺次执行Opcode,从而实现PHP脚本的功能(zend_excute)
5、一旦页面执行完毕,unset变量,关闭模块
最终类:
该类已经十分完善了,不需要继承,不需要扩展和升级了,直接实例化即可。
抽象类和抽象方法:
abstract关键字修饰的类和方法,就是抽象类和抽象方法;该类只能被继承,不能直接实例化,抽象类就是最顶层的类,给所有类一个共有的属性,没有实际意义,只用来继承抽象方法其实就是用来约束程序猿的机制,命名机制,所有方法必须重写机制
接口和抽象类的区别:
一个类可以继承多个接口,但只能继承一个抽象类。
接口的关键词是implements,抽象的关键词是extend。
接口的方法默认为public,抽象类可以有多种。
接口类没有构造函数,抽象类中可以有。
使用选择:
如果必须有多个来源继承行为,使用接口
如果所有类都会共享一个公共的行为实现,就使用抽象类,并在其中实现该行为。
类的多态:
主要指方法的重载和方法重写
PHP的继承:
父类可以称为上层类,基类,子类可以称为下层类,派生类,为了实现原有功能的扩展和升级,如果一个类不需要升级和扩展,那么继承就没有意义
单继承:只能从一个父类来继承功能;如:Java、PHP、C#、VB等
多继承:同时从多个父类来继承功能;如:C++
什么是类的封装性:
封装性:将敏感的数据保护起来,不被外界访问;
IOC容器,DI:
就是具有依赖注入功能的容器,IOC容器负责实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。
简单来说,a依赖b,但a不控制b的创建和销毁,仅使用b,那么b的控制权交给a之外处理,这叫控制反转(IOC),而a要依赖b,必然要使用b的instance,那么通过a的接口,把b传入;通过a的构造,把b传入;通过设置a的属性,把b传入;这个过程叫依赖注入(DI)。
CGI和FASTCGI和PHP-FPM:
CGI全称“公共网关接口”(Common Gateway Interface),是HTTP服务器与其它机器上的程序进行通信的接口,其程序须运行在网络服务器上。
FastCGI是语言无关的、可伸缩架构的CGI开放扩展,其主要行为是将CGI解释器进程保持在内存中并因此获得较高的性能。我们知道,CGI解释器的反复加载是CGI性能低下的主要原因,如果CGI解释器保存在内存中并接受FastCGI进程管理器调度,那么就可以提供良好的性能、伸缩性等。
FastCGI是一个常驻型的CGI,它可以一直执行,只要激活后,不会每次都要花费时间去fork一次(这是CGI最为人诟病的fork-and-execute模式)。它还支持分布式的运算,即 FastCGI 程序可以在网站服务器以外的主机上执行并且接受来自其它网站服务器来的请求。
PHP-FPM(FastCGI Process Manager:FastCGI进程管理器)是一个PHPFastCGI管理器,可以有效管理内存和进程。