PHP面向对象

深藏阁楼爱情的钟 2021-12-18 06:45 447阅读 0赞

【面向对象】

1. $this 的使用:

( 1 ) $this 是这个对象的地址

( 2 )哪个对象使用到 $this, 就是哪个对象地址

( 3 ) $this 不能在类外部使用 .

  1. 构造函数 __construct 和析构函数都没有返回值; 析构函数不能传参数。

    一旦一个对象成为垃圾对象(没有任何变量引用的对象,或者 =null ),析构函数 __destruct 就会立即调用。

  2. 全局变量 global $a 在程序中都可以使用的变量(非面向对象)。

  3. 静态变量 public static $a, [ 类外访问 ] 类名 ::$a ; [ 类内访问 ] 类名 ::$a 或者 self::$a

  4. 静态方法 public static function static_func_name(){ } ,

    静态方法只能操作静态变量;非静态方法既可以操作静态变量,也可以操作非静态变量 。

[类外访问] 类名:: static_func_name(); 或者 对象名-> static_func_name();

[类内访问] 类名:: static_func_name() 或者 self:: static_func_name()

  1. 关于访问修饰符: public (全局、继承类、本类); protected (继承类、本类); private (本类)。

  2. 继承 extends :子类默认不会调用父类的构造函数。

    [ 子类访问父类的方法(包括构造函数) ] 父类 :: 方法名 () ; 或者 parent:: 方法名 () ;

    如果子类的方法和父类方法相同,称为 方法重写 (或者叫:方法覆盖)。

    多态 的体现:当子类没有覆盖父类的方法则调用父类的方法 , 当子类覆盖了父类的方法,则调用自己的方法。

  3. 抽象类(可以是 public/protected/private )和抽象方法是当父类的一些方法不能确定时会用到。

    抽象类 abstract class Obj{} ;

    抽象方法不能有方法体

abstract public function func_name(param1,…);

抽象类中可以没有抽象方法,但是抽象方法必须存在于抽象类中!

如果 A1 类继承了一个抽象类 A ,则要求 A1 类实现从 A 类继承的所有抽象方法

  1. 接口(更加抽象的抽象类,接口的方法都不能有方法体且必须是 public ,不能去实例化接口)。

interface iJK{},class 类名 implements iJK,iJK2{}。

接口中可以有属性 , 但是必须是常量 , 并且是 public 。

interface iUsb{ const A=90; //如果是 $a=90; 就会出错 } //要取到属性:iUsb::A;

一个接口不能继承其他的类,但是可以继承别的接口。

一个接口可以继承多个其它的接口 . 当一个类去实现了某些接口 , 则必须把所有接口的方法都实现。

一个类可以同时继承他的父类,而且实现接口:

class A1 extends A implements iUsb2,iUsb3{…}

11.final 关键字:修饰类 或者 方法,不能修饰属性。

① 希望某个类不能被继承: final class A{}

② 希望某个方法不能被子类重载(改写): class A{ final public function func_name(){} }

12.const 关键字:类中的常量。

class 类名{const 常量名(大写)= 赋初值; }

interface 接口名{const 常量名(大写)= 赋初值;}

[调用方法]类名::常量名; 接口名::常量。在类的内部也可以使用 self::常量。

  1. 使用 instanceof 检测当前对象是否属于一个类的实例,返回布尔。 print_r($a instance A);

