"namespaces", constantes e múltiplos PHP inclui

votos
2

Eu tenho algum código PHP semelhante ao seguinte:

foreach ($settingsarray as $settingsfile)
{
    include ($settingsfile);
    // do stuff here
}

$ Settingsarray é uma matriz de nomes de arquivos de uma pasta particular.

O problema é que cada $ settingsfile define constantes (com os mesmos nomes), o que, naturalmente, não pode ser redefinido.

Que possível métodos existem para evitar erros que ocorrem nesta situação?

Duas opções que eu posso pensar de incluir, alterar todas as constantes a variáveis ​​e usando namespaces PHP.

No entanto, eu não sei como eu iria sobre usando namespaces, seria necessária a declaração no início de cada US $ settingsfile? Existe um método de isolar constantes, ariables e funções sem usar namespaces?

O que eu realmente amo, é ser capaz de fazer algo tão simples como:

foreach ($settingsarray as $settingsfile)
{
    {//added braces to indicate where the isolation is
        include ($settingsfile);
        // do stuff here
    }//what happens in here does not affect what happens outside of here
}

Eu deveria apenas observar, isso é parte de um novo recurso, e é a única parte do código que carrega todos os $ settingsfiles. O resto do código só já carrega um arquivo de cada vez. Uma razão que eu estou usando constantes é para que eu não precisa se preocupar com a definição de variáveis ​​global para ser capaz de acessá-los funções dentro.

Publicado 19/05/2009 em 13:55
fonte usuário
Em outras línguas...                            


5 respostas

votos
4

Minha resposta é um pouco complexo, mas deve funcionar para você muito bem. Estou assumindo que você tem uma tonelada destes arquivos de configurações, já que é tão avesso a mudar cada um individualmente.

Se você é capaz de usar namespaces, eu vou assumir que você já atualizou para o PHP 5.3RC2. Copie o seguinte em um arquivo .php, e mudar o namespace ao seu gosto:

<?php
namespace myapp\config;

function define($key, $val) {
    Config::set($key, $val);
}

class Config {
    private $vars = array();

    // This class should not be instantiated
    private function __construct() {}

    public function set($key, $val) {
        self::$vars[$key] = $val;
    }

    public function get($key) {
        return isset(self::$vars[$key]) ? self::$vars[$key] : NULL;
    }
}

?>

Que incluem em seu código, e agora a fazer tudo o trabalho é uma simples questão de mudar o

<?php

em suas configurações de arquivos para

<?php namespace myapp\config;

Se você tem uma tonelada deles, um comando rápido 'sed' no seu terminal deve cuidar dela muito bem, tudo em uma só penada.

Se eu perder-lo sobre como usar o meu código, aqui está um exemplo:

<?php
require_once('the_php_file_i_just_gave_you.php');
use \myapp\config\Config;

foreach ($settingsarray as $settingsfile) {
    include ($settingsfile);
    $varname = 'key';
    echo "In this file, '$varname' equals: " . Config::get($varname);
}

?>

Boa sorte!

Respondeu 19/05/2009 em 19:34
fonte usuário

votos
1

Você tem poucas opções:

Use PHP Namespaces

Surpreendentemente, PHP realmente tem suporte para namespaces . Fiquei muito surpreso ao descobrir isso desde que tenho vindo a trabalhar em PHP durante anos e nunca ter ouvido falar deste recurso. É provável que um recurso mais recente e um que não é comumente usado, então eu não iria sugerir a utilização deste método

Use Constantes Classe

Você pode usar as classes e constantes da classe para carregar suas configurações. Constantes da classe são locais para a classe que define, então você não vai precisar se preocupar com colisões de nomes dentro da classe. Você provavelmente precisará fazer mais do que incluir o arquivo, mas você poderia chamar um método em cada classe, como defineConstants () ou loadConfiguration () que define as constantes de aplicação, mantendo as constantes de classe para uso interno.

Utilize funções para estender as Configurações

Outra idéia é criar uma matriz configurações e funções separadas para 'estender' essas configurações. Dessa forma, você pode sobre-escrever qualquer configuração em funções subseqüentes sem causar um erro. Finalmente, se você quiser colocar aqueles em constantes, você poderia loop sobre a matriz e usar define () para definir as constantes.

Existem muitas outras maneiras de conseguir o que você está tentando fazer, mas estas são apenas algumas idéias.

Respondeu 19/05/2009 em 14:30
fonte usuário

votos
1

não é fácil, mas você pode ler o arquivo php com file_get_contents ($ settingsfile), em seguida, reescrever as constantes e eval o código.

$settingsstr = file_get_contents($settingsfile);
$settingsstr = preg_replace('/<\?\w*(.*)/', '\\1', $settingsstr);//get rid of the php open tag
$settingsstr = preg_replace('/define\("(\w+)"/', 'define("NAMESPACE_\\1"', $settingsstr);
eval($settingsstr);
Respondeu 19/05/2009 em 14:30
fonte usuário

votos
1

Ok, então se eu estou entendendo corretamente, dentro desse loop que você gostaria de fazer as coisas com as constantes definidas dentro de cada um $settingsfilee, em seguida, basicamente se livrar deles depois de cada loop?

Ao contrário de variáveis, uma constante é um valor que, uma vez definida, não pode ser alterado ou desativado durante a execução do seu script src

Sua única opção é para alterar as define()declarações de variáveis.

Respondeu 19/05/2009 em 14:00
fonte usuário

votos
0

Um arquivo de configurações não devem contan código PHP. Deve ser algum tipo de formato "padrão". http://www.php.net/parse_ini_file

  • Na primeira etapa (em sua foreach) você lê todos os arquivos
  • Recolher as variáveis ​​em uma matriz temporária
  • Em outro loop sobre essa matriz, você pode defini-los como constantes.

Se você se sentir rotineiramente a necessidade de "redefinir constantes", então algo está amish no design do aplicativo.

Respondeu 19/05/2009 em 14:54
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more