2016-10-21 32 views
13

我得到一個錯誤:PHP錯誤:致命錯誤:常量表達式包含無效操作

Fatal error: Constant expression contains invalid operations in config.php on line 214

這條線是:

protected static $dbname = 'mydb_'.$appdata['id']; 

無論我做了引號任何錯誤?或者別的地方?

我對錯誤消息的搜索只顯示了不同的原因(函數定義中的動態默認值)。

+0

內聲明的日期。如果你不說什麼對你所發現的解釋不清楚,人們可能會浪費時間再次撰寫相同的信息。 –

+0

@ÁlvaroGonzález對不起隊友,Al Fonce的回答在這裏解決了我的問題。實際上其他類似的標題,我在這裏找到SO只有相似的標題,但查詢不同隊友。這就是爲什麼我問這個問題 –

+1

然後,另一種表達方式就是「我在這裏找不到類似的問題」,如果你什麼都不說,我會說這是明確的假設。我冒昧地編輯你的問題來反映這一點。沒關係,如果沒有愚蠢的話,問題本身可能會非常有趣(如果有愚蠢的話,它可能會被鏈接到一個)。 –

回答

12

official Php documentation

Like any other PHP static variable, static properties may only be initialized using a literal or constant before PHP 5.6; expressions are not allowed. In PHP 5.6 and later, the same rules apply as const expressions: some limited expressions are possible, provided they can be evaluated at compile time.

所以你不能初始化另一個變量的靜態變量。用常量字符串替換$appdata['id']或刪除static屬性。

這是因爲靜態聲明在編譯時解決,當其他變量的內容是不知道(見this other page of official doc)。

4

Raja這是因爲一個靜態變量包含一個常量值。但是,在你的情況:

protected static $dbname = 'mydb_'.$appdata['id']; 

$ APPDATA [「身份證」]是動態的,可以在執行過程中改變它的值。這就是錯誤顯示的原因。

+0

我明白了,我只是學習善意引導我,因爲在這種情況下,我需要關聯一個動態變量。所以,我應該如何關聯動態數據庫名稱 –

2

除非你陷入困境與反思,我能想到的唯一的辦法有一個靜態的私人/保護類與動態生成的價值屬性是在類的外部計算的話:

class Foo { 
    protected static $dbname = DBNAME; 

    public static function debug() { 
     return Foo::$dbname; 
    } 
} 

$appdata = array(
    'id' => 31416, 
); 
define('DBNAME', 'mydb_'.$appdata['id']); 
var_dump(Foo::debug()); 

在您的精確使用但是,它的可能,這是沒有什麼好理由的屬性是靜態的。在這種情況下,這是因爲使用構造也很簡單:

class Foo { 
    protected $dbname; 

    public function __construct($appdata){ 
     $this->dbname = 'mydb_'.$appdata['id']; 
    } 

    public function debug() { 
     return $this->dbname; 
    } 
} 

$appdata = array(
    'id' => 31416, 
); 
$foo = new Foo($appdata); 
var_dump($foo->debug()); 
3

我有這個錯誤,我的修補程序是不是類屬性數組

public static $config_array = array(
    'start_date' => date('Y-m-d H:i:s') // No can do 
);