一、 静态属性
a) 静态成员的概念:该成员不是某个对象独自占用,而是所有的对象所共享的成员,从语法上来看,应该由类来进行管理
b) 静态属性的访问方式是 类名::属性名,其中属性名要加上$符号!
c) 如果在类内访问静态属性,类名可以使用self关键字来代替!

一、 静态方法
a) 访问静态方法的语法形式为:类名::静态方法名()
b) 可以用对象访问静态方法和非静态方法,也可以使用2q类访问静态方法和非静态方法,因为静态方法和非静态方法的存储机制的本质是一样的,都是放在用户代码区,而且都只有一份,也都归类来进行管理
c) 静态方法和非静态方法主要是逻辑含义不一样,静态方法是指所有的对象所共享的方法,非静态方法是各个对象“独占”的方法(尽管只有一份),所以它们体现在语法上,二者之间最大的区别就是静态方法内不能出现$this关键字
d) 我们编程的标准做法只有一个,那就是类访问静态成员,对象访问非静态成员
二、 类常量
a) 概念:就是类的内部定义的常量,本质上跟普通常量没有什么区别,只是该常量属于某个类,在使用的时候必须先找到类才能找到常量
b) 定义方法:const 常量名=值,定义常量的时候,前面不能有访问控制修饰符,也不受访问控制的限制!
c) 调用方式:类名::常量名
三、 类的自动加载
a) __autoload()
b) 注册自己的自动加载函数
i. 第一步:定义一个普通的函数,能实现类文件的加载功能
ii. 第二步:将这个普通函数注册成自动加载函数,spl_autoload_register(‘函数名’)
c) 注册自动加载方法
i. 注册非静态方法:spl_autoload_register(array(对象变量,非静态方法名))
ii. 注册静态方法:spl_autoload_register(array(类名,静态方法名))或spl_autoload_register(‘类名::静态方法名’)
四、 对象的序列化与反序列化
a) 数据的序列化主要是解决数据的持久化存储的问题,除了资源型都可以被序列化
b) 序列化函数:serialize,反序列化函数unserialize
c) 对象在序列化的时候,需要增加一个魔术方法__sleep,返回一个索引数组,里面是所有需要被序列化的属性的集合,对象在反序列化的时候,同样需要找到相关的类文件,增加一个魔术方法__wakeup,主要是完成该对象在反序列化的时候所进行的初始化工作!
五、 类的继承extends
a) 概念:体现在代码上就是一个类使用了另一个类的成员
b) 关于继续的基本概念:继承、父类(基类)、子类(扩展类、派生类)、派生、扩展、单继承
c) 继承的本质:不是将父类的代码复制到子类的内部,而是通过继承链条找到相应的成员
六、 重写override
a) 也叫覆盖,就是指当子类的成员和父类的成员重名的时候,真正起作用的是子类中的成员
b) 重写机制还是由继承链条来决定的
c) 我们一般可以通过修改成员的名字来避免重写,但是有些重写是不可避免的,此时,需要真的需要调用父类的同名方法,应该在子类中进行显式的调用,调用的语法为:父类名::同名方法名,其中父类名可以用parent来代替!
七、 访问控制修饰符
a) public
b) protected
c) private
d) 使用原则:尽可能的隐藏类的内部实现,只给用户提供相关的操作接口