1、什么是面向对象?(理解着回答)
面向对象是一种思想,是基于面向过程而言的,就是说面向对象是将功能等通过对象来实现,将功能封装进对象之中,让对象去实现具体的细节。

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

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

2、简述 private、 protected、 public 修饰符的访问权限。
private : 私有成员,在类的内部才可以访问。
protected : 保护成员,该类内部和继承类中可以访问。
public : 公共成员,完全公开,没有访问限制。

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

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

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

标记不同:
(1)html 使用固有的标记;而 xml 没有固有的标记。
(2)Html 标签是预定义的;XML 标签是免费的、自定义的、可扩展的。

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

5、面向对象的特征有哪些方面?
主要有封装,继承,多态。如果是 4 个方面则加上:抽象。
封装:
封装是保证软件部件具有优良的模块性的基础,封装的目标就是要实现软件部件的高内聚,低耦合,防止程序相互依赖性而带来的变动影响.
继承:
在定义和实现一个类的时候,可以在一个已经存在的类的基础之上来进行,把这个已经存在的类所定义的内容作为自己的内容,并可以加入若干新的内容,或修改原来的方法使之更适合特殊的需要,这就是继承。继承是子类自动共享父类数据和方法的机制,这是类之间的一种关系,提高了软件的可重用性和可扩展性。
多态:
多态是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。
抽象:
抽象就是找出一些事物的相似和共性之处,然后将这些事物归为一个类,这个类只考虑这些事物的相似和共性之处,并且会忽略与当前主题和目标无关的那些方面,将注意力集中在与当前目标有关的方面。例如,看到一只蚂蚁和大象,你能够想象出它们的相同之处,那就是抽象。

6、抽象类和接口的概念以及区别?
抽象类:它是一种特殊的,不能被实例化的类,只能作为其他类的父类使用。使用 abstract 关键字声明。
接口:它是一种特殊的抽象类,也是一个特殊的类,使用 interface 声明。
区别:
(1)抽象类的操作通过继承关键字 extends 实现,而接口的使用是通过 implements 关键字来实现。
(2)抽象类中有数据成员,可以实现数据的封装,但是接口没有数据成员。
(3)抽象类中可以有构造方法,但是接口没有构造方法。
(4)抽象类的方法可以通过 private、protected、public 关键字修饰(抽象方法不能是 private),而接口中的方法只能使用 public 关键字修饰。
(5)一个类只能继承于一个抽象类,而一个类可以同时实现多个接口。
(6)抽象类中可以有成员方法的实现代码,而接口中不可以有成员方法的实现代码。

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 函数。