Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Pessoal, estou começando a trabalhar com o PHP agora e tenha a seguinte dúvida.
Hoje quando quero incluir um .php na minha página estou usando o usando o código abaixo para certificar de que o caminha esteja correto.
include ($_SERVER['DOCUMENT_ROOT']. substr($_SERVER['PHP_SELF'],0, strpos($_SERVER['PHP_SELF'],"/",1))."/modelo/modelo.php");
Acontece que quando tento executar esse php via DOS assim: C:\xampp\htdocs\Projeto\modelo>php olamundo.php
Levando em consideração o arquivo olamundo.php possui no início o código mostrado acima.
Ele retorna erro dizendo que não encontra o modelo.php
Se rodar o olamundo.php via browser funciona mas, via linah de comando não.
Alguém pode me informar uma maneira melhor de incluir os arquivos no ínicio e ter certeza de que vai ser encontrado?
Desde já agradeço.
Um complemento aliado à dica do hinom.
O uso de dirname( __FILE__ ) deve ser feito no primeiro arquivo a ser acessado pela aplicação. Se esse arquivo for index.php mas nele houver um include para outro, como config.php, presente no mesmo diretório que o index.php, defina nele.
Assim, sempre que o index.php a constante estará definida. E todo e qualquerinclude ficará mais fácil.
Obrigado hinom, sua resposta ajudou bastante.
Agora ficou assim:
include(dirname(dirname(__FILE__))."/modelo/modelo.php");
E rodou direitinho no DOS via linha de comando.
excelente obervação do Bruno.
é importante para não criar confusão.
preferi não extender muito o post, para postar em separado, como complemento, outras dicas:
há casos onde fica muito extenso usar dirname( dirname ( dirname() ) ) ...
em casos onde for recuar mais que dois diretórios é melhor usar o DiRECTORY_SEPARATOR
exemplo usando o caso do Brulec e aproveitando para corrigir, pois apesar da dica, continuou usando as barras diretamente no código:
define( 'DS', DIRECTORY_SEPARATOR );
include( dirname( dirname( __FILE__ ) ) . DS . 'modelo' . DS . 'modelo.php' ); // assim estará compatível com sistemas windows e unix
// ou usando o modo mais simples recuando diretórios usando dois pontos ( .. )
// include( dirname( __FILE__ ) . DS . '..' . DS . 'modelo' . DS . 'modelo.php' );
E rodou direitinho no DOS via linha de comando.
Quanto a isso, outra observação,
Evite usar a função realpath() para essa finalidade, porque quando o php é executado por linha de comando, o realpath obtém o caminho de onde está o executável do interpretador do PHP ao invés do path real do arquivo. Por isso, sempre utilize o dirname( __FILE__ )
Há muitos livros ( mal escritos ) e também artigos na internet que ensinam a usar realpath para esse fim, mas não utilize, pois estão errados.
Obrigado a todos pelas respostas e dicas.
Só mais uma coisa.
Esse projeto está rodando tanto em linux como em Windows e todos os includes eu utilizo essa barra "/" e funciona perfeitamente sem utilizar a constante DIRECTORY_SEPARATOR .
depende da versão do sistema operacional
suponha que um dia tenha que hospedaar o sistema num host que tenha, por exemplo windows 2003 server ou pior, windws 2000..
aí tera problemas
ou ainda pode acontecer de uma próxima versão do windows volte a interpretar como barra invertida somente, negando a barra normal.. aí terá problemas.
por isso, é melhor manter o sistemas o mais flexíveis possível, abstraindo dados de forma mais segura.
recomendo usar a constante mágica
__FILE__
exemplo
execute isso e veja o resultado
se quiser recuar dois diretórios
echo dirname( dirname( __FILE__ ) );
defina também o separador de diretórios.
o php também oferece uma constante
"DIRECTORY_SEPARATOR"
define( 'DS', DIRECTORY_SEPARATOR ); // não é necessário definir nova constante, mas devido ao tamanho da string original ser extensa, a maioria opta por uma sigla.
o motivo de usar o DIRECTORY_SEPARATOR é que em abmientes Windows o separador de diretórios á uma barra invertida \ ( backslash ), em ambiente unix é barra normal / ( slash )
ao invés de escrever
$path = '/var/www/website/';
faça:
$path = DS . 'var' . DS . 'www' . DS . 'website' . DS;
consulte:
http://php.net/manual/en/language.constants.predefined.php
http://php.net/manual/en/dir.constants.php