Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

_JD

[Resolvido] Caminhos relativos (Include / Require )

Recommended Posts

Boa tarde.

Gostaria de uma ajuda em relação ao problema que me deparei.

 

Tenho a seguinte estrutura de pastas:

Pasta A

a.php

Pasta B

b.php

Pasta C

c.php

 

O arquivo b.php tem um iclude para o arquivo A/a.php, feito da seguinte forma: require_once("../A/a.php");

O arquivo a.php tem apenas um echo pra indicar que foi incluído.

O arquivo c.php tem um include para B/b.php que por sua vez inclui o A/a.php, feito da seguinte forma: require_once("../B/b.php");

Os arquivos b.php e a.php se enxergam, porém quando carrego o c.php, dá erro que o a.php não foi encontrado:

 

Warning: require_once(../DAO/PessoaDAO.php) [function.require-once]: failed to open stream: No such file or directory in /var/www/projeto/class/Pessoa/pessoa.class.php on line 3

 

acima é o erro com a minha aplicação.

 

O que pode estar acontecendo?

 

No aguardo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Como eu faço pra usar o realpath() no include/require?

Tentei assim e não consegui:

require_once(realpath("../DAO/PessoaDAO.php"));

Tentei colocar numa variável e usar no include e também deu erro.

Compartilhar este post


Link para o post
Compartilhar em outros sites

O realpath serve para validar o caminho (true ou false) e retorna-lo absoluto canonicalizado.

Não vai funcionar dentro do include.

Primeiro você verifica , depois, se validar, você usa o include usando o caminho que você colocou no realpath.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Entendi.

Eu fiz a seguinte validação para testar:

if(realpath("../DAO/PessoaDAO.php")){
require_once("../DAO/PessoaDAO.php");
}else echo "Erro" ;

O "Erro" foi exibido.

Minha dúvida é a seguinte:

 

Estando no arquivo que chama o "/DAO/PessoaDAO.php" eles se "enchergam" normalmente, porém quando o arquivo é incluído por outro arquivo aí o path fica como inválido.

Deixa eu tentar melhorar isso:

Estando no arquivo teste.php que chama o pessoa.class.php, que por sua vez chama o pessoaDao.php, o erro é apresentado. Porém estando em pessoa.class.php e chamando o pessoaDao.php o erro não ocorre.

 

(Outra coisa que gostaria apenas de comentar é que fiquei realmente admirado com a solicitude do pessoal aqui. Muito obrigado desde já!)

Compartilhar este post


Link para o post
Compartilhar em outros sites

defina o caminho base numa constante

 

exemplo

 

<?php

define( 'DS', DIRECTORY_SEPARATOR );
define( 'BASE_DIR', dirname( __FILE__ ) . DS );

sempre que necessitar incluir um arquivo, utilize BASE_DIR como base inicial

/*
incluir arquivo 'a.php' que esteja dentro da pasta raíz '/'
*/
include BASE_DIR . 'a.php';


/*
incluir arquivo 'b.php' que esteja dentro da pasta '/foo'
*/
include BASE_DIR . 'foo' . DS . 'b.php';

?>

 

simples assim...

 

adote boas práticas de programação e não terá mais esse tipo de problema básico.

 

pesquise sobre MVC

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bacana hinom!

Mas se quero acessar por exemplo de uma pasta dentro de /foo, por exemplo estando em /foo/foo2/a.php, quero acessar /foo/foo1/b.php, como faço?

Vi que na forma que colocou ali, BASE_DIR é o caminho do arquivo atual e DS é o "/".

É que eu não queria abandonar minha estrutura de arquivos que mantém dentro da pasta Classes, todas as classes que usarei no site e tem em uma pasta chamada source, os códigos das páginas.

 

No aguardo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

o valor de BASE_DIR, dependerá do ponto de execução do script

 

se o script chamado estiver sempre dentro do diretório raíz (recomendado), não precisa alterar nada..

 

