2011-06-28 23 views
5

Ben diziler bir dizidir ortak bir statik değişkeni bildirmek için çalışıyorum:Kamu statik değişken değeri

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

Ama hatayı alıyorum:

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

+0

'thing()' nedir? Ayrıca, bu bir sınıf özelliği ("public static $ contexts") veya bir yöntemde bir yerde olarak ilan edilir mi? – deceze

+0

bu normal bir işlev .. sınıfın dışında ilan edildi. değişken, "sınıfın dışında bildirilen" – Alex

+0

sınıf özelliği olarak bildirildi? Bu kod parçasının sınıfın geri kalanıyla nerede olduğunu görebilir miyiz? – BoltClock

cevap

9

Sen ifadeleri kullanamaz sınıf özelliklerini bildirirken. Yani Burada something()'u arayamazsınız, sadece statik değerleri kullanabilirsiniz. Bu değerleri kodda bir noktada farklı bir şekilde ayarlamanız gerekir.

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

Örneğin

: Eğer sınıf örneğini oluşturmak için gidiyoruz

class Foo { 
    public static $bar = null; 

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

Foo::init(); 

Ya __construct bunu.

+0

Bu garip, çünkü dizimi döndürecek bir genel statik işlevi bildirebilirim, aynı – Alex

+1

olur. Kaynak kod ayrıştırılırken sınıf özelliklerinin başlangıç ​​değerleri oluşturulur. Bu noktada, bir yerde depolanması gerektiğinden, belleğin başlangıçtaki sınıf değerleri için ayrılması gerekir. Bu, kodun gerçekte yürütülmesinden önce gerçekleşir. Bir fonksiyonun geri dönüş değeri için hafızayı rezerve edemezsiniz, çünkü bir fonksiyon bir şeyleri geri verebilir. Ayrıştırma tamamlanmadığından, işlevler henüz yürütülemiyor. Bu nedenle * kodu * ayrıştırırken, sadece bilinen boyuttaki statik değerlere izin verilir. Bir işlev, daha sonra çalışma zamanında çağrılır (ve açıkça) ve herhangi bir şey döndürür. – deceze