2021PHP面试题大全【面向对象部分】

228 阅读9分钟

1、什么是面向对象?(理解着回答)

面向对象是一种思想,是基于面向过程而言的,就是说面向对象是将功能等通过对象来实现,将功能封 装进对象之中,让对象去实现具体的细节。 

面向对象有三大特征:封装性、继承性、多态性。 

现在纯正的OO语言主要是 Java 和 C#,PHP、C++也支持OO,C是面向过程的。

2、简述 private、 protected、 public修饰符的访问权限。

private : 私有成员, 在类的内部才可以访问。 

protected : 保护成员,该类内部和继承类中可以访问。 

public : 公共成员,完全公开,没有访问限制。

3、堆和栈的区别? 

栈是编译期间就分配好的内存空间,因此你的代码中必须就栈的大小有明确的定义; 

堆是程序运行期间动态分配的内存空间,你可以根据程序的运行情况确定要分配的堆内存的大小。

4、XML 与 HTML 的主要区别 

语法要求不同: 

  • 在html中不区分大小写,在xml中严格区分。 
  • 在HTML中,有时不严格,如果上下文清楚地显示出段落或者列表键在何处结尾,那么你可以省略或 者之类的结束标记。在XML中,是严格的树状结构,绝对不能省略掉结束标记。  
  • 在XML中,拥有单个标记而没有匹配的结束标记的元素必须用一个/ 字符作为结尾。这样分析器就 知道不用查找结束标记了。 
  • 在XML中,属性值必须分装在引号中。在HTML中,引号是可用可不用的。 
  • 在HTML中,可以拥有不带值的属性名。在XML中,所有的属性都必须带有相应的值。
  • 在XML文档中,空白部分不会被解析器自动删除;但是html是过滤掉空格的。 

 标记不同:

  •  html使用固有的标记;而xml没有固有的标记。 
  •  Html标签是预定义的;XML标签是免费的、自定义的、可扩展的。 

 作用不同: 

  • html是用来显示数据的;xml是用来描述数据、存放数据的,所以可以作为持久化的介质!Html将 数据和显示结合在一起,在页面中把这数据显示出来;xml则将数据和显示分开。 XML被设计用来描述数 据,其焦点是数据的内容。HTML被设计用来显示数据,其焦点是数据的外观。 
  • xml不是HTML的替代品,xml和html是两种不同用途的语言。 XML 不是要替换 HTML;实际上XML 可 以视作对 HTML 的补充。XML 和HTML 的目标不同HTML 的设计目标是显示数据并集中于数据外观,而XML 的设计目标是描述数据并集中于数据的内容。 
  • 对于XML最好的形容可能是: XML是一种跨平台的,与软、硬件无关的,处理与传输信息的工具。 
  • XML未来将会无所不在。XML将成为最普遍的数据处理和数据传输的工具。

5、面向对象的特征有哪些方面? 

主要有封装,继承,多态。如果是4个方面则加上:抽象。

封装: 

封装是保证软件部件具有优良的模块性的基础,封装的目标就是要实现软件部件的高内聚,低耦合,防止程 序相互依赖性而带来的变动影响. 

继承: 

在定义和实现一个类的时候,可以在一个已经存在的类的基础之上来进行,把这个已经存在的类所定义 的内容作为自己的内容,并可以加入若干新的内容,或修改原来的方法使之更适合特殊的需要,这就是 继承。继承是子类自动共享父类数据和方法的机制,这是类之间的一种关系,提高了软件的可重用性和 可扩展性。 

多态: 

多态是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定 ,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法 调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。 

抽象:

抽象就是找出一些事物的相似和共性之处,然后将这些事物归为一个类,这个类只考虑这些事物的相似 和共性之处,并且会忽略与当前主题和目标无关的那些方面,将注意力集中在与当前目标有关的方面。 例如,看到一只蚂蚁和大象,你能够想象出它们的相同之处,那就是抽象。

6、抽象类和接口的概念以及区别? 

抽象类:它是一种特殊的,不能被实例化的类,只能作为其他类的父类使用。使用abstract关键字声明 。 接口:它是一种特殊的抽象类,也是一个特殊的类,使用interface声明。 

区别: 

  • 抽象类的操作通过继承关键字extends实现,而接口的使用是通过implements关键字来实现。 
  • 抽象类中有数据成员,可以实现数据的封装,但是接口没有数据成员。 
  • 抽象类中可以有构造方法,但是接口没有构造方法。 
  • 抽象类的方法可以通过private、protected、public关键字修饰(抽象方法不能是private),而 接口中的方法只能使用public关键字修饰。 
  • 一个类只能继承于一个抽象类,而一个类可以同时实现多个接口。
  • 抽象类中可以有成员方法的实现代码,而接口中不可以有成员方法的实现代码。

7、什么是构造函数,什么是析构函数,作用是什么? 

构造函数(方法)是对象创建完成后第一个被对象自动调用的方法。它存在于每个声明的类中,是一个 特殊的成员方法。作用是执行一些初始化的任务。Php中使用__construct()声明构造方法,并且只能声 明一个。 

析构函数(方法)作用和构造方法正好相反,是对象被销毁之前最后一个被对象自动调用的方法。是 PHP5中新添加的内容作用是用于实现在销毁一个对象之前执行一些特定的操作,诸如关闭文件和释放内存等。

8、如何重载父类的方法,举例说明 

重载,即覆盖父类的方法,也就是使用子类中的方法替换从父类中继承的方法,也叫方法的重写。 

覆盖父类方法的关键是在子类中创建于父类中相同的方法包括方法的名称、参数和返回值类型。PHP中只 要求方法的名称相同即可。

9、常用的魔术方法有哪些?

举例说明 php规定以两个下划线(__)开头的方法都保留为魔术方法,所以建议大家函数名最好不用__开头,除非 是为了重载已有的魔术方法。

  • __construct() 实例化类时自动调用。 
  • __destruct() 类对象使用结束时自动调用。 
  • __set() 在给未定义的属性赋值的时候调用。 
  • __get() 调用未定义的属性时候调用。 
  • __isset() 使用isset()或empty()函数时候会调用。 
  • __unset() 使用unset()时候会调用。 
  • __sleep() 使用serialize序列化时候调用。 
  • __wakeup() 使用unserialize反序列化的时候调用。
  • __call() 调用一个不存在的方法的时候调用。 
  • __callStatic()调用一个不存在的静态方法是调用。 
  • __toString() 把对象转换成字符串的时候会调用。比如 echo。
  • __invoke() 当尝试把对象当方法调用时调用。 
  • __set_state() 当使用var_export()函数时候调用。接受一个数组参数。 
  • __clone() 当使用clone复制一个对象时候调用。

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

$this 当前对象 

self 当前类 

parent 当前类的父类 

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

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

parent在类中使用。

11、类中如何定义常量、如何类中调用常量、如何在类外调用常量。 

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

定义常量使用关键字const. 

例如:const PI = 3.1415326; 

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

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

即:类名::类常量名;

12、作用域操作符::如何使用?都在哪些场合下使用? 

 (1)调用类常量 

 (2)调用静态方法(使用static修饰的类方法)

13、__autoload()方法的工作原理是什么? 

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

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

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

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

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

点关注,不迷路 

好了各位,以上就是这篇文章的全部内容了,能看到这里的人呀,都是人才。之前说过,PHP方面的技术 点很多,也是因为太多了,实在是写不过来,写过来了大家也不会看的太多,所以我这里把它整理成了 PDF和文档,如果有需要的可以点这里shimo.im/docs/rjJttd… 《进阶PHP月薪30k>>>架构师成长路线【视频、面试文档免费获取】》