2010-07-17 49 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

为什么介绍一个对象的开销?注册管理机构有它们的位置,但这些是常量的主要候选对象,为什么不直接定义它们呢?