2010-07-17 7 views
1

J'ai des problèmes avec cette définition de classe à cause de la définition de $directories. S'il vous plaît aider:[PHP]: Utiliser la fonction return comme donnée de tableau dans la définition de classe statique

<?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

Quel est le problème? – Kris

+0

mon IDE (netbeans) s'en plaint. Se plaint d'une erreur de syntaxe. – Fortisimo

+0

Le problème est l'utilisation de fonctions pour définir les valeurs des propriétés. –

Répondre

3

Vous ne pouvez pas initialiser les membres statiques à tout autre que les littéraux directs et les constantes déjà définies. Vous pourriez utiliser quelque chose comme ceci:

<?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

Cela ressemble à une solution propre. Y a-t-il des négatifs? – Fortisimo

+0

Il peut y avoir une légère surcharge en appelant une méthode (et en effectuant une vérification) au lieu d'accéder à une propriété statique, mais je peux garantir que vous ne serez jamais capable de le remarquer. Pas à moins que vous commenciez à ne rien faire d'autre que d'accéder à Config en boucle pendant des millions de fois. – Kris

0

Vous ne pouvez pas appeler des fonctions lors de la déclaration de classe/objet variables/constantes. Vous ne pouvez pas non plus utiliser la concaténation de chaîne. C'est assez limité.

MISE À JOUR: Vous pouvez utiliser la solution suivante (il a fallu un peu de temps pour écrire), est un peu laid parce qu'il faut définir des constantes deux fois:

<?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

Je cite le manuel PHP:

cette déclaration [de propriété] peut inclure une initialisation, mais cette initialisation doit être une valeur constante - qui est, il doit pouvoir être évalué au moment de la compilation et ne doit pas dépendent des informations d'exécution au afin d'être évaluées.

Vous pouvez définir un tableau vide, puis appeler une méthode pour remplir lors de l'exécution, ou une classe singleton qui initialise les valeurs de tableau dans le constructeur

0

pourquoi introduire le surdébit d'un objet? les registres ont leur place mais ce sont des candidats de choix pour les constantes alors pourquoi ne pas les définir?

Questions connexes