2012-12-05 138 views
1

我已經繼承了一些我需要對其進行重大更改的PHP代碼。我知道用PHP可以序列化一個對象,並將頁面之​​間的序列化文本作爲FormData傳遞。在我繼承的代碼中,他們已經做到了,但是這造成了一些可維護性問題。我想知道如果採取這種方法甚至是一個好主意。在PHP頁面,IDE和將對象傳遞給其他類時傳遞對象

例如...

當用戶打開PageA.php創建以下:

$expensiveObj = new ExpensiveClass($id); 

$expensiveObj被串行化,並將所得文本存儲在與所述一個div以下:

<div id="expensiveObj"><?php echo strtr(base64_encode(serialize($expensiveObj)), '+/=', '-_,');?></div> 

PageA.php負載,ajax調用是PageB.php。 div的內容作爲後期變量傳遞到PageB.php。在PageB.php下面的代碼unserializes對象:

$expensiveObj = unserialize(base64_decode(strtr($_POST['expensiveObj'], '-_,', '+/='))); 

的字段和$expensiveObj的方法現在是到PHP訪問。我現在遇到的問題是

  • 因爲$expensiveObj確定PageB.php作爲類ExpensiveClass的一個實例,則IDE不知道的ExpensiveClass領域和功能都可用。我無法進行自動完成,也無法在IDE中查找可用的功能。另外IDE不能捕捉潛在的問題。另一個開發者專門在VI中工作,所以他從不關心。

  • PageB.php需要重新考慮因素。有一些視圖,商業和控制器邏輯都發生在這個頁面中,我寧願創建幾個類,但是我遇到了一個問題,我不知道如何將$expensiveObj傳遞給一個類。

我的問題是,有沒有辦法將對象傳遞給類?有沒有辦法通知IDE,通過post變量確實是ExpensiveClass的實例?

最後,以這種方式繞過物體甚至是一個好主意,還是應該考慮更大的重新因子?

+0

[Sessions](http://us3.php.net/manual/en/book.session.php)。就這些。 – Sammitch

+0

@Sammitch我不確定使用會話會解決我列出的問題。這只是以更持久的方式傳遞數據/對象的另一種方式。但是,如果您想將您的評論擴展爲答案,我肯定會考慮您要說的話。如果可能, – Bill

+0

會話+1,兩個頁面都可以開始同一會話。 –

回答

1

直接在HTML中存儲對象從來不是一個好主意,因爲它可以很容易地由客戶端進行更改。根據給定的參數,在PHP中更常見的是根據每個請求創建新的對象。我看到你使用$id初始化你的對象,所以你可以在請求之間傳遞這個id。將數據存儲到會話中也不是最佳實踐,會話應該用於會話特定的數據,例如,登錄用戶等。

如果創建對象非常昂貴,則可以使用緩存,例如, memcache,一些外部的library或者只是爲了編寫自己的文件,例如在JSON文件系統或數據庫中存儲數據。

+0

我同意這是更好的方法,但我可以理解其他開發人員在他所做的背後的理性。創建新對象的問題在於,在這種特定情況下,該操作相當昂貴且耗時。多次打擊資源是我寧願避免的。 – Bill

+0

我假設有一些昂貴的數據庫查詢或類似的東西。在這種情況下,你可以使用某種緩存,例如memcache或將其作爲JSON存儲到文件系統和「ExpensiveClass」的構造函數中,您可以檢查是否所有數據都被緩存。 –