    get_class () 函数返回对象所属类的名字,如果不是对象则返回 false 。

面向对象设计的五大原则(23种设计模式的基础):

①单一职责原则:[含义]避免相同的职责分散到不同的类中;避免一个类承担太多职责。[好处]减少类之间的耦合;提高类的复用性。[实际应用]工厂模式 允许在代码执行时实例化对象(例如:连接多个数据库、解决SNS动态实现);命令模式 分离“命令的请求者”和“命令的实现者”方面的职责。

②接口隔离原则:一个类对另外一个类的依赖性应当是建立在最小的接口上的;客户端程序不应该依赖它不需要的接口方法(功能),而是依赖它所需要的接口。

③开放与封闭原则:在设计方面充分应用“抽象”和“封装”的思想;在系统功能编程实现方面应用接口interface的编程。

④里氏替换原则:每个较高层次类都为它所需要的服务提出一个接口声明,较低层次类实现这个接口;每个高层类都通过该抽象接口使用服务。

⑤依赖倒置原则。

private、protected、public、final 区别

public:权限是最大的,可以内部调用,实例调用等。

protected: 受保护类型,用于本类和继承此类的子类调用。

private: 私有类型,只有在本类中使用。

static:静态资源,可以被子类继承。

abstract:修饰抽象方法,没有方法体,由继承该类的子类来实现。

final:表示该变量、该方法已经“完成”,不可被覆盖。修饰类时该类不能被继承。

(因此final和abstract不能同时出现)

抽象类、接口

接口通常是为了抽象一种行为,接口是一种规范,在设计上的意义是为了功能模块间的解耦,方便后面的功能扩展、维护,接口不能有具体的方法;

抽象类可以有具体的方法,也可以有抽象方法,一旦一个类有抽象方法,这个类就必须声明为抽象类,很多时候是为子类提供一些共用方法;

所以,抽象类是为了简化接口的实现,他不仅提供了公共方法的实现,让你可以快速开发,又允许你的类完全可以自己实现所有的方法,不会出现紧耦合的问题。

1 优先定义接口

2 如果有多个接口实现有公用的部分,则使用抽象类,然后集成它。

Trait 是什么东西

Trait为不支持多继承的php实现了多继承,使用时不是用extends继承,而是在类内部用 use 类名 表示。

设计模式六大原则:

开放封闭原则:一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。

里氏替换原则:所有引用基类的地方必须能透明地使用其子类的对象.

依赖倒置原则:高层模块不应该依赖低层模块,二者都应该依赖其抽象;抽象不应该依赖细节;细节应该依赖抽象。

单一职责原则:不要存在多于一个导致类变更的原因。通俗的说,即一个类只负责一项职责。

接口隔离原则:客户端不应该依赖它不需要的接口;一个类对另一个类的依赖应该建立在最小的接口上。

迪米特法则:一个对象应该对其他对象保持最少的了解。

【设计模式】

策略模式,实现步骤:

1.定义抽象角色类(定义好各个实现的共同抽象方法)

2.定义具体策略类(具体实现父类的共同方法)

3.定义环境角色类(私有化申明抽象角色变量,重载构造方法,执行抽象方法)

工厂模式:

使用工厂模式的好处是,如果你想要更改所实例化的类名等,则只需更改该工厂方法内容即可,不需逐一寻找代码中具体实例化的地方(new处)修改了。为系统结构提供灵活的动态扩展机制,减少了耦合。

单例模式:

单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。有以下3个特点:

只能有一个实例;必须自行创建这个实例;必须给其他对象提供这一实例。

注册模式:

解决全局共享和交换对象。已经创建好的对象,挂在到某个全局可以使用的数组上,在需要使用的时候,直接从该数组上获取即可。将对象注册到全局的树上。任何地方直接去访问。

适配器模式:

将各种截然不同的函数接口封装成统一的API。 PHP中的数据库操作有MySQL,MySQLi,PDO三种,可以用适配器模式统一成一致,使不同的数据库操作,统一成一样的API。类似的场景还有cache适配器,可以将memcache,redis,file,apc等不同的缓存函数,统一成一致。

观察者模式:

观察者模式(Observer),当一个对象状态发生变化时,依赖它的对象全部会收到通知,并自动更新。

场景:

一个事件发生后,要执行一连串更新操作。传统的编程方式,就是在事件的代码之后直接加入处理的逻辑。

当更新的逻辑增多之后,代码会变得难以维护。这种方式是耦合的,侵入式的,增加新的逻辑需要修改事件的主体代码。

观察者模式实现了低耦合,非侵入式的通知与更新机制。

类的组合与继承:

