首頁 後端開發 php教程 PHP中如何形成static::與new static()的靜態綁定

PHP中如何形成static::與new static()的靜態綁定

Jun 06, 2020 pm 03:20 PM
靜態綁定

PHP中如何形成static::與new static()的靜態綁定

PHP中static::與new static()之後期靜態綁定

##一、 parent、self、$this、__CLASS__

class A {}
class B extends A{
parent::(public|protected)(静态方法|静态变量)  ===> parent永远是A
self::(public|protected)(静态方法|静态变量)  ===> self永远是B
$this->(public|protected)(非静态方法|非静态变量)  ===> $this永远是B的是实例化对象
__CLASS__    ===> 永远是B
} 
class C extends B{
parent::(public|protected)(静态方法|静态变量)  ===> parent永远是B
self::(public|protected)(静态方法|静态变量)  ===> self永远是C
$this->(public|protected)(非静态方法|非静态变量)  ===> $this永远是C的是实例化对象
__CLASS__    ===> 永远是C 
}
登入後複製

二、static::

static關鍵字可以實現以下功能:

1呼叫類別的靜態方法   有後期靜態綁定效果;

2 呼叫類別的靜態屬性   有後期靜態綁定效果;

3 呼叫類別的非靜態方法  沒有後期靜態綁定效果;

4 注意:不可以呼叫非靜態屬性;

class A {
    private static function foo() {
        echo "A success!\n";
    }
    public function test() {
         $this->foo();
    }
}
 
class B extends A {
}
 
class C extends A {
    private static function foo() {
    echo "C success!\n";
    }
}
 
$b = new B();
$b->test();//A success!
$c = new C();
$c->test();//A success!
登入後複製
class A {
    private static function foo() {
        echo "A success!\n";
    }
    public function test() {
        static::foo();
    }
}
 
class B extends A {
}
 
class C extends A {
    private static function foo() {
    echo "C success!\n";
    }
}
 
$b = new B();
$b->test();//A success!
$c = new C();
$c->test();//A无法调用C里的私有foo方法 
 
 
 
 
//将C的foo改成非private(public|protected)就可以解决
class A {
    private static function foo() {
        echo "A success!\n";
    }
    public function test() {
        static::foo();
    }
}
 
class B extends A {
}
 
class C extends A {
    public static function foo() {
    echo "C success!\n";
    }
}
 
$b = new B();
$b->test();//A success!
$c = new C();
$c->test();//C success!
登入後複製
class A {
 public static function foo() {
     static::who();
 }
 
 public static function who() {
     echo __CLASS__."\n";
 }
}
 
class B extends A {
 public static function test() {
     A::foo();
     parent::foo();
     self::foo();
 }
 
 public static function who() {
     echo __CLASS__."\n";
 }
}
class C extends B {
 public static function who() {
     echo __CLASS__."\n";
 } 
}
 
C::test(); 
A =>A::foo()的结果
C =>parent::foo()能走到A的foo,里面static::who找C::who
C =>self::foo()能走到B的foo,B继承A,走到A的foo,里面static::who找C::who
 
 
 
 
 
class A {
    protected static function foo() {
        static::who();
    }
 
    protected static function who() {
        echo __CLASS__."\n";
    }
}
 
class B extends A {
    public static function test() {
        A::foo();
        parent::foo();
        self::foo();
    }
 
    protected static function who() {
        echo __CLASS__."\n";
    }
}
class C extends B {
    protected static function who() {
        echo __CLASS__."\n";
    } 
}
 
C::test(); //A C C,解释同上
 
 
 
 
 
class A {
 public static function foo() {
     static::who();
 }
 
 private static function who() {
     echo __CLASS__."\n";
 }
}
 
class B extends A {
 public static function test() {
     A::foo();
     parent::foo();
     // self::foo();  
 }
 
 private static function who() {
     echo __CLASS__."\n";
 }
}
class C extends B {
 private static function who() {
     echo __CLASS__."\n";
 } 
}
 
C::test();
//A =>A::foo()的结果 
//报错 A不可C的私有方法who => parent::foo()能走到A的foo,里面static::who找C::who,C的who只能在C里调用,不能在A里调用
//报错 A不可C的私有方法who => self::foo()能走到B的foo,B继承A,走到A的foo,里面static::who找C::who,C的who只能在C里调用,不能在A里调用
登入後複製

三、new static()

//new self()与new static()的区别,官网例子如下: 
class A {
  public static function get_self() {
    return new self();
  }
 
  public static function get_static() {
    return new static();
  }
}
 
class B extends A {}
 
echo get_class(B::get_self()); // A
echo get_class(B::get_static()); // B
echo get_class(A::get_static()); // A
登入後複製

推薦教學:《

PHP影片教學

以上是PHP中如何形成static::與new static()的靜態綁定的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
4 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

解釋PHP中的晚期靜態綁定(靜態::)。 解釋PHP中的晚期靜態綁定(靜態::)。 Apr 03, 2025 am 12:04 AM

