PHP面向对象笔记02

  1. 面向对象编程OOP(Object Oriented Programming)两个重要概念:类和对象。类是属性和方法的集合,是面向对象编程方式的核心和基础。
  2. 面向对象三大特点:继承、封装、多态。继承分为单继承和多继承,PHP支持单继承,一个字类有且只有一个父类。

PHP面向对象笔记02

  1. 类中的函数被称为成员方法。区别:函数实现的是某个独立的功能,成员方法(即:类中的函数)实现类中的一个行为,是类的一部分。
  2. 类的实例化:通过new 关键字声明对象,使用这样的格式调用要使用的方法:“对象名->成员方法”。

PHP面向对象笔记02

  1. 成员变量:类中的变量(又称属性、字段),用来保存信息数据,或与成员方法进行交互来实现某项功能。定义成员变量:“关键字 成员变量名”。

关键字:public、private、protected、static、final。访问成员变量:“对象名->成员变量”。($this-> 作用是调用本类中的成员变量或成员方法)

PHP面向对象笔记02 

  1. 定义类常量使用关键字const,常量输出格式为:类名::常量名,其中的两个冒号成为作用域操作符,可以在不创建对象的情况下调用类中的常量、变量和方法。

PHP面向对象笔记02

  1. 构造方法:生成对象时自动执行的成员方法,作用就是初始化对象。该方法可以没有参数,也可以有多个参数。

构造函数的格式为:void __construct([mixed args [,…]])。[ 注:两条下划线__ ]

PHP面向对象笔记02PHP面向对象笔记02

  1. 析构方法的作用和构造方法相反,是对象被销毁时调用的,作用是释放内存。格式为:void __destruct(void)。

下面的例子即使不使用unset函数,析构方法也会自动被调用。

PHP面向对象笔记02 

  1. 继承通过extends关键字声明。

PHP面向对象笔记02

PHP面向对象笔记02

  1.  多态存在的两种形式:覆盖和重载。

PHP面向对象笔记02

PHP面向对象笔记02

  1. 伪变量“$this->”只可以在类的内部使用。当类被实例化后,$this同时被实例化为本类的对象,

这时对$this使用get_class()函数,将返回本类的类名。get_class()函数返回对象所属类的名字,如果不是对象则返回false。

操作符“::”可以在没有任何声明实例的情况下访问类中的成员变量或成员方法。格式为:“关键字::变量名/常量名/方法名”,

这里的关键字:(1)parent关键字:可以调用父类中的成员变量、成员方法和常量。(2)self关键字:可以调用当前类中的静态成员和变量。

            (3)类名:可以调用本类中的变量、常量和方法。

PHP面向对象笔记02

  1. PHP数据隐藏:public、private、protected、static、final。Public是公共成员。对于成员方法,如果没有写关键字,那么默认就是public。

private是私有成员,被private修饰的变量和方法,只能在所属类的内部被调用和修改,不可以在类外被访问,在子类中也不可以。

PHP面向对象笔记02

  1. protected是保护成员,可以在本类和子类中被调用,其他地方不可以被调用。

PHP面向对象笔记02

PHP面向对象笔记02

  1. 静态变量(方法):不是所有的变量(方法)都要通过创建对象来调用,可以通过给变量(方法)加上static关键字来直接调用。

调用静态成员的格式为:“关键字::静态成员”其中,关键字可以是:

(1)self,在类内部调用静态成员所使用;(2)静态成员所在的类名,在类外调用类内部的静态成员时所用。

  1. 在静态方法中,只能调用静态变量,而不能调用不同变量,而普通方法则可以调用静态变量。

使用静态成员,除了可以不需要实例化对象,另一个作用就是在对象被销毁后仍然保存被修改的静态数据,以便下次继续使用。

PHP面向对象笔记02

  1. 含有final关键字的类不能被继承,也不能再有子类。含有final关键字的方法在子类中不可以进行重写,也不可以被覆盖。

PHP面向对象笔记02

PHP面向对象笔记02

  1. 抽象类使用abstract关键字声明,是一种不能被实例化的类,只能作为其他类的父类来使用。格式为:abstract class AbstractName{…}

抽象方法使用abstract关键字修饰,抽象方法没有方法体,其功能的实现只能在子类中完成。格式为:abstract function abstractName(); [注:后面要有分号!]

  1. 抽象类和抽象方法主要应用于复杂的层次关系中,这种层次关系要求每一个子类都包含并重写某些特定的方法。

PHP面向对象笔记02

  1. PHP只支持单继承,若要实现多重继承,就要用接口。接口类通过interface关键字来声明,并且类中只能包含未实现的方法和一些成员变量。格式为:

interface InterfaceName{function interfaceName1();  function interfaceName2(); …… }

  1. 不要用public以外的关键字来修饰接口中的类成员,对于方法不写关键字也可以,这是一个接口类自身的属性决定的。
  2. 接口类的子类通过implements关键字来实现接口的,如果要实现多个接口,那么每个接口之间使用逗号“,”连接。

而且所有未实现的方法需要在子类中全部实现,否则PHP将会出现错误!格式如下:

PHP面向对象笔记02

PHP面向对象笔记02

  1. 其实,抽象类和接口实现的功能十分相似。抽象类的优点是可以在抽象类中实现公共的方法,而接口则可以实现多继承。使用哪个应视具体情况而定。
  2. PHP5中,如果需要克隆一个对象(即:将对象复制),使用关键字clone来实现。格式为:$obj1=new ClassName(); $obj2=clone $obj1;

PHP面向对象笔记02

  1. __clone()方法,作用是:在克隆对象的过程中,调用该方法可以使克隆出来的对象保持自己的一些行为及属性。

PHP面向对象笔记02

  1. 判断两个对象的关系是克隆还是引用:两个等号“==”是比较两个对象的内容;三个等号“===”是比较对象的引用地址。

PHP面向对象笔记02

  1. 对象类型检测:instanceof操作符可以检测当前对象属于哪个类。

PHP面向对象笔记02

  1. PHP中的魔术方法:一系列以两个下划线开头的方法,如__construct()、__destruct()、__clone(),这些内容基本上都没明白,留作备用资料。
    1. __set() __get() 方法:

PHP面向对象笔记02

PHP面向对象笔记02

    1. __call() 方法:

PHP面向对象笔记02

PHP面向对象笔记02

    1. __sleep() 方法 和 __wakeup() 方法。

 

【代码】 https://github.com/rxbook/study-php-object/tree/master/code02