面向对象
面向对象是一种编程思想,同面向过程一样也是封装,但是不一样的是面向对象的封装依据主体,也就是说每一个封装包代表一个主体,而其中的变量值为主体的属性,函数为主体实现其功能的方法。
基本格式:
class 类名{属性(变量),方法(函数)};
var_dump(对象)
只能打印出对象的非静态属性
无法打印出静态属性、类常量
1.使用class来定义类名
2.定义属性跟定义变量一样,方法跟函数一样
2.1属性和方法的声明有三种模式:public | protected | private
public:公共的,当前类内、继承链内、类外
protected:受保护的,当前类内、继承链内
private:私有的,当前类内
2.2属性访问格式:对象变量->属性名
2.3方法调用格式:对象变量->方法名()
2.4 $this为伪对象,代表调用当前所属类的对象
2.4.1 伪对象示例:
3.类名使用时需要先实例化
3.1类名实例化为对象格式:$对象名 = new 类名
3.2此时,($对象名)被称为一个对象。
4.构造方法
4.1在实例化(对象调用类)之后,直接对其属性初始化(赋值)。
4.2基本初始化:
4.3构造方法:
关于函数__construct,当一个类被实例化后,便自动生成__construct函数,所以在类中设置了该方法后,便可以直接在类的实例化之时直接初始化类的属性。
目前版本依旧支持用类名student代替__construct,具有同样的作用,但不推荐使用。
5.析构方法
public function __destruct(){}
在所属类的对象结束之前由系统自动调用并运行,一般用于释放对象所占资源。
6.对象克隆
新对象 = clone 已有的对象
__clone(){}
在类被克隆时系统自动调用。用于在克隆类时修改类中属性的值。写入被克隆的类中
7.instanceof
判断对象是否为某一个类的实例
格式:对象变量 instanceof 类名 (返回值布尔型)
8.静态成员
静态属性
各对象共用的属性(值),同个班级的学生中,班级这个属性
定义格式:public static $属性名
访问语法:类名::$静态属性名
类内部访问静态属性可以使用self关键字代替类名
静态方法
public static function 方法名(){}
调用时不能使用$this
类常量
定义格式:
const 常量名=值;
前不需要加(public | protected | private)声明
访问:
类名::常量名;
类名同样可以用self替代
类文件自动加载函数
当PHP文档遇到使用类语句时,会自动调用函数__autoload,并且函数的参数自动代入所需加载类的类名。
function __autoload($class_name){
include ‘./’.$class_name.’.class.php’;
}
spl_autoload_register(‘函数名’);
依次按照注册语句的顺序查找
注册语句必须发生在实例化语句之前
注册语句使用后,系统默认的__autoload将失效,需要再次注册__autoload才能正常使用
spl_autoload_register(array($对象名,’方法名’)); //非静态方法注册
spl_autoload_register(array(类名,’方法名’)); //静态方法注册
= spl_autoload_register(‘类名::方法名’);
数据的序列化与反序列化
向文件写入数据:file_put_contents(文件地址,写入的数据)
返回值:写入字符串的字节长度
从文件读取数据:file_get_contents(文件地址)
serialize()
将原数据转换为可以用于保存和传输的字符串数据
unserialize()
将序列化后的字符串数据转换为原始数据
__sleep()
触发:在序列化一个对象的时候
函数内容:return array(元素值为需要序列化的属性值)
__wakeup()
触发:当对象反序列化的时候
作用:在对象反序列化的时候,完成该对象的初始化工作
类继承
关键字:extends
说明: 类1继承类2,那么类1将获得类1的所有成员及特征(包括属性和方法)
继承的实质就是子类能够使用父类的属性和方法,但是并不能修改,因此子类的内容在物理上并不会新增属性和内容,仅仅只是把父类的属性和方法的使用链接给了子类。
子类调用父类的方法,作用的为子类;若希望作用的为父类,则需要使用格式:父类名::父类属性
parent(代表所在类的父类) 相当于self(代表所在的类)
当子类的属性或方法与父类重复时,那么在子类中子类的属性或方法将覆盖父类,但是作用范围仅限子类,父类的属性和方法并不会改变,只是子类在应用这些重复的属性或方法时,调用的是子类自己的。
单例模式(三私一公)
使某些类只能被实例化一次
- 防止用户通过new来实例化对象
通过私有化(private)预定义方法__construct
- 定义公开方法使得该类能被实例化
- 定义一个属性,用于存放实例化的对象
- 定义一个用于实例化对象,该方法为静态且公开。
- 方法内容:
调用时,判断该class是否已经被实例化,判断公式为:
!self::$instance instanceof self
判断当前类的$instance(对象)是否属于当前类
==判断$instance中是否已经存储有了该类的对象
==判断该类是否已经实例化
- 把方法__clone方法私有化