Как работают пути к файлам в php?


Проблема в том, что я использую метод file _ get _ contents("body.html") в классе, который находится в той же папке, что и body.html. Проблема в том, что я получаю сообщение об ошибке, в котором говорится, что файл не найден. Это потому, что мне из другого класса требуется файл, в котором используется метод file _ get _ contents("body.html"), и вдруг мне приходится использовать "../body/body.html "как путь к файлу..!

Разве это не немного странно? Класс, вызывающий метод file _ get _ contents("body.html"), находится в той же папке, что и body.html, но поскольку класс требуется где-то из другого класса в противном случае, мне нужен новый путь к файлу?!

Вот краткий список каталогов и файлов:

Lib/main/main.php
lib/body/body.php
lib/body/body.html

Это body.php :

class Body {

 public function getOutput(){
  return file_get_contents("body.html");
 }
}

Это main.php :

require '../body/body.php';

class Main {

 private $title;
 private $body;

 function __construct() {

  $this->body = new Body();
 }

 public function setTitle($title) {
  $this->title = $title;
 }

 public function getOutput(){
  //prints html with the body and other stuff.. 
 }
}

$class = new Main();
$class->setTitle("Tittel");
echo $class->getOutput();

То, о чем я прошу, - это исправить ошибку, которая body.php находится в той же папке, что и body.html, но мне нужно изменить путь, когда другой класс требует body.php откуда-то еще в методе file _ get _ contents("body.html")

Спасибо!

Author: Bart Kiers, 2009-11-11

5 answers

Область действия файловых функций PHP всегда начинается с точки первого файла в стеке выполнения.

Если запрашивается index.php и включает classes/Foo.php, который, в свою очередь, должен включать'body/body.php ', область действия файла будет такой, как index.php.

По сути, текущий рабочий каталог .

Однако у вас есть несколько вариантов. Если вы хотите включить/открыть файл в том же каталоге, что и текущий файл, вы можете сделать что-то вроде это

file_get_contents( dirname( __FILE__ ) . '/body.html' );

Или вы можете определить базовый каталог в константе и использовать его для включения

define( 'APP_ROOT', '/path/to/app/root/' );
file_get_contents( APP_ROOT . 'lib/body/body.html' );
 8
Author: Peter Bailey, 2009-11-10 21:30:16

В дополнение к тому, кто ответил с именем dirname(ФАЙЛ):

PHP 5.3 добавляет DIR магическую константу. Итак, в PHP 5.3

file_get_contents(__DIR__."/body.html");

Должен сделать это за вас.

 3
Author: johannes, 2009-11-10 21:43:29

Нет, в этом нет ничего странного.

PHP запускается с рабочим каталогом. Обычно это каталог, в котором находится скрипт "запись". Этот рабочий каталог не изменяется при выполнении включенного сценария.

Если вы хотите прочитать что-то в каталоге текущего выполняемого файла, попробуйте что-то вроде

$path = realpath(dirname(__FILE__)).DIRECTORY_SEPARATOR."body.php";
 1
Author: gnud, 2009-11-10 21:25:38

Вам нужно определить константу BASEPATH в сценарии ввода... а затем ссылаться на все файлы, которые требуются file_get_contents() относительно BASEPATH

Таким образом, это может быть что-то вроде:

define("BASEPATH","/var/www/htdocs/");

//and then somewhere else
file_get_contents(BASEPATH."body/body.html");
 1
Author: ekhaled, 2009-11-10 21:36:51

Если вы хотите узнать, в каком каталоге находится текущий файл, попробуйте dirname(__FILE__). Вы должны быть в состоянии работать оттуда.

 1
Author: Josh Bleecher Snyder, 2009-11-11 13:58:10