PHP include_once: manipulação de importações, ou seja, para arquivos de configuração

votos
0

Vamos assumir que tem a seguinte estrutura:

index.php
config.inc.php
\ lib
\ lib \ common.php

Vários parâmetros como nome do banco de dados, usuário e co são configurados no config.inc.php. O que é a maneira correta de acessá-los ou seja, de uma função localizada no \lib\common.php. Eu realmente tenho que fazer um include_once(config.inc.php)dentro de cada função lá?

Ele não parece funcionar se:

  • config.inc.phpestá incluída uma vez uma vez em index.php, antes de incluir \lib\common.php
  • se config.inc.phpdefine todas as variáveis antes de incluir \lib\common.phpe todos os outros arquivos (desta forma eu só teria de incluir config.inc.phpem todos os arquivos centrais no nível deindex.php
  • também não funcionará se config.inc.phpestá incluído no topo da\lib\common.php

Muito obrigado - eu não era capaz de encontrar uma solução com o Google!

Solução

Eu incluí config.inc.phpuma vez em index.php(como sugerido por Galen) e usado global (como sugerido por David). Tudo está funcionando como eu esperaria que, muito obrigado!

Mais tarde eu vou definitivamente olhar em auto_prependcomo sugerido por n3rd, tkx para isso também!

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


5 respostas

votos
3

Você tem que usar a globalpalavra-chave para acessar as variáveis que foram definidas fora de uma função:

$var1 = "muh";
$var2 = "foo";

function test() {
    global $var1;
    echo "var1=$var1; var2=$var2\n";
}

imprimirá "var1=muh; var2=".

Respondeu 19/05/2009 em 16:38
fonte usuário

votos
2

Você simplesmente fazer:

include_once("..\\config.inc.php");

na parte superior da common.php.

Agora, existem algumas coisas aqui - primeiro as barras invertidas são irritantes, e você pode (mesmo em janelas, trocá-los por barras ( "../config.inc.php") Se você tem o diretório onde config.inc.. php está contido dentro de seu caminho de inclusão, você mesmo pode apenas fazer "config.inc.php".

Última e não menos importante, se os dados no config.inc.php é necessário para common.php para trabalhar, eu sugiro que você mudar para require_once () em vez disso, como que vai causar uma chamada para sair () ou morrer () no caso do arquivo deixa de ser incluídos, portanto, parar ainda mais a execução.

EDIT: Ah eu não detectar o que outros disseram. Para usar variáveis ​​que são declaradas fora de uma função dentro de uma função, você precisa deixar a função sabe que ele precisa "puxar" estas variáveis ​​dentro do escopo de função usando a palavra-chave global (como outros já disseram).

Considere o seguinte exemplo:

$var = "Hello World";
function changeVar(){
    $var = "Bye World!";
    echo $var . "\n";
}
changeVar();
echo $var;

A saída do código mencionado acima, não é:

Bye World!
Bye World!

mas sim:

Bye World!
Hello World

Isto é devido ao fato de que os US $ var DENTRO da função é a sua própria variável, diferente do $ var definida fora da função. Altere isso para:

$var = "Hello World";
function changeVar(){
    global $var;

    $var = "Bye World!";
    echo $var . "\n";
}
changeVar();
echo $var;

E agora você tem o resultado esperado:

Bye World!
Bye World!
Respondeu 19/05/2009 em 16:37
fonte usuário

votos
1

Se você incluir config.inc.php no arquivo index.php ... todos os arquivos que estão incluídos depois que ele será capaz de utilizar os dados dentro dela.

Se você tiver funções em common.php você vai ter que usar o mundial palavra-chave, ou passar os dados como argumentos, a fim de acessar os dados no config.inc.php

Respondeu 19/05/2009 em 16:46
fonte usuário

votos
0

IMHO isso não é uma boa prática para definir variáveis ​​em fins configuracionais. Você pode reescrever-los dentro de seu código. Melhor definir constantes. Como um benefício - eles estão no escopo global e você pode usá-los de qualquer lugar sem palavra-chave "global".

Eu costumo usar uma classe abstrata Config com métodos estáticos, que analisa dados externos (eu uso arquivos de configuração XML fora do DOCUMENT_ROOT) e, em seguida, fornece-lo, fundido a objetos, com um código como este

$dbalias = Config::get('db');
DB::connect($dbalias);
echo $dbalias->user . '@' . $dbalias->host;

É muito útil quando você trabalha com a ferramenta de equipe e uso de versões (como SVN). Evereyone em sua equipe a trabalhar em localhost uma comprometer tudo, mas arquivo de configuração local que não está sendo versão.

Não tenho certeza, que este caminho é o melhor, mas segura e muito confortável de código, para ler e apoiar.

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

votos
0

U usar o auto_prependrecurso para fazer exatamente isso. O arquivo prepended em seguida, procura-se a hierarquia de diretório do script atual e procura por arquivos que terminam com '.autoinc.php' e inclui-los em ordem inversa, ou seja, aqueles em subdiretórios pode substituir coisas definidas em arquivos mais acima na hierarquia. Isto é definido uma vez e funciona automaticamente em todos os lugares e é totalmente discreto. Eu acho que isso seja uma solução bastante bonito e universal.

Respondeu 19/05/2009 em 16:39
fonte usuário

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