Pergunta

Eu tenho uma estrutura de diretórios como a seguinte;

script.php

inc/include1.php
inc/include2.php

objetos/objeto1.php
objetos/objeto2.php

sabão/sabão.php

Agora, eu uso esses objetos em ambos script.php e /soap/soap.php, eu poderia movê-los, mas quero uma estrutura de diretórios assim por um motivo específico.Ao executar script.php o caminho de inclusão é inc/include.php e ao executar /soap/soap.php isso é ../inc, caminhos absolutos funcionam, /mnt/webdev/[project name]/inc/include1.php... Mas é uma solução feia se eu quiser mover o diretório para um local diferente.

Então, existe uma maneira de usar caminhos relativos ou uma maneira de gerar programaticamente o "/mnt/webdev/[project name]/"?

Foi útil?

Solução

Isso deve funcionar

$root = realpath($_SERVER["DOCUMENT_ROOT"]);

include "$root/inc/include1.php";

Editar: melhoria adicional por australiano

Outras dicas

Você pode usar caminhos relativos.Tentar __FILE__.Esta é uma constante PHP que sempre retorna o caminho/nome do arquivo do script em que está.Então, em soap.php, você poderia fazer:

include dirname(__FILE__).'/../inc/include.php';

O caminho completo e o nome do arquivo do arquivo.Se usado dentro de uma incluir, o nome do arquivo incluído é retornado.Desde PHP 4.0.2, __FILE__ Sempre contém um caminho absoluto com symblinks resolvidos, enquanto nas versões mais antigas continha caminho relativo sob algumas circunstâncias. (fonte)

Outra solução seria definir um incluir caminho em seu httpd.conf ou em um arquivo .htaccess.

dê uma olhada em http://au.php.net/reserved.variables

Acho que a variável que você está procurando é: $_SERVER["DOCUMENT_ROOT"]

Você pode definir uma constante com o caminho para o diretório raiz do seu projeto e colocá-la no início do caminho.

Outra maneira de lidar com isso que elimina qualquer necessidade de inclusões é usar o método carregamento automático recurso.Incluir tudo o que seu script precisa "Just in Case" pode prejudicar o desempenho.Se todas as suas inclusões forem definições de classe ou interface e você quiser carregá-las somente quando necessário, você poderá sobrecarregar o __autoload() funcione com seu próprio código para encontrar o arquivo de classe apropriado e carregá-lo somente quando for chamado.Aqui está o exemplo do manual:

function __autoload($class_name) {
    require_once $class_name . '.php';
}

$obj  = new MyClass1();
$obj2 = new MyClass2(); 

Contanto que você defina suas variáveis ​​include_path adequadamente, você nunca precisará incluir um arquivo de classe novamente.

Outra opção, relacionada à de Kevin, é usar __FILE__, mas substitua o nome do arquivo php dentro dele:

<?php

$docRoot = str_replace($_SERVER['SCRIPT_NAME'], '', __FILE__);
require_once($docRoot . '/lib/include.php');

?>

Eu tenho usado isso há algum tempo.O único problema é que às vezes você não tem $_SERVER['SCRIPT_NAME'], mas às vezes há outra variável semelhante.

Achei que isso funcionou muito bem!

function findRoot() { 
    return(substr($_SERVER["SCRIPT_FILENAME"], 0, (stripos($_SERVER["SCRIPT_FILENAME"], $_SERVER["SCRIPT_NAME"])+1)));
}

Usar:

<?php

function findRoot() {
    return(substr($_SERVER["SCRIPT_FILENAME"], 0, (stripos($_SERVER["SCRIPT_FILENAME"], $_SERVER["SCRIPT_NAME"])+1)));
}

include(findRoot() . 'Post.php');
$posts = getPosts(findRoot() . 'posts_content');

include(findRoot() . 'includes/head.php');

for ($i=(sizeof($posts)-1); 0 <= $i; $i--) {
    $posts[$i]->displayArticle();
}

