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() 方法 或者其他静态属性 ,父类中使用延迟静态绑定这样可以写出很优雅的代码
相关推荐
Crazyshark 2020-09-05
linjava 2020-06-14
一个逗逗 2020-04-16
Ericbig 2020-03-03
doubinning 2020-02-18
codeAB 2020-01-19
wangqing 2020-01-18
猛禽的编程艺术 2019-12-19
bryantmeng 2019-11-21
bestallen 2019-11-04
小小狐狸 2019-09-29
bcbeer 2017-07-15
willowwgx 2020-07-27
tuxlcsdn 2020-06-13
hzq0 2020-10-05
池塘 2020-06-07
liqinglin0 2020-06-01