[PHP]:Utilizar a função de retorno como matriz de dados estáticos, definição de classe
-
17-09-2020 - |
Pergunta
Estou tendo problemas com essa definição de classe devido a definição de $directories
.Por favor, ajude:
<?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')
);
}
?>
Solução
Você não pode inicializar membros estáticos para algo diferente direto literais e já definido constantes.Você pode usar algo como isso, porém:
<?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
Outras dicas
Citando o manual do PHP:
Esta propriedade [] declaração pode incluir um de inicialização, mas este de inicialização deve ser uma constante valor--que é, deve ser capaz de ser avaliada em tempo de compilação e não deve dependem de informações de tempo de execução em a fim de ser avaliada.
Você pode definir uma matriz vazia e, em seguida, chamar um método para preencher, em tempo de execução, ou uma classe singleton que inicializa a matriz de valores no construtor
Você não pode funções de chamada ao declarar classe/objeto de variáveis/constantes.Você também não pode usar concatenação de seqüência de caracteres.É bastante limitada.
ATUALIZAÇÃO:Você pode usar a seguinte solução alternativa (demorou um pouco de tempo para escrever), é um pouco feio, porque não exige a definição de constantes duas vezes:
<?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,
);
}
por que apresente a sobrecarga de um objeto?registros têm o seu lugar, mas estas são as principais candidatas para constantes então, por que não basta defini-los?