Re: [請益] 關於靜態變數與全域變數

作者: tkdmaf (皮皮快跑)   2015-06-18 12:47:44
※ 引述《tas72732002 (蔥頭)》之銘言:
: 請問一下各位大大, 在物件導向的架構下,
: 使用靜態變數和全域變數有什麼差異嗎?
: Ex : public static $user1 = "";
: global $user1; $user2 = "";
: 它們不都是會被配置一塊記憶體永久保存, 直到程式執行結束嗎?
: 兩者有不同嗎?
public static <== 表示定義開放成員的靜態
這是php的物件導向所有的做法。
宣告靜態跟未宣告所使用的方法是不同的
class demo{
public static function myFunc()
{
//要呼叫本體其他函式或靜態成員屬性只能用self
}
public function myFunc1()
{
//要呼叫本體其他函式或成員可以用$this
//但是若要呼叫其他靜態函式和靜態成員還是只能用self
}
}
雖然說demo::myFunc()和demo->myFunc()都會有作用。
但既然是靜態呼叫,以使用demo::myFunc()為主
差異上來說,前者不需物件被實體化也能呼叫。
後者是必須實體化才能呼叫。
不過這當中還有的差異是一但你使用了靜態呼叫就不能在方法中
使用$this,如果需要對本體其他的屬性或是函式呼叫只能用self::funcName()
我自己比較多時候是在使用靜態呼叫生成各自獨體的物件時會看到。
再來就是global
這個東西叫做「全域變數」。
他跟php的無件導向一點關係也沒有。
而且在正常的情形下,也不怎麼會想去用到他。
因為一個沒弄好,你可能就會出現未可預期的結果。
一般而言如果你只是想在某個範疇內宣告一定範圍的全域
還是使用物件導向的屬性就好了。
一般而言如果是整個程式要用到的設定,那就用常數去定義。
以我自己來說,我不怎麼喜歡也不怎麼會想去用到global。
作者: tas72732002 (蔥頭)   2015-06-18 13:08:00
靜態變數感覺是執行程式就會預先載入(java的認知)
作者: mmis1000 (秋月戀楓)   2015-06-18 17:45:00
對PHP而言,應該要跑到import那一句後才會載入?

Links booklink

Contact Us: admin [ a t ] ucptt.com