目录
1.什么是面向对象?主要特征是什么?
2、简述面对对象六大设计原则 ?
3、PHP 面对对象设计OOP具有三大特点 ?
4、PHP支持多继承吗?
5、请解释PHP中的MVC是什么?
6、请解释PHP中的抽象类和接口的区别是什么?
7、请解释PHP中的命名空间是什么?
8、请解释PHP中的自动加载是什么
9、请解释PHP中的闭包是什么?
10、常用的魔术方法有哪些?举例说明
11.php有哪些设计模式
12、什么是构造函数,什么是析构函数,作用是什么?
13.$this和self、parent这三个关键词分别代表什么?在哪些场合下使用?
14、请解释PHP中的trait是什么?
15、请解释PHP中的反射是什么?
16、请解释PHP中的SPL是什么?
17、PHP子类如何调用父类构造方法 ?
18、简述作用域操作符::如何使用?都在哪些场合下使用?
19、简述PHP面向对象接口和使用场景
20、简述PHP Static和Final 关键字与使用场景 ?
21、请解释PHP中的SOLID原则是什么?
22、简述 private、 protected、 public修饰符的访问权限 ?
面向对象是程序的一种设计方式,它利于提高程序的重用性,使程序结构更加清晰。主要特征:封装、继承、多态。
面向对象六大设计原则是一组指导软件设计的原则,它们有助于提高代码的可维护性、可扩展性和可重用性。这些原则是: 单一职责原则(Single Responsibility Principle,SRP): 一个类应该只有一个引起它变化的原因。 换句话说,一个类应该只有一个职责,只负责一件事情。 开放封闭原则(Open-Closed Principle,OCP): 软件实体(类、模块、函数等)应该对扩展开放,对修改封闭。这意味着当需要添加新功能时,应该通过扩展现有代码来实现,而不是修改原有代码。 里氏替换原则(Liskov Substitution Principle,LSP): 子类应该能够替换父类并且不会破坏程序的正确性。换句话说,任何可以使用父类对象的地方,都应该能够使用子类对象,而不会产生意外的结果。 依赖倒置原则(Dependency Inversion Principle,DIP): 高层模块不应该依赖于低层模块,而是应该依赖于抽象。具体而言,应该通过接口或抽象类来定义依赖关系,而不是直接依赖于具体实现。 接口隔离原则(Interface Segregation Principle,ISP): 客户端不应该强迫依赖于它们不需要的接口。换句话说,应该将接口细化为更小的接口,以便客户端只需要依赖于它们实际需要的方法。 迪米特法则(Law of Demeter,LoD): 一个对象应该只与其直接的朋友进行交互,不应该与陌生人进行交互。换句话说,一个对象应该尽量减少与其他对象的依赖关系,尽量只依赖于自己的直接关系。 这些设计原则提供了一种指导软件设计的方法,帮助开发人员写出高质量、可维护的代码。
PHP面向对象设计(OOP)具有以下三大特点: 封装(Encapsulation):封装是指将对象的属性(数据)和行为(方法)封装在一起,形成一个独立的、可复用的对象。通过封装,可以隐藏对象的内部实现细节,只暴露必要的接口给外部使用。这样可以提高代码的安全性、可维护性和可重用性。 继承(Inheritance):继承是指一个类可以继承另一个类的属性和方法。通过继承,可以创建一个新的类,继承已有类的属性和方法,并且可以在新的类中添加额外的属性和方法。继承可以实现代码的重用,减少代码的冗余,同时也方便了代码的扩展和维护。 多态(Polymorphism):多态是指同一种操作可以在不同的对象上有不同的行为。在面向对象编程中,多态通过继承和接口实现。多态可以提高代码的灵活性和可扩展性,使代码更加通用和易于维护。 这三个特点是面向对象编程的基石,它们使得代码更加模块化、可维护性更高、可重用性更好,并且能够更好地应对复杂的业务逻辑和需求变化。在PHP中,面向对象编程可以通过类、对象、属性、方法、继承、接口等语言特性来实现。
PHP 不直接支持多继承。多继承是指一个类可以同时继承多个父类的属性和方法。然而,PHP通过使用接口(interface)和特质(trait)来模拟多继承的部分功能。 接口(interface):接口是一种抽象的类,其中只定义了方法的签名而没有具体的实现。一个类可以实现多个接口,从而获得多个接口中定义的方法。接口允许一个类具备多个接口的行为,但并不提供属性的继承。 特质(trait):特质是一种可以被多个类共享的代码块。类可以通过使用特质来复用特定的方法集合。一个类可以使用多个特质,并且特质可以相互组合。特质允许一个类具有多个特质中定义的方法和属性。 通过接口和特质的组合,可以在 PHP 中模拟多继承的部分功能。但需要注意的是,PHP 的多继承模拟并不像一些其他编程语言中的原生多继承那样简单和直接。在使用接口和特质时,需要谨慎设计和管理类的继承关系,以避免引入复杂性和冲突。
MVC(Model-View-Controller)是一种软件架构模式,用于将应用程序分为三个部分:模型(Model)、视图(View)和控制器(Controller)。 模型用于处理数据业务逻辑,视图用于显示数据,控制器用于处理用户请求和调用模型和视图。
抽象类和接口都是用于实现代码重用和多态性,但它们的实现方式不同。 抽象类可以包含非抽象方法和属性,而接口只能包含常量和抽象方法。 另外,类只能继承一个抽象类,但可以实现多个接口。
命名空间是一种用于避免命名冲突的机制,它可以将类、函数和常量分组到不同的命名空间中,以便于管理和使用。在PHP中,命名空间使用namespace关键字定义,并且可以在同一个文件中定义多个命名空间。
自动加载是一种机制,使得在使用类时可以自动加载类的定义文件,而无需使用require或include语句手动加载。 在PHP中,可以使用spl_autoload_register函数注册自己的自动加载函数, 当使用未定义的类时,PHP会调用自动加载函数来加载对应的类定义文件。
闭包是一种特殊的函数,可以在函数内部创建一个独立的作用域,以保护变量不受外部环境的影响。 在PHP中,闭包使用匿名函数实现,并且可以作为函数参数或返回值使用。
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复制一个对象时候调用
策略模式、工厂模式、单例模式、注册模式、适配器模式 策略模式:将一组特定的行为和算法封装成类,以适应某些特定的上下文环境,针对男性女性用户要各自跳转到不同的商品类目,并且所有的广告位展示不同的广告 单例模式:单例模式生成一个对象后, 该对象可以被其它众多对象所使用,使某个类的对象仅允许创建一个。构造函数private修饰,申明一个static getInstance方法,在该方法里创建该对象的实例。如果该实例已经存在,则不创建。比如只需要创建一个数据库连接。 工厂模式:工厂方法或者类生成对象,而不是在代码中直接new。使用工厂模式,可以避免当改变某个类的名字或者方法之后,在调用这个类的所有的代码中都修改它的名字或者参数。 注册模式:解决全局共享和交换对象。已经创建好的对象,挂在到某个全局可以使用的数组上,在需要使用的时候,直接从该数组上获取即可。将对象注册到全局的树上。任何地方直接去访问。 适配器模式:将各种截然不同的函数接口封装成统一的API。 PHP中的数据库MySQL,MySQLi,PDO三种,可以用适配器模式统一成一致,使 不同的数据库操作,统一成一样的API。类似的场景还有cache适配器,可以将memcache,redis,file,apc等不同的缓存函数,统一成一致。
构造函数(方法)是对象创建完成后第一个被对象自动调用的方法。它存在于每个声明的类中,是一个特殊的成员方法。作用是执行一些初始化的任务。Php中使用__construct()声明构造方法,并且只能声明一个。 析构函数(方法)作用和构造方法正好相反,是对象被销毁之前最后一个被对象自动调用的方法。是PHP5中新添加的内容作用是用于实现在销毁一个对象之前执行一些特定的操作,诸如关闭文件和释放内存等。
$this 当前对象 self 当前类 parent 当前类的父类 $this在当前类中使用,使用->调用属性和方法。 self也在当前类中使用,不过需要使用::调用。 parent在类中使用。
trait是一种PHP机制,用于实现代码重用和多继承。trait可以定义一组方法和属性,然后在类中使用use关键字来引入trait。引入trait的类可以使用trait中定义的方法和属性,就像自己定义的一样。
反射是一种PHP机制,用于动态获取和操作类和对象的信息。在PHP中,可以使用Reflection类和一组相关的类来获取类和对象的属性、方法和注释等信息,也可以动态创建类和对象,以及调用对象的方法和属性。
SPL(Standard PHP Library)是一组PHP标准库,用于提供一些数据结构和算法的实现,以便于开发者快速地实现一些复杂的功能。SPL包含了一些常用的接口和类,例如迭代器、堆栈、队列、链表和排序算法等。
在 PHP 中,子类可以通过使用 parent::__construct() 方法来调用父类的构造方法。这个方法可以在子类的构造方法中使用,用于执行父类的构造方法。 下面是一个示例代码:
class ParentClass { public function __construct() { echo "ParentClass 构造方法被调用"; } } class ChildClass extends ParentClass { public function __construct() { parent::__construct(); // 调用父类的构造方法 echo "ChildClass 构造方法被调用"; } } $child = new ChildClass();
1、作用域操作符 :: 在 PHP 中用于访问类的常量、静态属性和静态方法。它的使用方式如下: 访问类的常量:使用 类名::常量名 的语法来访问类的常量。常用于获取类的配置信息或者定义一些全局常量。例如:class MyClass { const MY_CONSTANT = 123; } echo MyClass::MY_CONSTANT; // 输出:123
2、访问静态属性:使用
类名::$静态属性名
的语法来访问类的静态属性。静态属性是类的属性,不依赖于类的实例化,可以在任何地方访问。例如:class MyClass { public static $myProperty = "Hello"; } echo MyClass::$myProperty; // 输出:Hello
3、调用静态方法:使用
类名::静态方法名()
的语法来调用类的静态方法。静态方法是类的方法,不依赖于类的实例化,可以直接通过类名调用。例如:class MyClass { public static function myMethod() { echo "Hello"; } } MyClass::myMethod(); // 输出:Hello
作用域操作符 :: 主要在以下场合下使用:
访问类的常量:通过类名访问类的常量,而不需要实例化类对象。
访问静态属性:通过类名访问类的静态属性,而不需要实例化类对象。
调用静态方法:通过类名调用类的静态方法,而不需要实例化类对象。 在这些场合下,作用域操作符 :: 提供了一种直接访问和调用类的静态成员的方式,方便在不实例化对象的情况下进行操作。
在 PHP 中,接口是一种抽象的定义,它规定了一个类应该具有的方法。一个类可以实现一个或多个接口,通过实现接口中定义的方法,来实现对接口的约束和规范。接口使用 interface 关键字来定义。 接口的使用场景包括:
规范类的行为:接口可以定义一组方法,用于规范类的行为。当一个类实现了某个接口,就表示该类具有了接口中定义的方法,从而实现了对行为的规范。
多态性:接口可以作为类型来使用。当一个类实现了某个接口,就可以将该类的实例赋值给接口类型的变量,实现多态性。这样可以在不关心具体类的情况下,统一对不同类的实例进行操作。
代码复用和扩展:接口提供了一种约定,要求实现类必须实现接口中定义的方法。通过接口,可以将一些通用的方法定义在接口中,然后多个类实现该接口,实现代码的复用。当需要增加新的功能时,只需要在接口中新增方法,而不需要修改已有的类。
与其他代码的解耦:接口可以用于解耦代码之间的依赖关系。通过面向接口的编程,可以将接口定义的方法作为公共接口,不同的类实现该接口,从而降低类与类之间的耦合度。 以下是一个使用接口的示例interface Animal { public function eat(); public function sleep(); } class Cat implements Animal { public function eat() { echo "Cat is eating"; } public function sleep() { echo "Cat is sleeping"; } } class Dog implements Animal { public function eat() { echo "Dog is eating"; } public function sleep() { echo "Dog is sleeping"; } } $cat = new Cat(); $dog = new Dog(); $cat->eat(); // 输出:Cat is eating $dog->eat(); // 输出:Dog is eating
在上述示例中,
Animal
是一个接口,定义了eat()
和sleep()
两个方法。Cat
和Dog
类都实现了Animal
接口,并实现了接口中定义的方法。通过接口,可以统一对不同类的实例进行操作,实现了多态性和代码的复用。
在 PHP 中,static 和 final 是两个关键字,用于修饰类的属性、方法和常量。它们的使用场景如下:
static 关键字:
静态属性:使用 static 关键字声明的属性是类属性,而不是实例属性。它们不依赖于类的实例化,可以在任何时候访问。静态属性可以用于保存类的共享数据或者全局配置信息。
静态方法:使用 static 关键字声明的方法是类方法,而不是实例方法。它们不依赖于类的实例化,可以直接通过类名调用。静态方法可以用于执行与类相关的操作,而不需要创建类的实例。
静态常量:使用 const 关键字声明的常量是类的常量,可以通过 类名::常量名 的方式访问。静态常量一般用于定义一些固定不变的值,例如配置信息或者标识符。
final 关键字:
final 类:使用 final 关键字声明的类是最终类,不能被继承。当一个类不希望被其他类继承时,可以将该类声明为 final 类。
final 方法:使用 final 关键字声明的方法是最终方法,不能被子类重写。当一个类的某个方法不希望被子类重写时,可以将该方法声明为 final 方法。 使用场景:
static 关键字的使用场景:
静态属性:用于保存类的共享数据或者全局配置信息。
静态方法:用于执行与类相关的操作,而不需要创建类的实例。
静态常量:用于定义一些固定不变的值,例如配置信息或者标识符。
final 关键字的使用场景:
final 类:用于禁止其他类继承该类,保护类的完整性和稳定性。
final 方法:用于禁止子类重写该方法,确保方法的一致性和稳定性。 需要注意的是,static 和 final 关键字是可选的,根据实际需求来决定是否使用。在使用时,需要根据具体的业务场景和设计需求来合理应用这两个关键字。
SOLID原则是一组面向对象编程的设计原则,可以帮助开发人员编写可维护、可扩展和可重用的代码。SOLID原则包括单一职责原则、开闭原则、里氏替换原则、接口隔离原则和依赖反转原则。
private、protected和public是面向对象编程中常用的访问修饰符,用于控制类的成员(属性和方法)的访问权限。 private修饰符:private表示私有的,只能在当前类内部访问。私有成员对于类外部是不可见的,其他类无法直接访问私有成员。私有成员主要用于封装类的内部细节,提高封装性和安全性。 protected修饰符:protected表示受保护的,可以在当前类和其子类中访问。受保护成员对于类外部是不可见的,但对于子类是可见的。受保护成员主要用于实现继承和多态,子类可以通过继承父类的受保护成员来访问和使用。 public修饰符:public表示公共的,可以在任何地方访问。公共成员对于所有类都是可见的,其他类可以直接访问公共成员。公共成员主要用于提供给外部调用的接口,使其它类可以访问和使用。 通过使用这些修饰符,可以灵活地控制类的成员的访问权限,实现封装、继承和多态的特性,同时也可以提高代码的可维护性和可扩展性。正确使用这些修饰符可以帮助我们设计出更加健壮和灵活的面向对象的代码。