当前位置: 首页 > 后端技术 > PHP

面向对象PHP面试内容(三)

时间:2023-03-29 18:22:02 PHP

PHP面试专栏正式上线,每周一、三、五更新,提供最优质最优质的PHP面试内容。继上一篇《PHP面试内容之面向对象(二)》发表后,今天更新最后一篇面向对象(三)。如果需要(1)和(2),可以直接点击文字跳转获取。PHP面试内容的面向对象内容(一)整篇面向对象文章的结构涉及的内容模块有:1、面向对象和面向过程的区别是什么?二、面向对象有什么特点?3.什么是构造函数和析构函数?4.什么是面向对象的作用域?5、PHP中有哪些神奇的方法?6.什么是对象克隆?7.this、self和parent有什么区别?8、抽象类和接口有什么区别和联系?9、PHP面向对象考试面试题解说关于PHP面向对象的内容将分三篇讲解完整版块内容。第一篇主要讲解一到四点的内容,第二篇主要讲解五到八点的内容,第三章的内容会围绕第九点进行讲解。以下文字内容来自《PHP程序员面试笔试真题解析》书籍,如需转载请保留出处:9.PHP面向对象常考面试题详解【真题1】什么是面向对象?它的主要特点是什么?答:面向对象是一种程序设计方法。它是一种理解和抽象现实世界的方法。可以提高程序的复用性,使程序结构更加清晰。面向对象的主要特点是:封装、继承、多态。【真题2】可以得到对象的类名的函数是()。A。get_class_nameB.get_classC.class_existsD.get_class_vars答案:B、PHP中获取对象的类名函数是get_class()。因此,选项B正确。对于选项A,该方法不存在。因此,选项A错误。对于选项C,class_exists()函数可以检查该类是否存在。因此,选项C错误。对于选项D,get_class_vars()函数可以获取类的默认属性。因此,选项D错误。所以,本题答案为B。【真题3】请简单说明一下PHP的垃圾回收机制。答:在PHP中,当没有变量指向对象时,对象就变成垃圾,会在内存中销毁,防止内存溢出。变量在内存中有一个引用计数,当计数为0时,变量就被销毁了。【真题4】多态和方法重写有什么关系?答:多态是指一个类可以被多个类继承,每个子类都可以重写父类的方法。每个类中的同名方法可以实现不同的功能,从而表现出多种形式。它增强了软件的灵活性和可重用性。覆盖是子类重写父类中的方法。他们的关系是重写使类多态。【真题5】面向对象的原则是什么?答:面向对象有五个基本原则,即:单一职责原则、开闭原则、替换原则、依赖原则、接口分离原则等。(1)单一职责原则所谓单一职责原则是指一个类应该只做一件事。为了提高内聚,减少变化,单体原则是面向低耦合高内聚原则的延伸。(2)开放封闭原则软件的功能应该是可扩展的,尽可能减少修改,因为对程序的修改可能会影响到原来的程序。虽然建议尽可能少地修改程序,但允许通过添加功能来减少修改。(3)替换原则只有子类才能替换基类。在继承机制的约束规范中,当子类替换基类时,可以保证子类在运行时的标识,保证继承的复用。(4)依赖倒置原则高层模块不依赖低层模块,两者都依赖抽象,抽象不依赖实体,实体依赖抽象。模块间依赖是通过抽象方法产生的,直接依赖不发生在实现类中,而是通过接口或抽象类产生依赖。即接口或抽象类不依赖于实现类,实现类依赖于接口和抽象类。这种依赖倒置原则可以有效降低类之间的耦合度,提高系统的稳定性,降低并发带来的风险,提高代码的可读性和可维护性。(5)接口隔离原则建议开发使用多个小的专用接口,避免使用大的通用接口。即每个函数都有一个专用的函数接口,只在需要的时候调用。没有必要将所有的功能都聚合到一个接口中,这样可以提高代码的灵活性,减少类之间的耦合,提高稳定性。【真题6】下列关于PHP高级特性的说法中,正确的是()。A。可以定义一个类来实现预定义接口Iterator,然后就可以像访问数组B一样访问这个类创建的对象。spl_autoload_register()提供了一种更灵活的方式来实现类的自动加载,不再是推荐使用_autoload()函数C.当PHP调用对象中不可访问的方法时,会自动调用invoke()方法D.匿名函数也称为闭包函数,常被用作回调函数的值参数,但不能作为变量的值答案:B.对于选项A,只有ArrayAccess可以提供像访问数组一样访问这个对象的接口,不能定义一个类或者预定义的接口Iterator来实现这个功能。因此,选项A错误。对于选项B,因为可以通过spl_autoload_register()函数创建一个autoload函数队列,按照定义的顺序一个一个执行,比只能定义一次的_autoload()函数方便,所以不建议使用_autoload()函数。因此,选项B正确。对于选项C,可以在创建类实例化后直接使用_call方法调用对象。当调用的方法不可访问或没有权限访问时,会自动调用_call方法。因此,选项C错误。对于选项D,可以将匿名函数分配给变量。因此,选项D错误。那么,本题答案为B。【真题7】__autoload()函数的工作原理是什么?答:使用这个神奇功能的基本条件是类文件的文件名必须和类名一致。当程序执行实例化某个类时,如果在实例化之前没有引入class文件,则自动执行__autoload()函数。该函数根据实例化的类名查找类的路径。一旦找到该类,就会通过执行include或require加载该类,从而保证程序能够继续执行。如果没有找到,报错。【真题8】下列关于PHP命名空间的说法中,错误的是()。A。要访问任何全局类、函数或常量,您可以使用完全限定名称,例如strlen()或Exception或INI_ALLB。关键字namespace可以用来显式访问当前命名空间或子命名空间中的元素,相当于C类中的this操作符。任何合法的PHP代码都可以包含在一个命名空间中,但只有三种代码是受命名空间影响的是类、函数、常量D.常量__NAMESPACE__的值是当前命名空间名称的字符串。如果是在全局的,那么它不包含命名空间中的任何代码,本身就是一个空字符串答案:B。namespace关键字用于声明一个命名空间,它不等同于this操作符的作用。因此,选项B不正确。所以,本题答案为B。【真题9】以下代码的结果为()。name="张三";$b=$a;$b->name="李四";echo$a->name;?>A.张三B.LiSiC.NullD.没有答案:B。首先,$a实例化Person类,将张三赋值给类中的变量名,将对象张三的值赋值给$b,用$b修改值类中的name为李四,所以最后输出Person类名,输出结果李四。因此,选项B正确,选项A、选项C、选项D错误。所以,本题答案为B。【真题10】下列说法不正确的是()。A。如果一个类的成员前面有访问修饰符private,那么这些成员就不能被继承并且在类之外是不可见的。但是如果成员被指定为protected和public,则可以在类B之外被继承和可见。在PHP5中,final关键字可以禁止继承和重载C。在PHP5中,析构函数的名字是__destruct(),它不能有任何参数D.继承接口的类必须实现接口中声明的所有方法。在PHP中,如果继承接口的类没有实现接口中的方法,就会产生致命错误。答案:A。对于选项A,private修饰的成员不能继承,protected的成员可以继承,但对外不可见。A选项表述错误,故A选项正确。B选项,final关键字的方法禁止被继承和重载。B选项的表述正确,故B选项错误。C选项,析构函数不能带参数,C选项正确,所以C选项错误。对于选项D,如果继承接口的类没有实现接口中的方法,就会报错。D选项的表述正确,故D选项错误。所以,这个问题的答案是A。我整理了一篇文章《6年个人编程经验——如何学好编程?》,关注公众号:《六一编程库》,回复:《学好》,我会发给你。【真题11】定义类成员的访问控制符号有哪些?默认修饰符是什么?答:类成员的访问修饰符有public、private和protected,主要用于修饰类中的成员属性和方法。public是一种公共类型,允许在类或子类内部使用,也可以在类外访问。private是私有类型,只能在类内部使用,不能被继承。protected是一种受保护的类型,只能在类的内部或子类中使用。如果不使用public、private、protected等关键字来修饰方法或属性,那么可以使用var关键字,它的作用与public相同,可以在类内或类外调用,也可以被继承.其中,PHP默认的修饰符是public,即公共类型。类前面只能加final和abstract关键字。final修饰的属性或方法不能被继承,只能在当前类中使用。abstract定义的类或方法称为抽象类或抽象方法。属性前:必须有访问修饰符(private、protected、public、var)。【真题12】PHP的神奇方法有哪些(越多越好)?什么情况下自动调用?答:PHP中可用的魔术方法在某些情况下会自动调用,但只有在某些条件被触发时才会被调用,并且这些魔术方法可以作为类中的方法使用。PHP的神奇方法有:1)_construct():构造函数,创建对象时自动调用。2)_destruct():析构函数,对象的所有引用被删除或在显式销毁对象时执行。3)__clone():调用clone方法时会自动调用clone函数。4)__set():当程序试图写入一个不存在或不可见的成员变量时自动调用。在类中定义函数时,必须有两个参数:变量名和变量值。5)__get():当程序调用未定义或不可见的成员变量时,自动调用__get()读取变量值。定义时必须有一个参数:变量名。6)__call():当程序试图调用一个不存在或不可见的成员方法时,自动调用__call()。__call()方法一般用于监控不正确的方法调用。为避免调用的方法不存在时出错,请使用__call()方法。该方法包含两个参数:方法名和方法参数。其中,方法参数以数组的形式存在。7)__sleep():使用serialize()实现序列化对象时,先调用该方法,可用于清空对象,返回对象中所有变量的数组。8)__wakeup():当使用unserialize()恢复序列化对象时,先执行该方法恢复序列化过程中可能丢失的数据库连接和相关工作。9)__toString():当使用echo或print输出对象时,将对象转换为字符串。10)__autoload():当调用一个还没有被实例化的类时,自动调用,在指定路径下查找与该类同名的文件。【真题13】$this、self、parent这三个关键字分别代表什么?在哪些场合使用?答:$this代表当前对象,在当前类中,可以通过->符号调用类中的属性和方法。self代表当前类,类内的方法只能通过self(“self::methodorattribute”)的形式调用。parent表示当前类的父类,父类中的方法只能以“parent::”的形式调用。【真题14】下面关于面向对象的描述中,错误的是()。A。父类的构造函数和析构函数不会被自动调用B.成员变量需要用public,protected,private修饰,定义变量时不再需要var关键字C.父类中定义的静态成员不能在子类中直接调用D。包含抽象方法的类必须是抽象类,抽象类不能被实例化答案:A。对于选项A,子类继承父类。如果子类没有构造函数和析构函数,则子类实例化时会自动调用父类的构造函数和析构函数;但是如果子类只有构造函数而没有析构函数,则在实例化子类时,会自动调用子类的构造函数,销毁对象时调用父类的析构函数;如果子类没有构造函数,只有析构函数,那么在实例化子类时,调用父类的构造函数,销毁对象时调用子类的析构函数。选项A不完整。因此,选项A正确。对于选项B,当成员变量定义为public、protected或private修饰时,不需要var关键字。B选项正确。因此,选项B错误。选项C,子类中不能直接访问父类中的静态成员,选项B正确。因此,选项C错误。选项D,包含抽象方法的类必须是抽象的,抽象类不能被实例化。D选项正确。因此,选项D错误。所以,这道题的答案是A。【真题15】在PHP中,如果派生类有一个与父类同名的函数,那么派生类的函数就会替换父类的函数。有如下程序代码:disName();?>上面代码for()的运行结果。A。tmpB.PicachuC.disNameD.哆啦A梦E.无输出答案:D.派生类继承父类时,如果通过实例化派生类的对象访问对象的方法,派生类中不存在父类中的方法,则派生类中的方法父类被执行。如果派生类和父类中存在同名方法,那么派生类的方法会覆盖父类的方法,执行派生类的方法。因此,在本题中,可以执行派生类的disName()方法。因此,选项D正确,选项A、选项B、选项C、选项E错误。所以,本题答案为D。【真题16】什么是抽象类和接口?抽象类和接口之间有什么区别和相似之处?答:被关键字abstract修饰的类称为抽象类,抽象类不能被实例化。abstract修饰的方法是抽象方法。只要一个类有一个抽象方法,这个类就一定是抽象类。接口通过关键字interface定义,可以指定一个类必须实现哪些方法,但不需要定义这些方法的具体实现。PHP类只支持单继承,但是可以通过接口实现PHP类的多继承。抽象类和接口之间的异同如下所示。1)抽象类是不能实例化的类,只能作为其他类的父类。2)通过关键字abstract来声明一个抽象类。3)抽象类与普通类的相似之处在于它包含成员变量和成员方法。两者的区别在于一个抽象类必须至少包含一个抽象方法。4)抽象方法没有方法体,方法要被子类重写。5)抽象方法的格式为:abstractfunctionabstractMethod()。6)因为PHP只支持单继承,如果要实现多继承,就必须使用接口。也就是说,子类可以实现多个接口。7)接口类通过interface关键字声明,接口类中的成员变量和方法都是public的,无需显式使用public即可修改。8)接口中的方法没有方法体。接口中的方法要被子类继承。9)子类使用extends关键字继承抽象类,子类使用implements关键字实现接口。【真题17】类编程实现:Stu类中有两个私有属性name和sex,还有两个public方法,setName()和setSex()参数可以自定义,方法可以修改这两个私有属性。实例化类时需要初始化私有属性。答:实现代码如下:name=$name;}publicfunctionsetSex($sex){$this->sex=$sex;}}?>【真题18】如果有一个类Person,并且实例化了一个对象$p(new),那么下面使用对象$p调用Person类中的getInfo方法,正确的是是()。A。$p=>getInfo();B.$this->getInfo();C。$p->getInfo();D.$p::getInfo();参考答案:C分析:“::”主要用于访问类中的静态成员,“->”主要用于访问类中的变量和方法,“=>”主要用于key和value数组中的映射。因此,选项A、选项B、选项D错误,选项C正确。【真题19】PHP中public、protected、private访问控制模式有什么区别?参考答案:PHP中public、protected、private访问控制模式的区别如下:访问模式描述的是public共享,protected继承可以在任何地方访问,并且只能在本类或子类中访问,而private不能在其他地方使用Private,只能在本类访问,不能在其他地方使用【真题20】在面向对象的PHP中,下面final修饰符的描述中,错误的是()。A。A.标有final的类不能被继承B.类中标有final的成员方法不能在子类中重写C.不能用final来标识成员属性D.final标识的成员属性不能在子类中再次定义.参考答案:D。分析:因为final只能修改类和方法,不能修改类的属性。因此,选项D错误。PS:由于真题较多,只列出PHP面向对象笔试中经常遇到的20道题!本周到目前为止(2019-2-11到2019-2-15)面向对象的话题已经更新完毕。以上内容只是PHP面向对象中最常测试的内容。个别未列出的内容可从原书中获取。)感谢支持!通知:下周(2019-2.18-2.22)更新主题《PHP面试内容之Memcache与Redis缓存》,敬请期待。以上内容节选自本书《PHP程序员面试笔试真题解析》,已在天猫、京东、当当网等电商平台销售。更多PHP相关面试知识和考题,请关注公众号获取:六一编程库本文有任何问题或建议可以留言,我们会不断改进,追求完美。感谢您的支持。