  1. 继承和多态都是对类进行复用,继承是类级别的复用,多态是方法级别的复用。

  2. 子类继承父类的属性和方法,称为继承。

  3. 在继承中,用parent指代父类,用self指代自身,用“:” 运算符(范围解析操作符)调用父类的方法。

  4. 静态:如果声明类成员或方法为static,就可以不实例化类而直接访问,也不能用“:”访问一个非静态方法,如果这样会导致E_STRICT 级别的错误。php.ini: error_reporting=E_ALL | E_STRICT display_errors=On

5.继承最大的优点是扩展简单,但是其缺点大于优点。一般继承树不要多于三层。若要禁止被继承,使用final修饰符。

接口 interface:

  1. PHP 中接口的语义是有限的,使用接口的地方并不多,可以更多的使用抽象类。

  2. SPL(标准PHP库),实现一些接口,最主要的就是iterator迭代器接口。

  3. toString方法就是接口的一种变相实现;Traits可以被视为一种加强型的接口。

  4. 接口只是一个声明,一旦使用interface关键字,就应该实现它。

PHP抽象类和接口的区别:

1.对接口的继承使用implements,抽象类使用extends.

2.接口中不可以声明变量,但可以声明类常量.抽象类中可以声明各种变量

3.接口没有构造函数,抽象类可以有

4.接口中的方法默认为public,抽象类中的方法可以用public,protected,private修饰

5.一个类可以继承多个接口,但只能继承一个抽象类

6.抽象类中可以有非抽象的方法而接口中只能够有抽象的方法

反射 ReflectionClass:

1.使用class函数返回对象属性的关联数组:

get_object_vars($obj); //返回对象属性的关联数组

echo get_class($obj); //获取对象属性列表所属的类

get_class_vars(get_class($obj)); //类属性

get_class_methods(get_class($obj)); //返回由类的方法名组成的数组

  1. 反射完整的描述了一个类或者对象的原型,不仅可以用于类和对象,还可以用于函数、扩展模块、异常。

  2. 反射的消耗很大,能找到替代方案的情况下就不要滥用。

魔术方法:

防止获取一个不存在的属性报错,使用 __set($name, $value) 和 __get($name)

防止调用一个不存在的方法报错,使用__call($name, $arguments)

__callStatic($name, $arguments) 同上,只是用于静态方法

把一个对象的实例当成一个字符串去执行 __toString()

把一个对象的实例当成一个函数去执行 __invoke()

魔术常量:

__LINE__; //当前的行数

__FILE__; //当前文件绝对路径及文件名

__DIR__; //当前文件绝对路径

__CLASS__;//当前的类名

__FUNCTION__; //当前的函数(方法)名

__METHOD__; //类的方法名

__NAMESPACE__; //命名空间

转载于:https://www.cnblogs.com/rxbook/p/10912951.html

发表评论

表情:
评论列表 (有 0 条评论,447人围观)

还没有评论,来说两句吧...

相关阅读

    相关 php面向对象

       js面向对象      类:具有相同特征的一些对象的集合;     对象:具体某一个事物了,都可以叫对象;     类:通过function定义的类,所以js里类的

    相关 面向对象PHP(四)

    <?php / 接口就是把不同类的共同行为进行了定义,然后在不同的类里面实现不同的功能。 因为接口的方法实现可以有很多,所以对于接口里面定义的方法的具体实现是多种多

    相关 面向对象PHP(二)

    <?php / 1.子类与父类方法相同可以对父类方法重写 2.如果不希望父类被重写,用final关键字修饰,可以修饰类中方法,也可以是一个类(该类所有方法均不能被重

    相关 php面向对象

    近一段时间有一种学习的强烈欲望,出现了经济危机啊。现在的工资连最基本的生活都不能保证啊,想尽快的摆脱现在的这种局面。 昨天晚上把PHP的面向对象编程的一些最基本的概念看了看。