private $db = new Db();
如上,在php5的類中,如果直接聲明一個執行個體變數,就會報類聲明錯誤
改成下面這樣就可以
private $db = null; public function __construct(){ $this->db = new Db(); }
非得先聲明一個空值,再用方法賦值,搞的常常寫出來查半天發現沒bug,才明白原來是文法要求。
不明白是基於什麼考慮,我理解,可能是php5學習面象對象學的還不完善,所以有很多問題,大夥聊聊。
補問:PHP7還是這樣嗎?
鳥哥,求擼 @Laruence
.
回複內容:
private $db = new Db();
如上,在php5的類中,如果直接聲明一個執行個體變數,就會報類聲明錯誤
改成下面這樣就可以
private $db = null; public function __construct(){ $this->db = new Db(); }
非得先聲明一個空值,再用方法賦值,搞的常常寫出來查半天發現沒bug,才明白原來是文法要求。
不明白是基於什麼考慮,我理解,可能是php5學習面象對象學的還不完善,所以有很多問題,大夥聊聊。
補問:PHP7還是這樣嗎?
鳥哥,求擼 @Laruence
.
因為如果允許
private $db = new Db();
這樣的文法,那麼,檔案被載入後,Db類就被初始化了。
請注意,是A類被載入記憶體,Db類就被執行個體化了。
而如果Db類也用了同樣的文法,那麼可能你include一個檔案,就會很慢,因為include的同時,就在進行一系列的類執行個體化行為。
而禁用這種特性,只允許在類構造方法中執行個體化其他類,就能很好的控制類執行個體化的流程了。載入類時,永遠不會產生附帶的類執行個體化。
無論對於系統的最佳化,還是對於程式已耗用時間的掌控,可預測、可控的,才是好的、可持續的。
PHP暫時未提供對對象屬性直接賦值對象的支援,對象的賦值暫時只能通過建構函式來實現。
當然,你不能說php要向java去學習物件導向,也沒有誰規定java才是物件導向的標杆,如果php真的樣樣都和java一樣了,那它幹嘛還叫php呢。
補答:PHP7依然是這樣。
class的直接賦值只能是 標量 (數值,字串,數組,布爾)
謝謝邀請。樓上回答就很到位
都是大神 在函數外面直接執行個體化類沒做過,但是你的第二種寫法兩個db不是同一個變數吧