首先看代碼:
class Demo1{
public static $name = 'zsgz';
public static $salary = 3000;
public static function show(){
//self與demo1類靜態(tài)綁定
return self::$name;//訪問本類中的靜態(tài)屬性self::就是當(dāng)前類
// return static::$name;//訪問本類中的靜態(tài)屬性static::就是當(dāng)前類
}
}
class Demo2 extends Demo1{
public static $sex = 'male';
public static function display(){
//parent::與父類進(jìn)行靜態(tài)綁定,self與demo2類靜態(tài)綁定
return parent::$name.'的工資是:'.parent::$salary.'性別是:'.self::$sex;
//parent::與父類進(jìn)行靜態(tài)綁定,static與demo2類靜態(tài)綁定
//return parent::$name.'的工資是:'.parent::$salary.'性別是:'.static::$sex;
}
}
echo '姓名是:'.Demo1::$name;//在外部訪問類中的靜態(tài)屬性
echo '<hr>';
echo '姓名是:'.Demo1::show();//在外部訪問類中的靜態(tài)屬性
echo '<hr>';
echo Demo2::display();
echo '<hr>';
上面代碼的Demo1的show()和Demo2中的display()的方法return返回值輸出結(jié)果都是一樣的.
image.png
下面我們看這種情況,怎么在Demo1中訪問Demo2的$sex屬性呢?
class Demo1{
public static $name = 'zsgz';
public static $salary = 3000;
public static function show(){
return static::$sex;//訪問本類中的靜態(tài)屬性static::就是當(dāng)前類
//static與self,parent是不一樣的,它對應(yīng)的類是動態(tài)設(shè)置的,有調(diào)用類決定,如果說self和parent是靜態(tài)綁定到類的話,
//static就是動態(tài)綁定到類,叫做靜態(tài)延遲綁定(后期靜態(tài)綁定)
//靜態(tài)綁定(self和parent)他們與類的綁定是在代碼編譯階段進(jìn)行,而static與類的綁定是在代碼運(yùn)行時才進(jìn)行綁定,
//所以叫靜態(tài)延時綁定,所以叫:靜態(tài)延遲綁定(與類綁定的時機(jī)不同)
}
}
class Demo2 extends Demo1{
public static $sex = 'male';
public static function display(){
//parent::與父類進(jìn)行靜態(tài)綁定,static與demo2類靜態(tài)綁定
return parent::$name.'的工資是:'.parent::$salary.'性別是:'.static::$sex;
}
}
echo Demo2::show();
輸出結(jié)果:image.png
總結(jié):static與self,parent是不一樣的,它對應(yīng)的類是動態(tài)設(shè)置的,有調(diào)用類決定,如果說self和parent是靜態(tài)綁定到類的話,static就是動態(tài)綁定到類,叫做靜態(tài)延遲綁定(后期靜態(tài)綁定)
靜態(tài)綁定(self和parent)他們與類的綁定是在代碼編譯階段進(jìn)行,而static與類的綁定是在代碼運(yùn)行時才進(jìn)行綁定,所以叫靜態(tài)延時綁定,所以叫:靜態(tài)延遲綁定(與類綁定的時機(jī)不同)
學(xué)習(xí)視頻:http://www.php.cn/code/15745.html