2013-10-12 61 views
0

說我已經定義了幾個類是這樣的:

abstract class ServerVars { 
    public static function get($k) { 
    if (empty($arr[$k])) throw new Exception('Not found'); 
    return $arr[$k]; // Also include error checking 
    } 
    public static function set($k, $v) { 
    $arr[$k] = $v; 
    } 
    ... // Other useful methods 
} 

public class Session extends ServerVars { 
    static $arr = $_SESSION; // !!! 
    public static function destroy() { 
    ... 
    } 
} 

基本上,我只是試圖總結某些服務器變量,如$ _SESSION ,$ POST等,使我的代碼更加模塊化。但標有!!!的行會導致錯誤unexpected '$_SESSION' (T_VARIABLE)。爲什麼會發生此錯誤?有沒有更好的方式來做我想要完成的事情?

+1

參見本:http://stackoverflow.com/questions/1694378/unexpected-t-variable-error –

回答

1

類變量的初始化器必須是常量。 $_SESSION是一個變量,它不一定是恆定的。

不要爲此使用繼承;這完全不合適。如果你堅持有一類,它應該是一個類:

class DuplicatesBuiltInFunctionality { 
    public function __construct($arr) { 
     $this->arr = $arr; 
    } 

    public function get($k) { 
     if(!isset($this->arr[$k])) throw new Exception('Not found'); 
     return $this->arr[$k]; 
    } 

    public function set($k, $v) { 
     $this->arr[$k] = $v; 
    } 
} 
+0

爲什麼它不恰當?就我而言,這似乎是一個有用的抽象。這樣做,我不得不創建實例,這似乎不正確,因爲我只需要一個實例爲整個程序(我試圖避免使用單例模式)。我想知道的是如何讓我的特定代碼工作。 –

+0

@Inredasting:不,你不需要整個程序的一個實例。你需要一個''_SESSION',一個用於'$ _POST'(我假設你正在計劃爲'$ _GET'和'$ _COOKIE'做同樣的事情)。 – Ryan

+0

但是,如果我結束說$ post = new DuplicatesBuiltInFunctionality($ _ POST),並且在一個函數中使用它,那麼在另一個函數中定義的另一個函數中,我將無法使用該$ post變量;我需要實例化另一個。 –