caso contrário, terá que prestar muita atenção com recuo de diretórios sempre o arquivo em EXECUÇÃO, estiver num local diferente da pasta raíz.

 

vamos supor que uma nova situação:

 

http://localhost/x.php
x.php está na pasta raíz, portanto, o código ficaria assim

http://forum.imasters.com.br/public/style_emoticons/default/seta.gif

<?php

define( 'DS', DIRECTORY_SEPARATOR );
define( 'BASE_DIR', dirname( __FILE__ ) . DS );

sempre que necessitar incluir um arquivo, utilize BASE_DIR como base inicial

/*
incluir arquivo 'a.php' que esteja dentro da pasta raíz '/'
*/
include BASE_DIR . 'a.php';


/*
incluir arquivo 'b.php' que esteja dentro da pasta '/foo'
*/
include BASE_DIR . 'foo' . DS . 'b.php';

?>

 

 

 

 

 

http://localhost/foo/x.php
x.php está numa pasta um nível abaixo da pasta raíz, portanto, o código ficaria assim

http://forum.imasters.com.br/public/style_emoticons/default/seta.gif

<?php

define( 'DS', DIRECTORY_SEPARATOR );
define( 'BASE_DIR', dirname( dirname( __FILE__ ) ) . DS );

sempre que necessitar incluir um arquivo, utilize BASE_DIR como base inicial

/*
incluir arquivo 'a.php' que esteja dentro da pasta raíz '/'
*/
include BASE_DIR . 'a.php';


/*
incluir arquivo 'b.php' que esteja dentro da pasta '/foo'
*/
include BASE_DIR . 'foo' . DS . 'b.php';

?>

Repare que é usado dirname() duas vezes.

Cada dirname(), nesse caso, é equivalente a 1 recuo de diretório, com exceção do primeiro.

 

O importante é que seja definido à constate "BASE_DIR", o caminho físico absoluto da pasta raíz.

 

Se conseguir manter esse controle, não terá mais nenhum problema com essa questão.

 

 

 

obs: evite o uso de realpath().

Realpath retorna, como o prórpio nome diz, o caminho real da execução de um determinado script.

Em situações de execução por linha de comando (shell), o realpath não retorna o caminho de onde está o script, mas sim, de onde está o programa que executa o php.exe (plataforma windows).

Por isso, o uso de dirname( __FILE__ ) é a alternativa recomendável ao realpath()

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa tarde.

Minhas tentativas com o uso das dicas do hinom têm dado certo. Realmente foi de muita utilidade ter lançado mão do fórum pra conseguir respostas às minhas questões.

Se possível gostaria de uma orientação:

É válido, do ponto de vista de boas práticas de programação, usar um arquivo com estas configurações de include? Por exemplo, eu posso criar constantes definindo os níveis possíveis que irei usar e guardá-las em um arquivo que chamarei antes dos outros includes, ou devo fazer os defines() no script que usará os includes? Eu pensei em usar uma constante para o recuo de um nível e outra para dois, algo deste tipo é aceitável?

 

No aguardo.

 

lendo sobre mvc...

Compartilhar este post


Link para o post
Compartilhar em outros sites

desde qeu funcione, sim.. é "aceitável"

 

mas continue lendo sobre MVC e entenderá que é uma padronização simples que lhe permitirá organizar a estrutura do sistema de arquivos de modo prático e seguro, e passará a se preocupar mais com a regra do negócio do que com a parte básica de estrutura de código.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Uma pequena dica, para que vcoê "se encontre" no que vai ler pela frente, seria a modificação do include_path(), adicionando mais caminhos, nomenclatura das classes que vai usar e o recursos de autoload() das mesmas.

 

Um bom exemplo é o Zend Framework, mesmo que nele, às vezes, um nome de classe possa ficar bem extenso.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa tarde pessoal.

Gostaria de agradecer às dicas que me foram muito úteis.

Estou lendo sobre MVC e vou adotar boas práticas de programação.

 

Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.