PHP延迟静态绑定

1 self用法

self是指向定义它的当前类的指针。当前类(current class)
1
<?php
class Person
{/*{{{*/
 static $name = 'i am person' ;
 //打印信息
 public static function printInfo()
 {
 echo "[self] name:".self::$name." 
";
 echo "[self] age:".self::getAge()."
"; 
 }
 //获取年龄
 public static function getAge()
 {
 return 18;
 }
}/*}}}*/
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

输出

[self] name:i am person

[self] age:18

2 static用法

static是指向调用它的类的指针。函数调用在运行时绑定调用类(calling class)
1
<?php
class Person
{/*{{{*/
 static $name = 'i am person' ;
 //打印信息
 public static function printInfo()
 {
 echo "[self] name:".self::$name." 
";
 echo "[self] age:".self::getAge()."
";
 echo "[static] name:".static::$name." 
";
 echo "[static] age:".static::getAge()."
";
 }
 //获取年龄
 public static function getAge() 
 {
 return 18; 
 }
}/*}}}*/
class OldPerson extends Person
{/*{{{*/
 static $name = 'i am old person';
 public static function getAge()
 {
 return 65; 
 }
}/*}}}*/
OldPerson::printInfo();
echo "==========
";
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36

输出

[self] name:i am person

[self] age:18

[static] name:i am old person

[static] age:65

3 self和static分析

因为OldPerson 继承 Person。OldPerson 覆盖了$name属性和getAge()方法。继承了printInfo()方法。如果继承的printInfo()方法写全,OldPerson类的代码如下:

class OldPerson extends Person
{/*{{{*/
 static $name = 'i am old person';
 public static function getAge()
 {
 return 65; 
 }
 ...............................继承的方法........................
 //打印信息
 public static function printInfo()
 {
 echo "[self] name:".self::$name." 
"; //self 只指向Person指针
 echo "[self] age:".self::getAge()."
"; //self 只指向Person指针
 echo "[static] name:".static::$name." 
"; //static 指向调用它的类的指针 OldPerson
 echo "[static] age:".static::getAge()."
";//static 指向调用它的类的指针 OldPerson
 }
 ...............................................................
}/*}}}*/
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

OldPerson::printInfo()方法中.self指向了Person。但是static指向了它的调用这OldPerson。所以输出结果

[self] name:i am person

[self] age:18

[static] name:i am old person

[static] age:65

4 静态延迟绑定需要在PHP5.3版本以后以后才能支持

5 self和static使用场景

5.1 self可以定义了值或者方法,子类继承的时候,值不会变化。

5.2 static定义的方法,子类可以重载。类似与模板方法模式。样例:比如一个会员父类 class Vip

下面两个子类分别是 超级会员 svip 和 年费会员 yvip 。可以在两个子类中分别重写 static usergroup() 方法 或者其他静态属性 ,父类中使用延迟静态绑定这样可以写出很优雅的代码

PHP延迟静态绑定

相关推荐