Как работают пути к файлам в 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")
Спасибо!
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' );
В дополнение к тому, кто ответил с именем dirname(ФАЙЛ):
PHP 5.3 добавляет DIR магическую константу. Итак, в PHP 5.3
file_get_contents(__DIR__."/body.html");
Должен сделать это за вас.
Нет, в этом нет ничего странного.
PHP запускается с рабочим каталогом. Обычно это каталог, в котором находится скрипт "запись". Этот рабочий каталог не изменяется при выполнении включенного сценария.
Если вы хотите прочитать что-то в каталоге текущего выполняемого файла, попробуйте что-то вроде
$path = realpath(dirname(__FILE__)).DIRECTORY_SEPARATOR."body.php";
Вам нужно определить константу BASEPATH
в сценарии ввода... а затем ссылаться на все файлы, которые требуются file_get_contents()
относительно BASEPATH
Таким образом, это может быть что-то вроде:
define("BASEPATH","/var/www/htdocs/");
//and then somewhere else
file_get_contents(BASEPATH."body/body.html");
Если вы хотите узнать, в каком каталоге находится текущий файл, попробуйте dirname(__FILE__)
. Вы должны быть в состоянии работать оттуда.