[PHP]:Utilizar a função de retorno como matriz de dados estáticos, definição de classe

StackOverflow https://stackoverflow.com/questions/3273494

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

  }
?>
Foi útil?

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?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top