[PHP]: использовать функцию возврата в качестве данных массива в определении статического класса - PullRequest
1 голос
/ 18 июля 2010

У меня проблемы с этим определением класса из-за определения $directories.Пожалуйста, помогите:

<?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')
    );

  }
?>

Ответы [ 4 ]

4 голосов
/ 18 июля 2010

Вы не можете инициализировать статические члены чем-либо кроме прямых литералов и уже определенных констант. Вы можете использовать что-то вроде этого, хотя:

<?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 голосов
/ 18 июля 2010

зачем вводить накладные расходы на объект?Реестры имеют свое место, но они являются первыми кандидатами в константы, так почему бы просто не определить их?

0 голосов
/ 18 июля 2010

Цитирование из руководства по PHP:

Это объявление [свойства] может включать инициализацию, но это инициализация должна быть постоянной ценность - то есть она должна быть в состоянии оценивается во время компиляции и не должен зависит от информации во время выполнения в заказ на оценку.

Вы можете определить пустой массив, а затем вызвать метод для его заполнения во время выполнения или одноэлементный класс, который инициализирует значения массива в конструкторе.

0 голосов
/ 18 июля 2010

Вы не можете вызывать функции при объявлении переменных / констант класса / объекта. Вы также не можете использовать конкатенацию строк. Это довольно ограничено.

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,
    );
  }
...