執行個體對象放建構函式裡面好?

來源:互聯網
上載者:User
關鍵字 php 執行個體 建構函式
PHP裡面把執行個體對象這個步驟放建構函式裡面好?假設UserController裡面所有的方法幾乎都需要User這個對象我把 $user = new User();
放在__construct(){}裡面好?還是每個方法裡面都$user = new User();

回複內容:

PHP裡面把執行個體對象這個步驟放建構函式裡面好?假設UserController裡面所有的方法幾乎都需要User這個對象我把$user = new User();
放在__construct(){}裡面好?還是每個方法裡面都$user = new User();

如果對代碼沒什麼要求的話,這樣做也沒什麼不好,但是追求高一點的話還是不建議在建構函式中構造執行個體。一方面是如果根本用不到user執行個體就白分配了記憶體,另一方面也缺乏彈性。經典的get/set方法更靈活一些。

public function getUser() {    if (! $this->_user instanceOf User) $this->_user = new User();    return $this->_user;}

對象內部也通過getUser來擷取執行個體代替直接存取$this->_user一方面保證了User對象在需要的時候才被構造,同時,setUser方法也為綁定衍生類別提供了可能。
當然如果追求更優雅的代碼可以繼續在解耦方面動更多腦筋,不過也要考慮開發效率問題,畢竟姿勢漂亮而犧牲太多速度也是容易被詬病的。

這個可以根據項目實際情況來定,如果這個項目做出來之後,訪問量不大,也沒什麼拓展的,個人覺得可以犧牲下效能,優待一下自己,沒必要考慮那麼多效能、拓展的東東,怎麼方便怎麼來,何必拿著牛刀滿大街的追著雞砍。個人愚見。

首先,把$user = new User();放在每個方法裡肯定是不好的做法。因為:

  1. 大量代碼重複。每個方法裡都有一樣的初始化代碼,造成大量重複代碼。

  2. 高耦合。User對象和這個UserController對象高度耦合,想象一下如果你要把User更換為另一個AdvancedUser對象,你需要更改多少代碼量。

其次,把$user = new User();放在建構函式裡是一種更好的方法,但也不是最好的方法。因為:

  1. 放在建構函式裡解決了上面的重複代碼的問題,每個方法不需要重複執行執行個體化過程。

  2. 但是高耦合依然存在,如果把User更換為AdvancedUser對象,依然需要更改UserController的代碼。

最後,推薦的做法是使用控制反轉,把$user = new User();放在UserController類外面,把執行個體化後的User對象作為構造參數傳入,這樣如果要替換User對象,只要把不同的執行個體化對象傳入即可。比如這樣:

$user = new User();$userController = new UserController($user);

每個方法都需要User對象,可以放在構造方法裡面啊。

這個就是簡化寫法,沒有什麼效率問題或者設計模式,不用考慮過度設計或者過度最佳化的問題。

但是要注意構造方法重寫問題。

謝邀!

首先這個問題我感覺是一個良好的編碼習慣問題,而良好的編碼習慣標準有很多

個人感覺犧牲系統效能來圖編碼的一時方便肯定是不可取的

想象一個情境:如果你的controller類中 有很多私人方法,其中只是為了封裝給多個方法在類內部調用的話,而這些方法本身又不要你這個new user執行個體,這樣你就浪費了“一塊記憶體”,就是我所說的犧牲了系統效能,當然可能並沒有我們想象的那麼嚴重

所以其實你自己可以取捨是要為了方便編碼 還是為了追求極致的系統效能

對象的關係,userModel是userController的屬性嗎?
其實只是一種使用關係而已,所以每次使用的時候擷取就可以了。

注意,上面是使用了擷取,而不是執行個體化。具體你可以去瞭解下控制反轉和依賴注入。

  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.