require_once проблема с шаблонизацией - PullRequest
0 голосов
/ 20 июля 2009

Я новичок в MVC и переделываю большую часть своего кода.

У меня есть master.php (индекс), который имеет:

<?php require_once("header.php"); ?>

Оба master.php и header.php находятся в одной папке, но я получаю следующую ошибку:

Предупреждение: require_once (1) [function.require-Once]: не удалось открыть поток: нет такого файла или каталога в /Users/MyName/Sites/MySite/Views/master.php в строке 15

Неустранимая ошибка: require_once () [function.require]: Не удалось открыть обязательное '1' (include_path = '.:') в /Users/MyName/Sites/MySite/Views/master.php в строке 15

Этого раньше не было. (Файлы были все в корневой папке). Я не вижу, в чем проблема, так как они находятся в одной папке - мне не нужно возвращаться '../' или ссылаться на какие-либо другие папки. Что мне здесь не хватает?

Спасибо.

Ответы [ 4 ]

5 голосов
/ 20 июля 2009

В своем комментарии вы говорите, что ваш код:

<?php require_once("header.php") or die; ?>

пожалуйста, попробуйте опустить "или умри" -> ist не обязательно, потому что require_once вызовет фатальную ошибку, если файл не найден.

Edit: Я проверил это, пропустите "или умри", и оно будет работать.

Редактировать 2: Объяснение, почему это произошло: Приведенный выше код также можно записать так:

require_once ( ("header.php") or die() );

Поскольку require_once не является функцией, а выражением в php, фигурные скобки являются необязательными, php интерпретирует вышеупомянутое как логическое выражение, где строка «header.php» оценивается как логическое «true». Значение True преобразуется в строку (в результате получается «1»), и эта строка возвращается, чтобы потребовать один раз.

Таким образом, приведенный выше код интерпретируется как

require_once("1")

Вот как это интерпретируется шаг за шагом:

(("header.php") or die()) = (TRUE or die())
(TRUE or die()) = TRUE 
(string) TRUE = '1';

надеюсь, это поможет;)

1 голос
/ 20 июля 2009

Это может быть связано с тем, что master.php включен или требуется другим файлом сценария, который не находится в том же каталоге , что и header.php. То есть, когда вы посещаете индекс, знаете ли вы, какой файл вызывается / анализируется?

Посмотрите документацию для include(), которая также относится к require():

Файлы для включения сначала просматриваются для каждой записи include_path относительно текущей работы каталог, а затем в каталоге текущего скрипта. Например. если твой include_path - это библиотеки, текущие рабочий каталог / www /, вы включены include / a.php и есть включите "b.php" в этот файл, b.php впервые просматривается в / www / библиотеки / а затем в / www / include /

Обновление

Обращаясь к некоторым комментариям: я не говорил, что include () изменит CWD. Я говорю, что если CWD не тот, где находятся оба файла master / header.php, это может быть проблемой.

Например, скажем, у вас есть index.php в папке, отличной от master.php и header.php; оно включает или требует master.php, используя правильный путь к нему. Теперь master.php имеет утверждение:

<?php require_once("header.php"); ?>

Однако в этот момент CWD не содержит header.php, поскольку CWD соответствует index.php.

Чтобы это исправить, вам нужно вызвать require_once с правильным путем от CWD текущего сценария к header.php, НЕ путём от master.php.

1 голос
/ 20 июля 2009

PHP начинает искать «header.php» в корневой папке и не может его найти. Если он находится в том же каталоге, что и текущий скрипт, вы должны использовать магическую константу __DIR__:

<?php require_once __DIR__ . '/header.php'; ?>
0 голосов
/ 20 июля 2009

Вы должны иметь строку 15 как это:

<?php (require_once("header.php")) or die(); ?>

Однако, поскольку, когда header.php не найден, требование является фатальным, тогда вы должны иметь:

<?php (include_once("header.php")) or die(); ?>

или

<?php require_once("header.php"); ?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...