2011-06-28 9 views
5

Próbuję zadeklarować publiczną zmienną statyczną, która jest tablicą tablic:statyczna zmienna Public

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 ... 
} 

Ale pojawia się błąd:

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

+0

Co to jest 'coś()'? Czy jest to zadeklarowane jako właściwość klasy ('public static $ contexts') lub gdzieś w metodzie? – deceze

+0

jest to normalna funkcja. Jest zadeklarowana poza klasą. zmienna jest zadeklarowana jako własność klasy – Alex

+0

"zadeklarowana poza klasą"? Czy możemy zobaczyć, gdzie ten fragment kodu jest z resztą klasy? – BoltClock

Odpowiedz

9

nie można używać wyrażeń podczas deklarowania właściwości klasy. To znaczy. nie można tutaj zadzwonić pod numer something(), można używać tylko wartości statycznych. Będziesz musiał ustawić te wartości inaczej w kodzie w pewnym momencie.

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

Na przykład:

class Foo { 
    public static $bar = null; 

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

Foo::init(); 

lub zrobić to w __construct jeśli idziesz do instancji klasy.

+0

To dziwne, ponieważ mogę zadeklarować publiczną funkcję statyczną, która zwróci moją tablicę, będzie to ta sama wartość. – Alex

+1

Początkowe wartości właściwości klas są tworzone podczas analizowania kodu źródłowego. W tym momencie pamięć musi być zarezerwowana dla tych początkowych wartości klasy, ponieważ muszą one być gdzieś przechowywane. Dzieje się to przed faktycznym wykonaniem kodu. Nie można zarezerwować pamięci dla zwracanej wartości funkcji, ponieważ funkcja może zwrócić wszystko. A ponieważ przetwarzanie nie zostało zakończone, funkcje nie mogą być jeszcze wykonane. Dlatego podczas * analizowania * kodu dopuszczalne są tylko wartości statyczne o znanym rozmiarze. Funkcja jest (jawnie) wywoływana później w czasie wykonywania i może zwracać cokolwiek. – deceze