PHP面向对象

【面向对象】

1. $this的使用:
1$this 是这个对象的地址
2)哪个对象使用到$this, 就是哪个对象地址
3$this不能在类外部使用.
2.构造函数 __construct 和析构函数都没有返回值;析构函数不能传参数。
一旦一个对象成为垃圾对象(没有任何变量引用的对象,或者=null),析构函数 __destruct就会立即调用。
3.全局变量 global $a 在程序中都可以使用的变量(非面向对象)。
4.静态变量 public static $a,[类外访问]类名::$a; [类内访问]类名::$a或者 self::$a
5.静态方法 public static function static_func_name(){ }
静态方法只能操作静态变量;非静态方法既可以操作静态变量,也可以操作非静态变量
[类外访问] 类名:: static_func_name(); 或者 对象名-> static_func_name();
[类内访问] 类名:: static_func_name() 或者 self:: static_func_name()
6.关于访问修饰符:public(全局、继承类、本类);protected(继承类、本类);private(本类)。
7.继承 extends:子类默认不会调用父类的构造函数。
[子类访问父类的方法(包括构造函数)]父类::方法名(); 或者 parent::方法名();
如果子类的方法和父类方法相同,称为 方法重写(或者叫:方法覆盖)。
多态的体现:当子类没有覆盖父类的方法则调用父类的方法,当子类覆盖了父类的方法,则调用自己的方法。
9.抽象类(可以是public/protected/private)和抽象方法是当父类的一些方法不能确定时会用到。
抽象类 abstract class Obj{}
抽象方法不能有方法体
abstract public function func_name(param1,...);
抽象类中可以没有抽象方法,但是抽象方法必须存在于抽象类中!
如果A1类继承了一个抽象类A,则要求A1类实现从A类继承的所有抽象方法
10.接口(更加抽象的抽象类,接口的方法都不能有方法体且必须是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关键字:修饰类 或者 方法,不能修饰属性。
① 希望某个类不能被继承: finalclass A{}
② 希望某个方法不能被子类重载(改写):class A{final public function func_name(){} }
12.const关键字:类中的常量。
class 类名{const 常量名(大写)= 赋初值; }
interface 接口名{const 常量名(大写)= 赋初值;}
[调用方法]类名::常量名; 接口名::常量。在类的内部也可以使用 self::常量。
13.使用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)); //返回由类的方法名组成的数组
2. 反射完整的描述了一个类或者对象的原型,不仅可以用于类和对象,还可以用于函数、扩展模块、异常。
3. 反射的消耗很大,能找到替代方案的情况下就不要滥用。
 
魔术方法:
防止获取一个不存在的属性报错,使用 __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