PHP面试之面向对象(1)

PHP面试专栏正式起更,每周1、3、五更新,提供最好最优质的PHP面试内容。
PHP中面向对象常考的知识点有如下7点,我将会从如下几点进行详细介绍说明,帮助你更好的应对PHP面试常考的面向对象相关的知识点和考题。
整个面向对象文章的结构涉及的内容模块有:php

1、面向对象与面向过程有什么区别?
2、面向对象有什么特征?
3、什么是构造函数和析构函数?
4、面向对象的做用域范围有哪几种?
5、PHP 中魔术方法有哪些?
6、什么是对象克隆?
7、this、self和parent的区别是什么?
8、抽象类与接口有什么区别与联系?
9、PHP面向对象的常考面试题讲解

关于PHP面向对象的内容将会被分为三篇文章进行讲解完整块内容,第一篇主要讲解一到四点内容,第二篇主要讲解五到八的内容,第三篇围绕第九点进行讲解。html


如下正文的内容都来自《PHP程序员面试笔试宝典》书籍,若是转载请保留出处:程序员

1、面向对象与面向过程有什么区别?

面向对象是当今软件开发方法的主流方法之一,它是把数据及对数据的操做方法放在一块儿,做为一个相互依存的总体,即对象。对同类对象抽象出其共性,即类,类中的大多数数据,只能被本类的方法进行处理。类经过一个简单的外部接口与外界发生关系,对象与对象之间经过消息进行通讯。程序流程由用户在使用中决定。例如,站在抽象的角度,人类具备身高、体重、年龄、血型等一些特称,人类会劳动、会直立行走、会吃饭、会用本身的头脑去创造工具等这些方法,人类仅仅只是一个抽象的概念,它是不存在的实体,可是全部具有人类这个群体的属性与方法的对象都称为人,这个对象人是实际存在的实体,每一个人都是人这个群体的一个对象。
而面向过程是一种以事件为中心的开发方法,就是自顶向下顺序执行,逐步求精,其程序结构是按功能划分为若干个基本模块,这些模块造成一个树状结构,各模块之间的关系也比较简单,在功能上相对独立,每一模块内部通常都是由顺序、选择和循环三种基本结构组成,其模块化实现的具体方法是使用子程序,而程序流程在写程序时就已经决定。例如五子棋,面向过程的设计思路就是首先分析问题的步骤:第一步,开始游戏;第二步,黑子先走;第三步,绘制画面;第四步,判断输赢;第五步,轮到白子;第六步,绘制画面;第七步,判断输赢;第八步,返回步骤二;第九步,输出最后结果。把上面每一个步骤用分别的函数来实现,就是一个面向过程的开发方法。面试

具体而言,两者主要有如下几个方面的不一样之处。
1)出发点不一样。面向对象是用符合常规思惟方式来处理客观世界的问题,强调把问题域的要领直接映射到对象及对象之间的接口上。而面向过程方法则否则,它强调的是过程的抽象化与模块化,它是以过程为中心构造或处理客观世界问题的。
2)层次逻辑关系不一样。面向对象方法则是用计算机逻辑来模拟客观世界中的物理存在,以对象的集合类做为处理问题的基本单位,尽量地使计算机世界向客观世界靠拢,以使问题的处理更清晰直接,面向对象方法是用类的层次结构来体现类之间的继承和发展。面向过程方法处理问题的基本单位是能清晰准确地表达过程的模块,用模块的层次结构归纳模块或模块间的关系与功能,把客观世界的问题抽象成计算机能够处理的过程。
3)数据处理方式与控制程序方式不一样。面向对象方法将数据与对应的代码封装成一个总体,原则上其余对象不能直接修改其数据,即对象的修改只能由自身的成员函数完成,控制程序方式上是经过“事件驱动”来激活和运行程序。而面向过程方法是直接经过程序来处理数据,处理完毕后便可显示处理结果,在控制程序方式上是按照设计调用或返回程序,不能自由导航,各模块之间存在着控制与被控制、调用与被调用。
4)分析设计与编码转换方式不一样。面向对象方法贯穿软件生命周期的分析、设计及编码之间是一种平滑过程,从分析到设计再到编码是采用一致性的模型表示,即实现的是一种无缝链接。而面向过程方法强调分析、设计及编码之间按规则进行转换,贯穿软件生命周期的分析、设计及编码之间,实现的是一种有缝的链接。数据库


2、面向对象有什么特征?

面向对象的主要特征有抽象、继承、封装和多态。
1)抽象。抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解所有问题,而只是选择其中的一部分,暂时不用部分细节。抽象包括两个方面,一是过程抽象,二是数据抽象。
2)继承。继承是一种联结类的层次模型,而且容许和鼓励类的重用,它提供了一种明确表述共性的方法。对象的一个新类能够从现有的类中派生,这个过程称为类继承。新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。派生类能够从它的基类那里继承方法和实例变量,而且子类能够修改或增长新的方法使之更适合特殊的须要。
3)封装。封装是指将客观事物抽象成类,每一个类对自身的数据和方法实行保护。类能够把本身的数据和方法只让可信的类或者对象操做,对不可信的信息进行隐藏。
4)多态。多态是指容许不一样类的对象对同一消息作出响应。多态包括参数化多态和包含多态。多态性语言具备灵活、抽象、行为共享、代码共享的优点,很好地解决了应用程序函数同名问题。编程


