zoukankan      html  css  js  c++  java
  • 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__; //命名空间
  • 相关阅读:
    软件测试
    python学习之路
    好用的在线画图工具processon
    spring-boot集成dubbo
    公众号开放,关注软件开发过程中的哪些坑
    crontab 中curl命令无法正常执行
    近一月翻阅资料小结
    nginx+tomat8负载后,利用redis实现tomcat8的session共享
    centos7 安装nginx
    centos 上安装redis 3.0.5
  • 原文地址:https://www.cnblogs.com/rxbook/p/10912951.html
Copyright © 2011-2022 走看看