在多人訪問某個 類 的時候,如果在代碼中顯性的寫死了 $i = new Class() ; 的話,那麼所有的人訪問的對象都是這個唯一的 $i 嗎?
回複內容:
在多人訪問某個 類 的時候,如果在代碼中顯性的寫死了 $i = new Class() ; 的話,那麼所有的人訪問的對象都是這個唯一的 $i 嗎?
題主可能對代碼是怎麼執行的還每太弄明白。
本質上你寫了一個class,它什麼都不是,僅僅是一堆變數和一系列函數的集合。只是語言底層幫你做了一些限制,讓這個集合裡面的變數或者函數只能通過className.xxx的方式來訪問和調用。
至於你的問題,你首先主要知道php的多進程的概念。你可以把php代碼看成一個食譜,食譜是什麼呢?食譜什麼都不是,它僅僅是一系列的步驟,讓看它的人跟著它的指示進行下一步。沒有廚師,食譜毫無意義。當使用者請求執行xxx.php,就相當於來了個廚師拿了xxx這個食譜然後按照食譜上寫的步驟開始烹飪。同時有多個對xxx.php的請求,相當於同時來了多個廚師,他們的共同點是:他們拿著同一份食譜,意味著他們之後會幹相同的事情。但是每個廚師都是獨立的,他們有他們自己的食材和鍋,所以是互不影響的。
題主可能想問的是單例模式,我繼續用上面的例子來講。對於某個廚師,他在按照食譜進行烹飪的時候,其中可能會需要多次放一勺70%鹽+20%孜然+10%味精的混合物
。那麼對於這樣可能會反覆用到的對象,他可以提前做一罐放在那兒,之後要用就不需要每次去按比例混合,直接從罐子裡取一勺就好了。這就是單例。
那麼你可能還有疑問,我電腦只有一個CPU進行運算,我同時多個請求來了怎麼辦?很簡單,輪流使用唄。這個答案可能比較讓人驚訝,但事實就是如此。就好比說有100個人要寫作文,但是只有一張紙,怎麼辦呢?那隻能每個人寫兩句然後下一個人寫,等大家都寫完了,又輪到第一個人寫。這看起來簡直就沒辦法寫下去了嘛!但是想象一下,如果速度非常非常快,你寫了一個字後你的紙被拿走給別人寫,但是0.0000001秒之後大家都寫完了,紙又回到了你的手上,而且別人的字跡都被擦乾淨了,你寫的內容還在原來的位置。在這麼短的時間內切換,你完全感覺不到紙被拿走過,你會覺得是自己獨佔地使用這張紙。這就是作業系統的進程切換,PHP也是這個道理。
當然不同了, 每個使用者都有一個全新的執行個體$i。 因為每個使用者所在的進程同。
。。。
如果每個人都得到的是一份$i的copy而不是每個人都執行了$i=new Class的話,他們能回到同一個執行個體.反之,如果他們都通過$i=new Class的話.那肯定只能共用static.以上這些的假設都是php運行在單線程下.很明顯LZ0說的多個使用者一定會啟動多個php進程.