2010-07-17 60 views
1

由於$directories的定義,我在遇到此類定義時遇到了問題。請幫助:[PHP]:使用函數返回作爲靜態類定義中的數組數據

<?php 
..... 
class Config { 

    public static $directories = array(
     "resources" => realpath(__DIR__), 
     "root" => $_SERVER['DOCUMENT_ROOT'], 
     "branch" => $_SERVER['DOCUMENT_ROOT'] . "/branch", 
     "templates" => realpath(__DIR__ . '/templates'), 
     "library" => realpath(__DIR__ . '/library'), 
     "views" => realpath(__DIR__ . '/views'), 
     "controllers" => realpath(__DIR__ . '/controllers'), 
     "backups" => realpath(__DIR__ . '/backups') 
    ); 

    } 
?> 
+0

是什麼問題? – Kris 2010-07-17 22:18:32

+0

我的IDE(netbeans)抱怨它。抱怨語法錯誤。 – Fortisimo 2010-07-17 22:20:29

+0

問題是使用函數來定義屬性的值。 – 2010-07-17 22:20:40

回答

3

你不能靜態成員初始化到其他任何數組值的單例類比直接文字和已定義的常量。你可以使用這樣的東西雖然:

<?php 
class Config 
{ 
    static protected $directories = null; 

    static public function getDirectory($dirName) 
    { 
     if (self::$directories == null) 
     { 
      self::$directories = array(
       "resources" => realpath(__DIR__), 
       "root" => $_SERVER['DOCUMENT_ROOT'], 
       "branch" => $_SERVER['DOCUMENT_ROOT'] . "/branch", 
       "templates" => realpath(__DIR__ . '/templates'), 
       "library" => realpath(__DIR__ . '/library'), 
       "views" => realpath(__DIR__ . '/views'), 
       "controllers" => realpath(__DIR__ . '/controllers'), 
       "backups" => realpath(__DIR__ . '/backups') 
      ); 
     } 
     return self::$directories[$dirName]; 
    } 
} 
#EOF 
+0

這看起來像一個乾淨的解決方案。有沒有負面影響? – Fortisimo 2010-07-17 22:34:22

+0

調用一個方法(並做一個檢查)可能會有一點點的開銷,而不是訪問一個靜態屬性,但我基本上可以保證你永遠不會注意到它。除非你開始無所事事,而是無論如何都要以循環方式訪問配置數百萬次。 – Kris 2010-07-17 22:39:22

0

在聲明類/對象變量/常量時,不能調用函數。你也不能使用字符串連接。它非常有限。

UPDATE: 您可以使用以下解決方法(我花了點時間寫),它的有點難看,因爲它需要定義常量兩次:

<?php 

define('CONFIG_DIRECTORY_RESOURCES', realpath(__DIR__)); 
define('CONFIG_DIRECTORY_ROOT', $_SERVER['DOCUMENT_ROOT']); 
define('CONFIG_DIRECTORY_BRANCH', $_SERVER['DOCUMENT_ROOT'] . '/branch'); 
define('CONFIG_DIRECTORY_TEMPLATES', CONFIG_DIRECTORY_RESOURCES . '/templates'); 
define('CONFIG_DIRECTORY_LIBRARY', CONFIG_DIRECTORY_RESOURCES . '/library'); 
define('CONFIG_DIRECTORY_VIEWS', CONFIG_DIRECTORY_RESOURCES . '/views'); 
define('CONFIG_DIRECTORY_CONTROLLERS', CONFIG_DIRECTORY_RESOURCES . '/controllers'); 
define('CONFIG_DIRECTORY_BACKUPS', CONFIG_DIRECTORY_RESOURCES . '/backups'); 

class Config 
{ 
    public static $directories = array(
     "resources" => CONFIG_DIRECTORY_RESOURCES, 
     "root" => CONFIG_DIRECTORY_ROOT, 
     "branch" => CONFIG_DIRECTORY_BRANCH, 
     "templates" => CONFIG_DIRECTORY_TEMPLATES, 
     "library" => CONFIG_DIRECTORY_LIBRARY, 
     "views" => CONFIG_DIRECTORY_VIEWS, 
     "controllers" => CONFIG_DIRECTORY_CONTROLLERS, 
     "backups" => CONFIG_DIRECTORY_BACKUPS, 
    ); 
    } 
0

從PHP手冊引用:

此[屬性]聲明可能包括初始化,但此 初始化必須是一個常量 值 - 也就是說,它必須能夠在編譯時評估爲 ,並且不得 依賴 中的運行時信息來評估。

你可以定義一個空數組,然後調用在運行時填充它的方法,或者初始化在構造函數中

0

爲什麼介紹一個對象的開銷?註冊管理機構有它們的位置,但這些是常量的主要候選對象,爲什麼不直接定義它們呢?