Как работает filepath в php? - PullRequest
       33

Как работает filepath в php?

2 голосов
/ 11 ноября 2009

Проблема в том, что я использую метод 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")

Спасибо!

Ответы [ 5 ]

8 голосов
/ 11 ноября 2009

Область видимости файловых функций 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' );
3 голосов
/ 11 ноября 2009

Как дополнение к тому, кто ответил с dirname ( FILE ):

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

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

Должно помочь тебе.

1 голос
/ 11 ноября 2009

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

1 голос
/ 11 ноября 2009

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

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

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

//and then somewhere else
file_get_contents(BASEPATH."body/body.html");
1 голос
/ 11 ноября 2009

Нет, это не странно.

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

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

$path = realpath(dirname(__FILE__)).DIRECTORY_SEPARATOR."body.php";
...