[PHP]: использовать функцию возврата в качестве данных массива в определении статического класса
У меня проблемы с этим определением класса из-за определения $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 ответа
Вы не можете инициализировать статические члены чем-либо, кроме прямых литералов и уже определенных констант. Вы можете использовать что-то вроде этого, хотя:
<?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
Зачем вводить накладные расходы на объект? реестры имеют свое место, но они являются первыми кандидатами в константы, так почему бы просто не определить их?
Цитирование из руководства по PHP:
Это объявление [свойства] может включать в себя инициализацию, но эта инициализация должна быть постоянным значением, то есть она должна быть в состоянии быть оцененной во время компиляции и не должна зависеть от информации времени выполнения для оценки.
Вы можете определить пустой массив, а затем вызвать метод для его заполнения во время выполнения или одноэлементный класс, который инициализирует значения массива в конструкторе.
Вы не можете вызывать функции при объявлении переменных / констант класса / объекта. Вы также не можете использовать конкатенацию строк. Это довольно ограничено.
ОБНОВЛЕНИЕ: Вы можете использовать следующий обходной путь (это заняло немного времени, чтобы написать), это немного уродливо, потому что это требует определения констант дважды:
<?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,
);
}