include(findRoot() . 'includes/footer.php');

?>

Acho que a melhor maneira é colocar suas inclusões no caminho de inclusão do PHP.Existem várias maneiras de fazer isso, dependendo da sua configuração.

Então você pode simplesmente consultar

require_once 'inc1.php';

de dentro de qualquer arquivo, independentemente de onde ele esteja, seja em seus arquivos incluídos ou acessíveis pela Web, ou em qualquer nível de subdiretórios aninhados.

Isso permite que você inclua arquivos fora da raiz do servidor web, o que é uma prática recomendada.

por exemplo.

site directory
    html (web root)
        your web-accessible files
    includes
        your include files

Além disso, verifique __autoload para carregamento lento de arquivos de classe

http://www.google.com/search?q=setting+php+include+path

http://www.google.com/search?q=__autoload

require(str_repeat('../',(substr_count(getenv('SCRIPT_URL'),'/')-1))."/path/to/file.php");

Eu uso esta linha de código.Ele volta ao “topo” da árvore do site e depois vai até o arquivo desejado.

Por exemplo, digamos que eu tenha esta árvore de arquivos:

domínio.com/aaa/index.php
domínio.com/bbb/ccc/ddd/index.php
domínio.com/_resources/functions.php

Posso incluir o arquivo functions.php de onde eu estiver, apenas copiando e colando

require(str_repeat('../',(substr_count(getenv('SCRIPT_URL'),'/')-1))."/_resources/functions.php");

Se precisar usar esse código muitas vezes, você pode criar uma função que retorne o str_repeat('../',(substr_count(getenv('SCRIPT_URL'),'/')-1)) papel.Depois é só inserir esta função no primeiro arquivo que você incluir.Eu tenho um arquivo "initialize.php" que incluo no topo de cada página php e que contém esta função.Na próxima vez que tiver que incluir arquivos, na verdade apenas uso a função (chamada path_back):

require(path_back()."/_resources/another_php_file.php");

@Flubba, isso me permite ter pastas dentro do meu diretório de inclusão?diretórios flat include me dão pesadelos.já que todo o diretório de objetos deve estar no diretório inc.

Ah, sim, absolutamente.Por exemplo, usamos uma única camada de subpastas, geralmente:

require_once('library/string.class.php')

Você precisa ter cuidado ao confiar muito no caminho de inclusão em sites de tráfego muito alto, porque o php precisa procurar no diretório atual e depois em todos os diretórios no caminho de inclusão para ver se o seu arquivo está lá e isso pode ficar lento as coisas se você estiver sendo martelado.

Então, por exemplo, se você estiver fazendo MVC, você colocaria o caminho para o diretório do seu aplicativo no caminho de inclusão e, em seguida, especificaria referir-se a coisas no formulário

'model/user.class'
'controllers/front.php'

como queiras.

Mas, de modo geral, ele apenas permite que você trabalhe com caminhos realmente curtos em seu PHP que funcionarão de qualquer lugar e é muito mais fácil de ler do que todo aquele malarkey de raiz de documento de caminho real.

O benefício dessas alternativas baseadas em scripts sugeridas por outros é que elas funcionam em qualquer lugar, mesmo em caixas compartilhadas;definir o caminho de inclusão requer um pouco mais de reflexão e esforço, mas como mencionei, permite que você comece a usar __autoload, que é o mais legal.

Se você for incluir um caminho específico na maioria dos arquivos do seu aplicativo, crie uma variável global para sua pasta raiz.

define("APPLICATION_PATH", realpath(dirname(__FILE__) . '/../app'));
or 
define("APPLICATION_PATH", realpath(DIR(__FILE__) . '/../app'));

Agora esta variável global "APPLICATION_PATH" pode ser usado para incluir todos os arquivos em vez de chamar realpath() toda vez que você incluir um novo arquivo.

EX:

include(APPLICATION_PATH ."/config/config.ini";

Espero que ajude ;-)

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