[麦先生]PHP面向对象中常见的魔术方法以及关键字
麦先生引言:在学习php面向对象的编程思想中,我们会遇到很多的能够自动调用的魔术方法,每个魔术方法都有其特定的触发场景,但其根本目的是在于编写和实际使用过程中阻止程序报错而生;
常见的魔术方法有:music=> gusic(根据首字母拼音大写由gusic联想到music) 以及构造,析构方法,以及特殊的关键字fsci -- cats 和 ai
魔术方法 触发场景
<!--gusic-------------------------------------------------------------------------------------------------------start------------>
__get 当在类的外部获取一个非公有或者不存在的属性时会自动触发该魔术方法
__unset 当在类的外部试图销毁一个非公有或者不存在的属性时会自动触发该魔术方法
__set($name,$value) 当在类的外部对内部某个非公有或者不存在的属性重新赋值时会自动触发该方法
__isset($name) 检测一个非公有或者不存在的属性值时会自动触发该方法
__call 当调用一个非公有或者不存在的成员方法时会自动触发该魔术方法
<!--gusic---------------------------------------------------------------------------------------------------------end------------->
__construct(){} 当用new关键字实例化类时自动触发该魔术方法 (常用)
__destruct 析构方法:1,文本执行结束时;2,使用unset销毁变量;3,重新给成员属性赋值时触发;
关于成员属性和方法被封装后的权限问题:
类的外部 子类的内部 本类
public 可以 可以 可以
private 不可以 可以 可以
protected 不可以 不可以 可以
一些特殊的关键字和魔术方法
<!--fsci-cats------------------------------------------------------------------------------------------------------------start------------->
名称 简介
f => final 版本终结者; 一个可以修饰成员属性和方法的只能在内部专用的霸道本类;被他修饰的类不能被继承,方法不能被重写;
s =>与new和$this有"仇"的static; 与3P修饰符一起使用,通常尾随其后,名称之前,且被修饰的成员属性是一个共有属性;特有的访问形式
类的内部:self::成员属性/成员方法 类的外部 类名::成员属性/成员方法
c => const 爱在类内部玩的常量定义方式; 格式const AB = ''; 注意:其值对计算、可调用函数、变量"不感冒",且不参与流程控制;因而总结为类的
内部常用const 类的外部用Define定义 访问形式与静态一致;
i => instanceof(DNA检测仪); 用于确定某对象是否是由该类或者该类的子类实例化而来的;
c => clone克隆; 常与__clone合用,使用__clone复制对象时自动执行,目的是初始化新创建的对象(镜像且无值);
a =>__autoload(程序猿心头想); 为懒人自动引入文件所用;
t => toString(魔术方法)(挑食) 当对对象进行字符串操作时执行,只要返回字符串类的值,其他的都不要;
s =>serialize(串行化,序列号); 伴随着两个魔术方法 __sleep串行化和__wakeup反串行化;
<!--fsci-cats------------------------------------------------------------------------------------------------------------end--------------->
<!--ai--------------------------------------------------------------------------------------------------------------------start------------->
a =>abstract抽象(关键字) 常用3P之后,类class之前; 特点:被abstract修饰的类不能直接被实例化且成员方法没有代码体;
作用:相当于给子类定义一个固定的模版,让其在继承使用时,必须先将所有的抽象方法全部重写否则无法使用;
i=>interface(接口) 使用interface关键字定义接口;在接口里 只包含类常量和抽象方法;接口的继承是 implements 与 其他的extends不同;
抽象类和接口的相同点:1,都不能直接被实例化;都可以有抽象方法;都可以通过类常量访问;都可以给子类定义模板;
不同点:接口中抽象类不用abstract修饰;接口中只有interface无class;接口中只有抽象方法和类常量;接口只能public;
<!--ai---------------------------------------------------------------------------------------------------------------------end------------->