常量、类常量、魔术变量
-
普通常量:define(‘常量名’,‘常量值’);
- 全局可访问
- 值不可改变
-
类常量:const 常量名 = 常量值;
- 在PHP7中
- 类内可以访问,类外则根据权限的不同而定
- 他与静态属性类似,唯一区别就是:值不可改变
- 声明时不用加
$
符号
-
魔术变量
-
两个特点:
-
无法手动修改这个变量的值
-
魔术变量的值是随着环境的变动而改变的
-
魔术变量很多,它们的作用很大,能在开发中帮助你快速高效的解决一些问题,所以请认真的翻阅一遍手册,对魔术变量都有那些,有一个大概的认知;
-
几个小示例
define('br','<br/>'); echo '当前正在运行的是:',__FILE__,'文件'; echo br; echo '当前在',__DIR__,'目录下'; echo br; class A { static function say(){ echo '当前类名为:',__CLASS__; } } A::say();//当前类名为:A
-
延迟绑定
-
问题描述:
- 父类有一个
静态公共的A方法
和一个静态公共的B方法
; - 子类有一个
静态公共的A方法
; - 静态调用子类的B方法,此时,输出什么?
- 父类有一个
-
代码示例:
class A{
static function haha(){
echo '我是父类的haha方法';
}
static function hehe(){
self::haha();
}
}
class B extends A{
static function haha(){
echo '我是子类的haha方法';
}
}
B::haha();
-
结果:输出父类haha的echo;
-
原因:因为self所在的位置是父类,
-
但是!当
self
换成static
时,结果就不一样了,换成static
之后,输出的结果是子类的haha方法所输出的文字; -
为什么?
-
因为
self
仅代表当前类,如果当前类没有,就是没有,报undefined; -
而
static
则是:如果子类有,就用子类的,如果子类没有,就用我自己的,如果子类也没有,我也没有,那就报错,undefined; -
上面的代码,
self
换成static
之后,则优先使用子类的haha方法,如果子类没有haha方法,则使用父类的haha方法; -
static会一直向上找,子类没有,我自己也没有,就向本类的父类找,向本类的父类的父类找,最终没有就报错;
抽象类
抽象类的定义
-
就是对类进行抽象
-
类前加
abstract
就是抽象类 -
方法前加
abstract
就是抽象方法 -
抽象方法不能有方法体
-
抽象类,不能被New实例化
-
有抽象方法的类都是抽象类
-
抽象类内不一定有抽象方法
-
抽象类其实就是起到了一个类模板,类的规范的作用;
抽象类的意义
- 抽象类是不完整的,它的剩余功能是由子类来完成的
- 也就是说,抽象类这个概念的存在,我们可以用于规范方法,生成一个类的模板,供大家比对着模板去写自己的方法
- 中小型项目中,或者说团队人员较少的情况下,为了迅速的开发,抽象类这些什么规范是被摒弃的,如果你时间足够多,你可以尝试在多人协作的时候使用这些规范化的东西;
延迟绑定
- 是指类的self的指向,不是以定义时为准,而是在运行时的计算结果为准;
- 其实延期绑定很简单,就是运行时的指向;
- 只要区分了self 和static 的区别就OK,self主要是只在本类找,而static是先从实例化对象的类中开始找,没有就向父级找,找到最终类还没找到,就报错;就这么简单;