首先看代码:
class Demo1{
public static $name = 'zsgz';
public static $salary = 3000;
public static function show(){
//self与demo1类静态绑定
return self::$name;//访问本类中的静态属性self::就是当前类
// return static::$name;//访问本类中的静态属性static::就是当前类
}
}
class Demo2 extends Demo1{
public static $sex = 'male';
public static function display(){
//parent::与父类进行静态绑定,self与demo2类静态绑定
return parent::$name.'的工资是:'.parent::$salary.'性别是:'.self::$sex;
//parent::与父类进行静态绑定,static与demo2类静态绑定
//return parent::$name.'的工资是:'.parent::$salary.'性别是:'.static::$sex;
}
}
echo '姓名是:'.Demo1::$name;//在外部访问类中的静态属性
echo '<hr>';
echo '姓名是:'.Demo1::show();//在外部访问类中的静态属性
echo '<hr>';
echo Demo2::display();
echo '<hr>';
上面代码的Demo1的show()和Demo2中的display()的方法return返回值输出结果都是一样的.
image.png
下面我们看这种情况,怎么在Demo1中访问Demo2的$sex属性呢?
class Demo1{
public static $name = 'zsgz';
public static $salary = 3000;
public static function show(){
return static::$sex;//访问本类中的静态属性static::就是当前类
//static与self,parent是不一样的,它对应的类是动态设置的,有调用类决定,如果说self和parent是静态绑定到类的话,
//static就是动态绑定到类,叫做静态延迟绑定(后期静态绑定)
//静态绑定(self和parent)他们与类的绑定是在代码编译阶段进行,而static与类的绑定是在代码运行时才进行绑定,
//所以叫静态延时绑定,所以叫:静态延迟绑定(与类绑定的时机不同)
}
}
class Demo2 extends Demo1{
public static $sex = 'male';
public static function display(){
//parent::与父类进行静态绑定,static与demo2类静态绑定
return parent::$name.'的工资是:'.parent::$salary.'性别是:'.static::$sex;
}
}
echo Demo2::show();
输出结果:
image.png
总结:static与self,parent是不一样的,它对应的类是动态设置的,有调用类决定,如果说self和parent是静态绑定到类的话,static就是动态绑定到类,叫做静态延迟绑定(后期静态绑定)
静态绑定(self和parent)他们与类的绑定是在代码编译阶段进行,而static与类的绑定是在代码运行时才进行绑定,所以叫静态延时绑定,所以叫:静态延迟绑定(与类绑定的时机不同)
网友评论