本身整理了一篇“ PHP和MySQL面试中爱考的10道题”的文章,关注公众号:“ 琉忆编程库”,回复:“ 10”,我发给你。

3、什么是构造函数和析构函数?

1.构造函数

在PHP5以前的版本,构造函数的名字必须与类的名字相同,而从PHP5开始,开发者能够定义一个名为__construct的方法做为构造函数。构造函数的做用就是当类被实例化的时候会被自动调用,所以构造函数主要用于作一些初始化的工做。使用__construct做为构造函数名字的一个好处是,当类名修改的时候,不须要修改构造函数的名字。它的声明形式为
void __construct ([ mixed $args [, $... ]] )模块化

在C++语言中,子类的构造函数会隐式地调用父类的无参数的构造函数。可是在PHP中,子类的构造函数不会隐式地去调用父类的构造函数,须要开发者经过parent::__construct()来显式地去调用父类的构造函数。当子类没有定义构造函数的时候,它会继承父类的构造函数,但前提是父类的构造函数不能被定义为private。使用示例以下:函数

<?php    
    class BaseClass {
        function __construct() {
            print "Base constructor\n";
        }
    }
    class SubClass extends BaseClass {
        function __construct() {
            parent::__construct();
            print "Sub constructor\n";
        }
    }
    // 会调用父类构造函数
    $obj = new BaseClass();
    //调用子类构造函数,子类构造函数会去调用父类构造函数
    $obj = new SubClass();
?>

程序的运行结果为工具

Base constructor
Base constructor
Sub constructor

从上面的讲解中能够发现,从PHP5开始多了一种构造函数定义的方法。为了实现不一样版本PHP代码的兼容,在PHP5的类中找不到 __construct() 函数而且也没有从父类继承一个的话,那么它就会尝试寻找旧式的构造函数(与类同名的函数)。这种兼容的方法存在一个风险:在PHP5以前的版本中开发的类中已有一个名为 __construct() 的方法却被用于其余用途时,PHP5的类会认为这是一个构造函数,从而当类实例化时自动执行这个方法。
从 PHP 5.3.3 开始,在命名空间中,与类名同名的方法再也不做为构造函数。这一改变不影响不在命名空间中的类。this

2.析构函数

析构函数是在PHP5引入的,它的做用与调用时机和构造函数恰好相反,它在对象被销毁时自动执行。析构函数__destruct()结构形式以下:

function __destruct(){
    /* 类的初始化代码*/
} 

须要注意的是,析构函数是由系统自动调用的,所以,它不须要参数。
默认状况下,系统仅释放对象属性所占用的内存,并不销毁在对象内部申请的资源(例如,打开文件、建立数据库的链接等),而利用析构函数在使用一个对象以后执行代码来清除这些在对象内部申请的资源(关闭文件、断开与数据库的链接)。
与构造函数相似,若是想在子类中调用父类的析构函数,那么须要显式地调用:parent::__destruct()。若是子类没有定义析构函数,那么它会继承父类的析构函数。
当对象再也不被引用时,将调用析构函数。若是要明确地销毁一个对象,那么能够给指向对象的变量不分配任何值,一般将变量赋值为NULL或者用unset()函数。示例代码以下:

<?php 
    class des{
        function __destruct(){
            echo "对象被销毁,执行析构函数<br>";
        }
    }
    $p=new des(); /* 实例化类 */
    echo "程序开始<br>";
    unset($p); /* 销毁变量$p */
    echo "程序结束";
?>

4、面向对象的做用域范围有哪几种?

在PHP5中,类的属性或者方法主要有public、protected和private三种类做用域,它们的区别以下:
1)public(公有类型)表示全局,类内部、外部和子类均可以访问。
默认的访问权限为public,也就是说,若是一个方法没有被public、protected或private修饰,那么它默认的做用域为public。
2)protected(受保护类型)表示受保护的,只有本类或子类能够访问。
在子类中,能够经过self::var或self::method访问,也能够经过parent::method来调用父类中的方法。
在类的实例化对象中,不能经过$obj->var来访问protected类型的方法或属性。
3)private(私有类型)表示私有的,只有本类内部可使用。
该类型的属性或方法只能在该类中使用,在该类的实例、子类、子类的实例中都不能调用私有类型的属性和方法。


预告:PHP面试常考内容之面向对象(2)将于本周三(2019.2-13)更新。

以上内容摘自《PHP程序员面试笔试宝典》书籍,该书已在天猫京东当当等电商平台销售。

图片描述

更多PHP相关的面试知识、考题能够关注公众号获取:琉忆编程库

对本文有什么问题或建议均可以进行留言,将不断完善追求极致,感谢大家的支持。

相关文章
相关标签/搜索