php之类常量/魔术常量/延迟绑定
1 <?php 2 /* 3 普通常量 define('常量名',常量值) 4 在定义和使用常量时,不用加$符号 5 define定义的常量,全局有效 6 无论是页面内,函数内,类内都可以访问 7 8 专门在类内发挥作用的常量 9 这说明 10 1:作用域在类内,类似于静态属性 11 2:是常量,则不可改 12 其实就是"不可改变的静态属性" 13 14 类常量在类内用const声明即可,前面不用$ 15 类常量必须是一个定值,不能是变量,类属性或函数返回值 16 前面不用加权限修饰符,而且权限是public的,即外部也可以访问 17 */ 18 define('ACC','Deny'); 19 class Human{ 20 const HEAD = 1; 21 public static $leg = 3; 22 public static function show(){ 23 echo ACC,'<br />'; 24 echo self::HEAD,'<br />'; 25 echo self::$leg,'<br />'; 26 } 27 } 28 Human::show(); 29 echo Human::HEAD,'<br />'; 30 31 /*** 32 魔术常量 33 1:无法手动修改他的值,叫常量 34 2:他的值随环境变动的,叫魔术 35 所以叫魔术常量 36 37 __FILE__ 返回当前文件的路径 38 在框架开发或者网站初始化脚本中,用来计算网站的路径 39 40 __LINE__返回当前的行号 41 在框架中,可以用来在debug时,记录错误信息 42 43 __CLASS__返回当前的类名 44 45 __METHOD__返回当前的方法名 46 ***/ 47 48 49 echo '当前正在运行的是',__FILE__,'文件<br />';//当前文件的路径 50 echo '当前正在运行的是',__DIR__,'目录<br />';//当前目录 51 echo '当前正在运行的是',dirname(__FILE__),'目录<br />';//和__DIR__效果一样 52 echo 'hi,我正在第',__LINE__,'行<br />'; 53 echo 'hi,我正在第',__LINE__,'行<br />'; 54 echo 'hi,我正在第',__LINE__,'行<br />'; 55 class foo{ 56 public static function t(){ 57 echo '你正在运行',__CLASS__,'类<br />'; 58 echo '下的',__METHOD__,'方法<br />'; 59 } 60 } 61 foo::t(); 62 63 /*** 64 后期绑定/延迟绑定 65 ***/ 66 class Human{ 67 public static function whoami(){ 68 echo '来自父类的whoami在执行<br />'; 69 } 70 public static function say(){//子类没有say()方法,找到了父类这里 71 //在这里的self指的是父类 72 self::whoami(); 73 } 74 public static function say2(){//在子类也没有say2()方法,也找到了父类这里 75 static::whoami(); //在这里的static指的是子类,如果子类没有whoami,会往上找到父类继承过来的whoami 76 } 77 } 78 class Stu extends Human{ 79 public static function whoami(){ 80 echo '来自子类的whoami在执行<br />'; 81 } 82 } 83 Stu::say(); 84 Stu::say2(); 85
/***延迟绑定:
是指类的计算self的定义不是以定义时为准,而是以运行时的计算结果为准
***/
class Animal {
const age = 1;
public static $leg = 4;
public static function cry() {
echo '呜呜<br />';
}
public static function t1() {
self::cry();
echo self::age,'<br />';
echo self::$leg,'<br />';
}
public static function t2() {
static::cry();
echo static::age,'<br />';
echo static::$leg,'<br />';
}
}
class Human extends Animal {
public static $leg = 2;
public static function cry() {
echo '哇哇<br />';
}
}
class Stu extends Human {
const age = 16;
public static function cry() {
echo '嘤嘤<br />';
}
}
Stu::t1();//呜呜,1,4,self调用的是本类
Stu::t2();//嘤嘤,16,2,static调用的是运行时属于的类,如果没有就去父类找,父类没有,就去父类的父类找... 86 ?>