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 ?>

 

你可能感兴趣的:(PHP)