靜態綁定(static::)在PHP中實現晚期靜態綁定(LSB),允許在靜態上下文中引用調用類而非定義類。 1)解析過程在運行時進行,2)在繼承關係中向上查找調用類,3)可能帶來性能開銷。

PHP Late靜態綁定:突破傳統程式設計思維的技術訣竅 PHP Late靜態綁定:突破傳統程式設計思維的技術訣竅 Sep 15, 2023 am 08:46 AM

PHPLate靜態綁定:突破傳統程式設計思維的技術竅門引言:傳統的程式設計思維方式通常是在編譯時就確定方法和屬性的調用,但是在一些需要動態調用的情況下,這種方式就顯得束縛和不靈活了。 PHP中提供了一個強大的特性,即"Late靜態綁定"(Latestaticbinding),它打破了傳統的程式設計思維,為動態綁定方法和屬性提供了便利。本文透過具體的程式碼範例,介紹了L

Java中的靜態綁定與動態綁定 Java中的靜態綁定與動態綁定 Aug 19, 2023 pm 02:57 PM

是的!當編譯器知道要用於方法執行的物件時,它可以靜態地將引用綁定到物件。例如,靜態變數、私有變數和final變數使用靜態綁定。而如果需要在運行時進行物件識別,則使用動態綁定。方法重寫是動態綁定的一種情況。而方法重載是靜態綁定的一種情況。

如何使用PHP Late靜態綁定來提高程式碼的重複使用性 如何使用PHP Late靜態綁定來提高程式碼的重複使用性 Sep 15, 2023 am 11:36 AM

如何使用PHPLate靜態綁定來提高程式碼的重用性引言:在PHP開發中,重複使用程式碼是提高開發效率和維護性的關鍵因素之一。 PHP提供了多種技術來實現程式碼的重複使用性,其中一個重要的技術是使用Late靜態綁定。本文將介紹Late靜態綁定的概念、優點以及如何在實際開發中應用。一、Late靜態綁定概述Late靜態綁定是指根據呼叫時上下文動態地決定靜態方法或屬性的呼叫方式。在

解鎖PHP Late靜態綁定的技術奧秘 解鎖PHP Late靜態綁定的技術奧秘 Sep 15, 2023 am 09:39 AM

解鎖PHPLate靜態綁定的技術奧秘,需要具體程式碼範例近年來,PHP作為一種常用的伺服器端腳本語言,受到了廣大開發者的歡迎。隨著PHP語言的發展,越來越多的程式設計技巧和特性被加入了PHP中,其中之一就是Late靜態綁定。 Late靜態綁定是指在繼承關係中,子類別能夠重寫和呼叫父類別的靜態方法和屬性。這種繼承關係可以很大程度上提高程式碼的靈活性和可擴展性。那麼,讓我

透過PHP Late靜態綁定,打造高效可擴充的程式碼結構 透過PHP Late靜態綁定,打造高效可擴充的程式碼結構 Sep 15, 2023 am 09:00 AM

透過PHPLate靜態綁定,打造高效可擴展的程式碼結構摘要:在大型專案中,程式碼結構的可擴充性和高效性是非常重要的。 PHPLate靜態綁定是一種強大的特性,可以幫助我們建立易於維護和擴充的程式碼。本文將介紹PHPLate靜態綁定的概念,並透過具體的程式碼範例來說明如何使用它來建立高效可擴展的程式碼結構。引言:隨著企業的業務不斷發展壯大,專案規模也逐漸成長。在這樣

Java中靜態綁定和動態綁定的區別 Java中靜態綁定和動態綁定的區別 Aug 27, 2023 pm 11:09 PM

綁定是一種在方法呼叫和方法實際實作之間建立連結的機制。根據Java中的多態性概念,物件可以有許多不同的形式。物件形式可以在編譯時和執行時解析。如果方法呼叫和方法實作之間的連結在編譯時解析,則我們稱為靜態綁定;如果在執行時間解析,則稱為動態綁定。動態綁定使用物件來解析綁定,而靜態綁定使用類別和欄位的類型。老先生。否。鍵靜態綁定動態綁定1基本上在編譯時解析在運行時解決2解析機制 靜態綁定使用類別和字段的類型動態綁定使用對象來解析綁定3示例重載是靜態綁定的示例方法重寫入是動態綁定的範例4.方法類型私有、

PHP Late靜態綁定:最佳化程式碼繼承的技術利器 PHP Late靜態綁定:最佳化程式碼繼承的技術利器 Sep 15, 2023 am 08:57 AM

PHPLate靜態綁定:最佳化程式碼繼承的技術利器背景介紹:在物件導向程式設計中,繼承是一種常見的程式碼重複使用技術。透過繼承,我們可以建立一個新的類,並從現有的類別(稱為父類或基類)繼承屬性和方法。這樣,我們可以減少程式碼重複,提高程式碼的可維護性和擴充性。然而,在繼承中,經常會遇到一個問題:在子類別中呼叫父類別的靜態方法時,由於靜態方法綁定是在編譯時完成的,導致子類別呼叫靜態方

See all articles