美文网首页
PHP面试题6--面向对象基础

PHP面试题6--面向对象基础

作者: Amy1234567 | 来源:发表于2021-05-25 17:12 被阅读0次

    什么是面向对象

    定义:面向对象(Object Oriented, OO)是软件开发方法。面向对象的概念和应用已超越了程序设计和软件开发,扩展到如数据库系统,交互式页面,应用平台,应用结构,分布式系统,网络管理结构,CAD技术,人工智能等领域。面向对象是一种对现实世界理解和抽象的方法,是计算机编程技术发展到一定阶段的产物。

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

    cnblog

    面向对象的三大特性:

    1. 封装

    隐藏对象的属性和实现细节,仅对外提供公共访问,将变化隔离,便于使用,提供复用性和安全性。

    封装就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐蔽。一个类就是一个封装了数据以及操作这些数据的代码的逻辑实体。在一个对象内部,某些代码或某些数据可以是私有的,不能被外界访问。通过这种方式,对象对内部数据提供了不同级别的保护,以防止程序中无关的部分意外的改变或错误的使用了对象的私有部分。

    即,将属性和方法封装在一个类里,对可信的类或对象可以操作,不可信的进行隐藏,外部不会改变该类的私有变量。

    2. 继承

    提供了代码复用性;继承是多态的前提。

    继承,指可以让某个类型的对象获得另一个类型的对象的属性的方法。它支持按级分类的概念。继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。通过继承创建的新类称为“子类”或“派生类”,被继承的类称为“基类”,“父类”或“超类”。继承的过程,就是一般到特殊的过程。要实现继承,可以通过“继承”(Inheritance)和“组合”(Composition)来实现。继承概念的实现方式有二类:实现继承和接口继承。实现继承是指直接使用基类的属性和方法而无需额外编码的能力;接口继承是指仅使用属性和方法的名称,但是子类必须提供实现的能力。

    继承:一个类可以继承另一个类的属性和方法,不用重新实现(实现继承)。也可以只继承属性名和方法名,并重新实现(接口继承)。

    3. 多态

    父类或接口定义的引用变量可以指向子类或具体实现类的实例对象。提高了程序的扩展性。

    多态,是指一个类实例的相同方法在不同情形有不同表现形式。多态机制使具有不同内部结构的对象可以共享相同的外部接口。这意味着,虽然针对不同对象的具体操作不同,但通过一个公共的类,它们(那些操作)可以通过相同的方式予以调用。

    多态:一个类实例的同一个方法在不同情形下可以有不同的表现形式,代码提高了扩展性

    五大基本原则:

    1. 单一职责原则(Single Responsibility Principle)

    类的功能要单一,不能包罗万象。如同一个人一样,分配的工作不能太多,否则一天到晚虽然忙碌,效率缺高不起来

    2. 开放封闭原则(Open-Close Principle)

    一个模块对于拓展是开放的,对于修改是封闭的,可以增加功能,不能修改。比如一个网络模块,原来只有服务端功能,而现在要加入客户端功能,那么应当在不修改服务器端功能代码的前提下,就能增加客户端的实现代码,这要求在设计之初,就应当将服务器端和客户端分开,公共部分抽象出来。

    3. 里式替换原则(the Liskov Substitution Priciple LSP)

    子类可以替换父类出现在父类能够出现的任何地方。比如你能代表你爸去你姥姥家干活。

    4. 依赖倒置原则(the Dependency Inversion Principle DIP)

    高层次的模块不能依赖低层次的模块,它们都应该依赖于抽象,抽象不应该依赖于具体实现,具体实现应该依赖于抽象。

    5. 接口分离原则(the Interface Segregation Principle ISP)

    设计时采用多个与特定客户类有关的接口比采用一个通用的接口要好。就比如一个手机拥有打电话,看视频,玩游戏等功能,把这几个功能拆分成不同的接口,比在一个接口里要好的多。

    模块间要通过抽象接口隔离开,而不是通过具体的类强耦合起来。

    面向对象的特点

    对象就是现实世界存在的任何事务都可以称之为对象,有着自己独特的个性

    csnd

    1. 属性:用来描述,某个对象的特征。面向对象的思想就是把一切都看成对象,而对象一般是由属性和方法组成的。属性属于对象静态的一面,用来形容对象的一些特性。

    2. 方法:方法属于对象动态的一面。比如,说话,跑,跳这些行为就是对象的方法。

    3. 类:具有同种属性的对象称为类,是个抽象的概念。类相当于一个模具,它定义了所包含全体对象的公共特征和功能,对象就是类的一个实例化,比如胡歌就是人的一个实例化。

    面向对象与面向过程的优缺点

    1. 面向过程:

    优点:性能比面向对象高,因为类调用的时候需要实例化,开销比较大,比较消耗资源。比如单片机,嵌入式开发,Linux/Unix等一般采用面向过程开发,性能是最重要的因素。

    缺点:没有面向对象易维护,易复用,易扩展

    2. 面向对象:

    优点:易维护,易复用,易扩展。面向对象有封装,继承,多态的特性,可以设计出低耦合的系统,是系统更加灵活,更加易于维护。

    缺点:性能比面向过程低

    耦合

    简单地说,软件工程中对象之间的耦合度就是对象之间的依赖性。指导使用和维护对象的主要问题是对象之间的多重依赖性。对象之间的耦合度越高,维护成本越高。因此对象的设计应使类和构件之间的耦合最小。耦合有软硬件之间的耦合,还有软件各模块之间的耦合。

    耦合性是程序结构中各个模块之间相互关联的度量。它取决于各个模块之间的接口的复杂程度,调用模块的方式以及哪些信息通过接口。

    耦合可以分为以下几种,他们之间的耦合度由高到低排列如下:

    1. 内容耦合:当一个模块直接修改或操作另一个模块的数据时,或一个模块不通过正常入口而转入另一个模块时,这样的耦合被称为内容耦合。内容耦合是最高程度的耦合,应该避免使用。

    2. 公共耦合:两个或两个以上的模块共同引用一个全局数据项,这种耦合被称为公共耦合。在具有大量公共耦合的结构中,确定究竟是哪个模块给全局变量赋了一个特定的值是十分困难的。

    3. 外部耦合:一组模块都访问同一全局简单变量而不是同一全局数据结构,而且不是通过参数表传递该全局变量的信息,则称之为外部耦合。

    4. 控制耦合:一个模块通过接口向另一个模块传递一个控制信号,接受信号的模块根据信号值而进行适当的动作,这种耦合被称为控制耦合。

    5. 标记耦合:若一个模块A通过接口向两个模块B和C传递一个公共参数,那么称模块B和模块C之间存在一个标记耦合。

    6. 数据耦合:模块之间通过参数来传递数据,那么被称为数据耦合。数据耦合是最低的一种耦合形式,系统中一般都存在这种类型的耦合,因为为了完成一些有意义的功能,往往需要将某些模块的输出数据作为另一些模块的输入数据。

    7. 非直接耦合:两个模块之间没有直接关系,它们之间的联系完全是通过主模块的控制和调用来实现的。

    总结:耦合是影响软件复杂程度和设计质量的一个重要因素,在设计上我们应采用以下原则:如果模块间必须存在耦合,就尽量使用数据耦合,少用控制耦合,限制公共耦合的范围们尽量避免使用内容耦合。

    内聚和耦合

    内聚标志一个模块之间各个元素彼此结合的紧密程度,它是信息隐蔽和局部化概念的自然扩展。内聚是从功能角度来度量模块内的联系,一个好的内聚模块应当恰好做一件事。它描述的是模块内的功能联系。

    耦合是软件结构中各模块之间相互连接的一种度量,耦合强弱取决于模块间接口的复杂程度,进入或访问一个模块的点以及通过接口的数据。程序讲究的是低耦合,高内聚。就是同一模块内的各个元素之间要高度紧密,但是各个模块之间的相互依存度却要不那么紧密。

    内聚和耦合是密切相关的,同其他模块存在高耦合的模块意味着低内聚,而高内聚的模块意味着该模块同其他模块之间是低耦合。在进行软件设计时,应当争做高内聚,低耦合。

    csnd

    参考链接

    https://www.jianshu.com/p/7a5b0043b035

    https://www.cnblogs.com/corvoh/p/5747856.html

    https://blog.csdn.net/jerry11112/article/details/79027834


    简述private, protected, public修饰符的访问权限

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

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

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

    堆和栈的区别

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

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

    XML和HTML的主要区别

    1. 作用不同:

    (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将成为最普遍的数据处理和数据传输的工具。

    2. 标记不同:

    (1). html使用固有的标记,而xml没有固有的标记。

    (2). html标签是预定义的,xml标签是自定义的,可扩展的。

    3. 语法要求不同:

    (1). 在html中不区分大小写,在xml严格区分

    (2). 在html中,有时不严格,如果上下文清楚地显示出段落或者列表键在何处结尾,那么可以省略结束标记。在xml中,是严格的树状结构,绝对不能省略掉结束标记。

    (3). 在xml中,拥有单个标记而没有匹配的结束标记的元素必须用一个"/"字符作为结尾。这样分析器就知道不用查找结束标记了。

    (4). 在xml中,属性值必须分装在引号中。在html中,引号是可用可不用的。

    (5). 在html中,可以拥有不带值的属性名。在xml中,所有的属性都必须带有相应的值。

    (6). 在xml文档中,空白部分不会被解析器自动删除;但是html是过滤掉空格的。

    相关文章

      网友评论

          本文标题:PHP面试题6--面向对象基础

          本文链接:https://www.haomeiwen.com/subject/yyoxsltx.html