this訪問static變數
⑴ PHP中this,self和static的區別
PHP支持類和面向對象結構,PHP的類的靜態函數和變數不與任何特定類的實例相關聯(換句話說,一個對象)。
相反,靜態函數和變數與類定義本身相關聯。換言之,一個類的所有實例都共享相同的靜態變數。在一個類的方法(函數)的上下文中,靜態變數和函數被訪問使用self::,在一個類的對象(實例)的上下文中使用其他方法和變數時用this。
靜態函數只能使用靜態變數,靜態函數和變數的引用是通過 self::函數名() 和 self::變數名。上述實例中,靜態變數的引用是由類名(exampleClass::$foo),或者self::(self::$foo),當在這個類的靜態方法[稱為 靜態函數()]里使用時。類的正則函數和變數需要一個對象上下文來引用,他們不能脫離對象上下文而存在。對象上下文由$this提供。在上述函數中,$bar 是一個正則變數,所以它被 $obj->bar(上下文使用變數obj) 來引用,或者使用 $this->bar(再次在一個對象的方法里在一個對象上下文中) 來引用。
self 不使用前面的 $,因為 self 不意味著是一個變數而是類結構本身。而 $this 引用一個特定的變數,所以有前面的 $ 。
⑵ Java多線程中static變數的使用
線程,是我們項目中繞不開的重點領域。提到線程,就常會聽到線程安全的術語。那什麼是線程安全呢?通俗點說,就是線程訪問時不產生資源沖突。其實,這是一個有點難以定義的概念,不是很容易讓人一聽就懂的概念。
靜態變數、實例變數、局部變數在多線程下的安全問題主要如下:
靜態變數:線程非安全。靜態變數使用static關鍵字定義,被類的所有實例共享。用public修飾的static成員變數和成員方法本質是全局變數和全局方法,當聲明它的類的對象時,不生成static變數的副本。在靜態方法中不能使用非靜態變數,不能直接訪問所屬類的實例變數,也不能直接調用非靜態方法,不能使用this和super關鍵字。修改靜態變數會導致其他對象對修改可見,故線程非安全。
實例變數:單例時線程非安全,非單例時線程安全。實例變數屬於對象實例私有,系統只存在一個實例對象,則在多線程環境下,修改後其他對象均可見,故線程非安全;如果每個線程都在不同的實例對象中執行,則對象與對象間的修改互不影響,故線程安全。
局部變數:線程安全。局部變數定義在方法內部,每個線程執行時都會把局部變數放在各自的幀棧的內存空間中,線程間不共享,故不存在線程安全問題。
靜態方法的線程安全性:靜態方法中如果沒有使用靜態變數,則沒有線程安全的問題。靜態方法內的變數,每個線程調用時都會新創建一份,不會公用一個存儲單元,故不存在線程沖突的問題。