2009-09-24 76 views
0

有沒有什麼辦法可以在PHP中堅持對象? 我在腳本中創建了一些對象,但每次運行腳本時都必須創建它們(除非將它保存到數據庫中,否則會丟失它們的狀態)。我可以檢索之前用過的物品嗎?

我知道變量可以用$ _SESSION全局持久化,但是我應該保存對象嗎?

如果不能實現對象持久性,那麼在PHP中使用OOP有什麼用?

+8

緩存我無法想象OOP怎麼會沒有對象持久化無用。 – 2009-09-24 22:11:19

+0

@jcinacio,阿門。 – 2009-09-24 23:39:17

回答

1

對象持久性是可能的,但它不會自動提供。您可能需要自己編寫它,或者使用可以爲您完成的對象層。所以你可能需要一個數據庫。

PHP不是一個您的程序隨時間對多個頁面請求作出響應的環境:相反,您的程序將被調用以響應頁面請求,並在完成時終止。

PHP中面向對象的代碼的目的是爲了能夠完成大量的編程算法和風格,並使其更容易實現更大範圍的編碼解決方案。是的,它們在單個頁面調用中被實例化和銷燬,所以你必須在這個範例中工作。許多代碼庫在頁面之間或會話中傳遞對象ID;只要他們需要相應的對象,它就會使用該ID進行實例化並從持久存儲中加載。一個好的對象層將會使這個變得簡單。

4

序列化對象,你把它存儲在會議前:

$s_obj = serialize($myObj); 
$_SESSION['myObj'] = $s_obj; 

後來,檢索和重建它:

$s_obj = $_SESSION['myObj']; 
$myObj = unserialize($s_obj); 
+0

謝謝!我添加了一些鏈接,以防其他人按步驟操作: http://us2.php.net/manual/en/language.oop.serialization.php http://us2.php.net/manual/en/ function.serialize.php – Gerardo 2009-09-24 22:24:33

3

沒有必要序列化對象:

<?php 

class A 
{ 
    protected $name; 
    public function __construct($name) { $this->name = $name; } 
    public function getName() { return $this->name; } 
} 

session_start(); 

if (isset($_SESSION['obj'])) { 
    die($_SESSION['obj']->getName()); 
} 

$_SESSION['obj'] = new A('name'); 

?> 
1

同意jcinacio,在插入$ _SESSION之前無需序列化值。 PHP將在每個頁面請求/結束時爲您管理序列化/反序列化。

持久化對象/會話的另一種方法是將它們保存在文件/數據庫中,「模擬」php的行爲。在這種情況下,您需要序列化值以將它們轉換爲字符串,並且在從數據庫檢索到數據庫時將它們反序列化以將它們轉換回對象。

您可能還會對要保存的對象的__sleep和__wakeup「Magic Methods」[0]感興趣。這些方法被稱爲串行化時/反序列化對象,來執行動作,諸如連接/從數據庫斷開等

[0] http://php.net/oop5.magic

1

注意,如果狀態的各種用戶之間共享真正,你不想使用$ _SESSION。 $ _SESSION僅在同一用戶會話中可用 - 即,如果您一次在該網站上有50個用戶,他們中的每一個都必須至少支付一次計算處罰。

在這些情況下,您可能希望使用基於內存(memcache)緩存的持久磁盤。

相關問題