2015-10-14 56 views
1

我正在構建一個簡單的MVC框架,並堅持如何設置對象。初始化PHP MVC上的對象 - 查看之前或期間

TL; DR:是否更好地在視圖之前或在視圖渲染過程中初始化對象?

實施例:

CONTROLLER

<?php 
class Controller { 
    public function __construct() { 
     $user = new User(); 
    } 
} 
?> 

對象用戶

<?php 
class User { 
    public function __construct() { 
     $this->setFriends($arg); 
    } 
    public function setFriends($arg) {} 
    public function getFriends() {} 
} 
?> 

OBJECT朋友

<?php 
class Friend { 
    .. properties .. 
    .. methods() .. 
} 
?> 

VIEW

<?php 
foreach($user->getFriends() as $friend){ 
    .. $friend is a Friend Object already .. 
    .. html... 
} 
?> 

問題:是更好的初始化上setFriends方法好友對象(加載視圖之前 - 記住,有很多的朋友),或在getFriends方法(負載視圖)?

public function setFriends($arg) { 
    foreach($arg as $item) 
     $this->friends[] = new Friend($item) 
} 

OR

public function getFriends() { 
    $tmp = array(); 
    foreach($this->friends as &friend) 
     $tmp[] = new Friend($friend) 
    return $tmp; 
} 

我想,在第一種情況下,內存會被預先消費。而第二種情況,只有在視圖調用getFriends時,朋友對象纔會初始化。

+0

這似乎不是任何一種情況。如果您獲得新數據,則需要調用分配新對象的setFriends。什麼是'$ this-> friends',爲什麼你要創建一個Friend對象的臨時數組來返回?我們需要更多關於代碼使用情況的信息。調用get/set的預期用例是什麼?他們打了多少次?等等。在OOP中,一旦有數據初始化它們,通常會創建對象。 –

+0

這個實現的一般建議是通過查看(在foreach中)初始化對象(我想從模型/控制器/新對象函數中解耦視圖,像另一個人一樣構建視圖..他不想需要初始化朋友對象(已經通過)...我不知道我是否清楚(對不起,我的英語) – brnmonteiro

+0

然後,對於你的get/set函數,View並不是一個好的地方,它們屬於Controller ,從而將View和Friend對象的創建分離開來,注意,getFriends應該返回'$ this-> friends'並且避免複製到一起,除非你把函數改成&getFriends() ' –

回答

1

作爲一個一般的經驗法則:這是使每一個頁面加載應該在初始化(通常在自舉層或類似)普遍早於被要求需要

什麼。這包括基本控制器(其他擴展),基本視圖(相同的交易在這裏),數據庫處理程序對象等。

任何只針對一個頁面的東西,正如您似乎正在與用戶和朋友一起描述的應該加載到處理加載該頁面的控制器或控制器操作中。這有助於保持您的代碼專注,並減少內存佔用。

在這些情況下,儘可能多地將業務邏輯從視圖中移出,並將視圖中的PHP保存爲循環和迴響等簡單內容。在MVC框架中,您經常會看到在控制器中構建的數組,因此可以將大量已經完成的數據傳遞給視圖。例如,在你的控制器中,你可以實例化你的用戶作爲參數傳遞給視圖,然後實例化你的朋友,並將它們全部添加到你作爲另一個參數傳遞的朋友數組中。或者將這兩個數組組合成一個大數組,然後將單個「參數」參數傳遞給視圖。這將成爲所有視圖可以共享的標準參數,然後挑選視圖本身內部發生的數據陣列。

其他選項變得更加可行,具體取決於您需要提供哪些有關朋友的信息。例如,在實例化用戶時,您還可以(在構造函數中)實例化其每個朋友,分配給一個數組,並將它們全部保存爲該用戶的屬性。這確實造成了一個笨重的對象,你必須考慮如果你使用了很多用戶,這將花費多少。

但是,在某些情況下,您可能只需要朋友,因此在您需要時可以更有意義地將它們實例化,而不是在您不需要時總是讓它們實現。如果是這樣的話,你的用戶至少應該查看一下它的朋友,並且能夠設置一個屬性來保存你需要查看朋友的信息。這意味着無論它是否包含在您的用戶構造函數中(如果您始終需要知道用戶擁有什麼朋友),或者在像getFriends這樣的單獨函數中(如果您只有時需要了解用戶的朋友),您會需要至少有一個可以作爲用戶屬性存儲的每個朋友的ID,以便稍後可以循環訪問並根據ID實例化好友。

總的來說,我認爲重要的一點是關於上下文。你創建一個對象的地方直接影響兩個主要的東西:它可以被訪問的地方,以及你浪費了多少內存。你總是需要權衡這兩者並達到平衡。我最好的建議是儘可能限制數據的存在位置和訪問位置,只限於那些必須存在的位置。這將使您的應用程序保持最安全,並使用最少的內存。

我知道需要考慮的事情很多,但是我希望這能夠幫助你!

+0

謝謝!幫助我很多!! – brnmonteiro

+0

很高興聽到它幫助!請接受答案,如果它解決了您的問題。 – carbide20