calling include from an included file

Viewed 19174

So, examining this directory structure

  • /include_one.php
  • /include_two.php
  • /directory/main_file.php

Assume that I am in /directory/main_file.php and I call include('../include_one.php'); inside of include_one.php, to include include_two.php. Do I need to call include('include_two.php); or include('../include_two.php');?

So my question is: When including a file, is the 'relative include path' shifted to the included file, or does it remain at the main including file?

I am aware that the best alternative would be to have a config.php which contains the root_path, however this is not possible at this stage.


update:
So, im not sure who is right, as here is my test

directory structure

/include.php
/start/start.php
/folder1/includeone.php
/folder1/folder2/includetwo.php

and here is the contents of each file

start.php

<?php 
  echo 'including ../include.php<br />';
  include('../include.php');
?>

include.php

<?php 
  echo 'including folder1/includeone.php<br />';
  include('folder1/includeone.php');
?>

includeone.php

<?php 
  echo 'including folder2/includetwo.php<br />';
  include('folder2/includetwo.php');
?>

includetwo.php

<?php 
  echo 'done<br />';
?>

and the output is

including ../include.php
including folder1/includeone.php
including folder2/includetwo.php
done

4 Answers

The include path is relative to the first file in the include chain.

A good way to ensure the correct include path is to always include from the document root.

This is done like this:

include $_SERVER['DOCUMENT_ROOT'] . '/folder1/folder2/includetwo.php';

Two demos of how include works in PHP

Im 2010 the author has wrote in his question:

So, im not sure who is right, as here is my test ...

and also in the comment:

still no answer to my update...

So I suggest my tests to understand how PHP includes work. The results were the same for versions 5 and 7.

Test 1

Files and directories:

  1. /index.php
    <?php
    include 'subdirectory/index.php';
  1. /subdirectory/index.php
    <?php
    include 'test.php';
  1. /subdirectory/test.php
    <?php
    echo __FILE__;

The output:

/subdirectory/test.php

This test work well, because there is one and only one candidate for every include.

This requirement is also met for the test from the updated question. This is why it works well too.

Test 2

Let's copy test.php to the main root. So the new project structure is as follows:

/index.php
/test.php
/subdirectory/index.php
/subdirectory/test.php

Now the output becomes different::

/test.php

Second test has another result, because there are two candidates for the instruction include 'test.php'; and PHP chose by itself which file to include.

This is why the practice suggested by the author of the accepted answer saves the project from surprises.

Related