2012-01-04 46 views
0

這是我如何設置我的辛格爾頓辛格爾頓沒有返回現有實例

<?php 
    class MySingleton 
    { 
     private static $instance; 
     private static $you; 

     private function __construct() 
     { 
      $this->you = "foo";  
     } 

     public static function singleton() 
     { 
      if (!isset(self::$instance)) {    
       $className = __CLASS__; 
       self::$instance = new $className; 
      } 
      return self::$instance; 
     } 

     public function getYou() 
     { 
      return $this->you; 
     }  
     public function setYou($val) 
     { 
      $this->you = $val; 
     } 

    } 
?> 

file1.php,我這樣做:

require_once('session.php'); 
$session = MySingleton::singleton(); 
$session->setYou('bar'); 
echo $session->getYou(); //echoes 'bar' 

在file1.php,我有一個超鏈接到file2.php,我有這個代碼:

require_once('session.php'); 
$session = MySingleton::singleton(); 
echo ($session->getYou()); //prints 'foo' which gets set in the constructor 

它似乎是爲file2創建一個新的實例,這就是爲什麼$you的默認值爲foo。我哪裏錯了?爲什麼我沒有得到我在file1.php中使用的實例?

+0

*(tip)* http://stackoverflow.com/questions/4595964/who-needs-singletons/4596323#4596323 – Gordon 2012-01-04 13:14:22

+0

不幸的是,使用會話不是一個選項。該應用程序正在使用長輪詢,這會導致'session_start'花費超過30秒的時間來執行。我希望改用singletons。我想我可以使用Cookie – xbonez 2012-01-04 13:20:27

+0

嘗試使用Cookie,但同樣的問題。由於cookies也使用文件,因此它很有意義。謝謝您的幫助。如果我找不出來,我會創建另一個問題 – xbonez 2012-01-04 13:30:12

回答

3

PHP中的單例只對當前請求有效(因爲HTTP是無狀態的)。

如果你希望保留對象的狀態,它保存在一個會話:

class MySingleton 
    { 
     private static $instance; 
     private static $you; 

     private function __construct() 
     { 
      $this->you = "foo";  
     } 

     public static function singleton() 
     { 
      session_start(); 
      if (!($_SESSION['MyInstance'] instanceof MySingleton)) {    
       $className = __CLASS__; 
       $_SESSION['MyInstance'] = new $className; 
      } 
      return $_SESSION['MyInstance']; 
     } 

     public function getYou() 
     { 
      return $this->you; 
     }  
     public function setYou($val) 
     { 
      $this->you = $val; 
     } 

    } 
3

在ONE請求期間,單身人士應該是「單人」。對於其他所有內容,您將不得不序列化對象或使用Sessions。

3

靜態數據只能在一個PHP程序中使用。

如果您的兩個腳本作爲單獨的頁面運行,它們將不會共享任何狀態。

1

單身人士在PHP中意味着程序的一次執行過程中返回的對象相同的實例,而不是在頁面加載的不同頁面之間。你需要的是將對象存儲在會話中(將它發送給「睡眠」)並稍後檢索它(「喚醒它」),但要注意,它們仍然是不同的實例,一個是另一個的克隆,並且更新une將不會更新其他。