简体   繁体   中英

Absolute (or relative?) path in PHP

Sorry for asking it as it may be answered many times before, but my question is little bit different

I have tree like

/var/www/path/to/my/app/
   -- index.php
   -- b.php
   -- inc/
      -- include.php

(I'm accessing inc/include.php from index.php,

include "inc/include.php";

)

but in include.php, I need to get absolute path to APPLICATION root, not DOCUMENT_ROOT so in result, I need to be able to use this command

//inc/include.php
include(APP_ROOT."/b.php");

repeating, I do NOT WANT TO CALL IT LIKE

include("../b.php");

is there native function, if possible?

UPDATE:

I am wanting to get PATH by PHP as any open source need to have this path detection why? If I would want to include inc/include.php from ajax/1/somethiing.php, it success but inc/include.php then tries to include ajax/b.php instead of b.php

For Pekka:

I have this tree

-- index.php
-- b.php
-- inc/
    -- include.php
-- ajax/
    -- 1/
       -- ajax.php

Now look. From index.php, you'll call inc/include.php

include("inc/include.php"); //included file

now, included file searchs for

include("../b.php");

It will work, but! If I would call include of inc/include.php from ajax/1/ajax.php, like this

include("../../inc/include.php");

it will work, but included file will try to include

../b.php 

instead of ../../b.php as path is relative to file which INCLUDED that inc/include.php Got it ?

is there native function, if possible?

no. The document root is the only thing you can get from PHP. (Note however that in your scenario, you can simply call include("b.php"); because the script is still in the context of index.php.)

Re your update:

You can define a global application root in a central configuration file. Say you have config.php in your app root. Then do a

define("APP_ROOT", dirname(__FILE__));

you still have to include the config file, and you have to use relative paths for it, eg

include ("../../../config.php");

but once you have done that, you can work relative to the app root inside the script:

include (APP_ROOT."/b.php");  <--  Will always return the correct path

You can resolve the path with the current file as the base

include dirname(__FILE__) . DIRECTORY_SEPARATOR . '/../b.php';

or since PHP5.3

include __DIR__ . \DIRECTORY_SEPERATOR . '/../b.php';

Add to your index.php:

$GLOBALS['YOUR_CODE_ROOT'] = dirname(__FILE__);

Add to your inc/include.php :

require_once $GLOBALS['YOUR_CODE_ROOT'].'/b.php';

Just use

define('APP_ROOT', 'your app root');

in index.php for example. Or in a config file.

虽然它没有为您定义应用程序的根路径,但可能有必要查看set_include_path()

If you only know the relative path, then you have to at least start with a relative path. You could use realpath to return the canonicalized absolute pathname, and then store that somewhere.

In your index.php , or a config file:

define(
    'INC',
    realpath(dirname(__FILE__)) .
    DIRECTORY_SEPARATOR .
    'inc' .
    DIRECTORY_SEPARATOR
);

Elsewhere:

include(INC . 'include.php');

Alternatively, define a few constants for the different locations:

define('DOCUMENT_ROOT', realpath(dirname(__FILE__)) . DIRECTORY_SEPARATOR);
define('INC', DOCUMENT_ROOT . 'inc' . DIRECTORY_SEPARATOR);
define('AJAX', DOCUMENT_ROOT . 'ajax' . DIRECTORY_SEPARATOR);

Elsewhere:

include(DOCUMENT_ROOT . 'b.php');
include(INC . 'include.php');
include(AJAX . 'ajax.php');

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM