2011-06-28 203 views
5

我想聲明一個公共靜態變量是陣列的陣列:公共靜態變量值

class Foo{ 
public static $contexts = array(
    'a' => array(
     'aa'    => something('aa'), 
     'bb'    => something('bb'), 
    ), 

    'b' => array(
     'aa'    => something('aa'), 
     'bb'    => something('bb'), 
    ), 

); 

// methods here 

} 

function something($s){ 
    return ... 
} 

但我得到一個錯誤:

Parse error: parse error, expecting `')'' in ...

+0

什麼是'something()'?此外,這是聲明爲一個類屬性('公共靜態$上下文)或方法的某處? – deceze

+0

這是一個正常的功能..它是在課堂外宣佈的。該變量被聲明爲類屬性 – Alex

+0

「在類之外聲明」?我們可以看到這段代碼和其他課程在一起嗎? – BoltClock

回答

9

你不能使用表達式當聲明類屬性時。即您不能在這裏撥打something(),您只能使用靜態值。您必須在某些時候以不同的代碼設置這些值。

Like any other PHP static variable, static properties may only be initialized using a literal or constant; expressions are not allowed. So while you may initialize a static property to an integer or array (for instance), you may not initialize it to another variable, to a function return value, or to an object.

http://www.php.net/manual/en/language.oop5.static.php

例如:

class Foo { 
    public static $bar = null; 

    public static function init() { 
     self::$bar = array(...); 
    } 
} 

Foo::init(); 

或做它__construct,如果你打算將類實例。

+0

這很奇怪,因爲我可以聲明一個公共靜態函數,它將返回我的數組,它將是相同的 – Alex

+1

在解析源代碼時創建類屬性的初始值。此時,需要爲那些初始類值保留內存,因爲它們需要存儲在某個地方。這發生在代碼實際執行之前。你不能爲函數的返回值保留內存,因爲函數可能會返回任何東西。而且由於解析還沒有完成,功能還不能執行。因此,在解析代碼時,只允許已知大小的靜態值。稍後在運行時(明確)調用一個函數,並可能返回任何內容。 – deceze