2012-02-09 98 views
0

我是一個AS3編碼器,我做了一些PHP,我很難做一個可以緩存變量的靜態類。PHP緩存類

這是我到目前爲止有:

<?php 
class Cache { 

private static $obj; 

public static function getInstance() { 
    if (is_null(self::$obj)){ 
     $obj = new stdClass(); 
    } 
    if (!self::$instance instanceof self) { 
     self::$instance = new self; 
    } 
    return self::$instance; 
} 

public static function set($key,$value){ 
    self::$obj->$key = $value; 
} 

public static function get($key){ 
    return self::$obj->$key; 
} 
} 
?> 

我用的是下面我的變量設置成我的靜態類的一個對象:

<?php 
include 'cache.php'; 
$cache = new Cache(); 
$cache->set("foo", "bar"); 
?> 

這是檢索的變量

<?php 
include 'cache.php'; 
$cache = new Cache(); 
$echo = $cache->get("foo"); 
echo $echo //doesn't echo anything 
?> 

我在做什麼錯?謝謝

+0

這裏你的問題是,你要建一個單身,但你**不能**實例化。當你設置'foo'時,你正在存儲該特定實例的值。但是當你想要檢索它時,你正在創建一個新的實例。 – mrlee 2012-02-09 23:24:07

+0

@fuzzyDunlop,好的,我看到了,所以我去了$ cache = Cache :: getInstance(); $ cache-> set(「foo」,「bar」);設置和$ cache = Cache :: getInstance(); echo $ cache-> get(「foo」);仍然不起作用:( – Eric 2012-02-09 23:28:48

+0

)在這段代碼中,你的'get'和'set'方法是'static',所以在調用它們時你需要使用'::'而不是' - >'。 – mrlee 2012-02-09 23:41:02

回答

0

我已經適應上述@ prodigitalson的代碼來獲得一些初步的作品(並具有很大的提升空間):

class VarCache { 
    protected static $instance; 
    protected static $data = array(); 

    protected function __construct() {} 

    public static function getInstance() { 
    if(!self::$instance) { 
     self:$instance = new self(); 
    } 

    return self::$instance; 
    } 

    public function get($key) { 
    self::getInstance(); 

    return isset(self::$data[$key]) ? self::$data[$key] : null; 
    } 

    public function set($key, $value) { 
    self::getInstance(); 
    self::$data[$key] = $value; 
    } 
} 

使用

VarCache::set('foo', 'bar'); 
echo VarCache::get('foo'); 
// 'bar' 

你會希望這個類是可用的在任何你需要的地方,如果你想要它堅持在請求之間,我會考慮使用Memcached或類似的東西,這會給你你需要的一切。

你可以選擇使用一些SPL功能,如ArrayObject,如果你想聰明:)

+0

確實有效,謝謝。我會檢查Memcached :) – Eric 2012-02-09 23:37:21

+0

事實上,Memcache(沒有D - 我在WAMP上)是我真正需要的。我只是安裝它,它的規則。對於像WAMP這樣想要安裝它的人,請查看:http://shikii.net/blog/installing-memcached-for-php-5-3-on-windows-7/ – Eric 2012-02-10 00:27:45

1

試試這個:

class VarCache { 
    protected $instance; 
    protected $data = array(); 
    protected __construct() {} 

    public static function getInstance() 
    { 
    if(!self::$instance) { 
     self:$instance = new self(); 
    } 

    return self::$instance; 
    } 

    public function __get($key) { 
    return isset($this->data[$key]) ? $this->data[$key] : null; 
    } 

    public function __set($key, $value) { 
    $this->data[$key] = $value; 
    } 
} 

// usage 

VarCache::getInstance()->theKey = 'somevalue'; 
echo VarCache::getInstance()->theKey; 
+0

嗯沒有複製粘貼這個確切的代碼,並沒有迴應任何東西.. – Eric 2012-02-09 23:22:00