Require_once не работает должным образом, когда требует файла из классов. Require_once не работает должным образом, когда требует файла из классов Если не работает include или require

Одна из самых занимательных и полезных возможностей php - подключение другого файла. Например, на сайте есть верхнее меню, нижнее и между ними само содержание страницы. И, например, на 10 страницах сайта используется нижнее меню. В какой-то момент в него потребовалось внести изменения. В html Вы бы вручную в каждом отдельном файле вносили изменения, но php позволяет существенно упростить работу с сайтом! Код нижнего меню может содержаться в отдельном файле, а на каждой из 10-ти страниц можно просто подключать этот отдельный файл! То есть все изменения нужно теперь вносить только в файл с меню, а на 10-ти других оно будет отображаться уже с изменениями.

Смысл подключения в php простым русским языком:

Файл 1.php
Верхнее меню

Файл 2.php
Нижнее меню

Файл example.php
Подкючаем Файл 1.php
Содержание страницы
Подкючаем Файл 2.php

В результате проработки файла example.php будет отображено
Верхнее меню
Содержание страницы
Нижнее меню
Соответственно, чтобы что-либо изменить в нижнем меню, нужно внести изменения только в файле 2.php

Путь к файлу

Подключение файла происходит согласно указанному к файлу пути. Есть два варианта пути: относительный и абсолютный. Относительный - это указание пути к подлючаемому файлу относительно файла с инструкцией подключения. Абсолютный - указание полного пути к подключаемому файла.

Код PHP

// пример относительного пути
include "include/ваш_файл.php"; // файл лежит в папке include, которая находится в той же директории, что и файл с подключением

// пример абсолютного пути
include $_SERVER["DOCUMENT_ROOT"]."/include/ваш_файл.php"; // $_SERVER["DOCUMENT_ROOT"] - указывает корневую директорию сайта

include и include_once

include() - конструкция, предназначенная для включения файлов в код сценария PHP во время исполнения сценария PHP. При обработке кода инструкция заменяется на содержимое присоединяемого файла. Предлагаю сразу рассмотреть пример.

Рассмотрим работу include на примере двух файлов: index.php и text.php . Для простоты работы допустим, что они лежат в одной директории.

Код PHP (файл index.php )

Echo "Обычный текст, содержащийся в основном файле";
include "text.php"; // подключаем содержимое файла text.php

?>
Код PHP (файл text.php )

Echo "Текст, содержащийся в подключаемом файле";

?>
В результате работы файла index.php отобразится:

Обычный текст, содержащийся в основном файле
Текст, содержащийся в подключаемом файле
Правда удобно? Теперь, поменяв содержимое в файле text.php будет совершенно другой результат работы index.php!

Теперь поговорим о другой конструкции - include_once . Она работает абсолютно также как и include, только создана позже и для тех случаев, когда нельзя повторно подключить файл. Например, Вы боитесь, что в результате ошибки можете подключить файл 2 и более раз, что скажется на некорректной работе страницы и получении соответствующего сообщения об ошибке.

Код PHP

Include_once "text.php"; // файл text.php будет подключен только один раз

// повторное подключения ниже не будет учтено и отображено
// и из-за него не будет выведено сообщение об ошибке
include_once "text.php"; // ничего не произойдёт

require и require_once

Инструкции require и require_once работают идентично include и include_once за исключением лишь одной особенности - в случае того, если подключаемый файл не будет найден, выполнение скрипта будет остановлено (сценарий дальше не будет считываться), в то время как include и include_once просто выводят предупреждение и продолжают дальнейшее выполнение скрипта.

Если не работает include или require

Чтобы понять причины того, почему не работает include, предлагаю проверить всё по шагам. Какими бы понятными и поверхностными не были указанные ниже пункты, проверьте всё с самого начала

1. Проверьте, работает ли Ваш сервер и php, работает ли вообще любой php код на сайте
2. Убедитесь, существует ли файл подключаемый файл
3. Проверьте, правильно ли введено название файла и расширение в подключении
4. Убедитесь, что подключаемый php-файл действительно находится по тому адресу, по которому указали
5. Попробуйте указать не относительный путь, а абсолютный (полный путь к файлу).

Пример Код PHP

Include "http://www.example.com/include/ваш_файл.php";

// DOCUMENT_ROOT - обозначает корневую директорию ресурса
include $_SERVER["DOCUMENT_ROOT"]."/include/ваш_файл.php";

6. Если у Вас не подключается файл и не отображается никакой ошибки, то в директории с файлом, который подключаете, создайте файл .htaccess со следующим содержимым

Php_flag display_errors On
или в файле php , перед подключением, вставьте следующую строку

Error_reporting(E_ALL);
И та, и другая настройки будут принудительно отображать ошибки

Спасибо за внимание!

Для любого web-разработчика пока нет более серьезной проблемы, как полная кроссбраузерность его продукта. Наверное, это одна из основных задач хорошего специалиста: добиться того, чтобы его сайт всегда правильно отображался во всех браузерах.

Параметр required , который иногда используется для input, не работает в древних IE, что просто нельзя так оставить. Пользователи-пенсионеры, которые до сих пор пользуются IE6 должны одинаково легко работать с вашим сайтом, наряду с пользователями Google Chrome последней версии. Кто, кроме web-разработчиков, о них может позаботиться.

О наболевшем, о Internet Explorer

Для нормальных браузеров, к которым можно отнести Firefox, Opera и Google Chrome, эта задача относительно легка. Даже давние версии этих браузеров одинаково хорошо отображают html-код, если в нем конечно же не используются какие-то новые технологии. Но чтобы добиться подобного в браузерах семейства Internet Explorer, требуются просто титанические усилия.

Каждая версия браузера Internet Exlorer обладает своей, уникальной тупостью. Что работает в IE6, может как положено не работать в IE7 и наоборот. Этот зоопарк компании Microsoft не удалось побороть даже в самой последней версии своего браузера.

Понять почему разработчики браузеров не могут просто взять открыть и почитать стандарты W3C для сайтостроения, я не могу.

Поэтому мне, как web-разработчику, приходится выступать некоторой «прослойкой» между капризными браузерами и требующими знаний и зрелищ посетителями сайтов. И замечательно, что web-разработчикам пока это удается.

Дак, как же заставить работать required в старых версиях IE?

На помощь нам приходит JS. Раньше я терпеть его не мог, а теперь не вижу дальнейшего пути без него на просторе «правильного» WEB .

Решение приведенное ниже я выдумал не сам, а взял с буржуйского блога. Так как я жадный, а блог буржуйский, я не стану приводить на него ссылку.

За все у нас будет отвечать функция fnCheckFields() . Поместите на вашем сайте JS-код:

Обычно рекомендуют размещать его между html-тегами HEAD в начале страницы, но я бы рекомендовал все же размещать его в самом низу страницы до закрывающегося тега BODY . Таким образом JS меньше влияет на скорость загрузки страницы.

Окно ввода, где должен вводиться обязательный параметр, на html-языке должно выглядеть так:

Этот скрипт работает очень просто: после нажатия кнопки Отправить , скрипт проверяет все инпуты на наличие параметра required и если находит его, то соответственно смотрит на введенное значение этого поля. Если в такой инпут ничего не введено, то выводится предупреждающее окно о необходимости ввода. Данные соответственно никуда не отправляются.

Замечательно еще и то, что если у Вас нормальный браузер, который уже научился понимать этот параметр как положено, такого предупреждающего окна не всплывет и будут работать стандартные инструменты обработки параметра required для вашего браузера.

Рассказать в соц. сетях

0

Я строящие крошечная рамку PHP MVC, и вот моя структура

/app /controllers /models /views /templates /config /config.php /core /Controller.php /Router.php /init.php /index.php

папки Внутри index.php, который является фронтом-контроллером у меня есть этот код требовать от init.php /app/core/init.php

приложение/ядро ​​/ init.php

init.php требует, чтобы каждый базовый контроллер и Classe в каталоге/ядра, включая controller.php и router.php и здесь index.php также конкретизирует классов

Каждая вещь работает отлично на данный момент, как я проверил это путем создания конструктора в обоих controller.php и router.php так что код в этих двух файлов будет как этот

приложение/ядро ​​/ controller.php

приложение/ядро ​​/ маршрутизатор. php

внутри index.php это эхо ОК! поскольку классы создаются правильно, но проблема в том, что когда я хочу включить config.php, который находится в /app/config/config.php из Controller.php, находящегося в /app/core/Controller.php, с этим кодом

Всякий раз, когда я делаю это возвращает эту ошибку

Controller::include(../config/config.php) : failed to open stream: No such file or directory in C:\AppServ\www\myapp\app\core\Controller.php on line 6

Controller::include() : Failed opening "../config/config.php" for inclusion (include_path=".;C:\php5\pear") in C:\AppServ\www\myapp\app\core\Controller.php on line 6

Я думаю, что я использовал правильное местоположение, я работаю с /app/core/Controller.php и w ant требует /app/config/config.php. Я возвращаюсь в один каталог, используя../

Тогда почему я не могу потребовать файл?

  • 3 ответа
  • Сортировка:

    Активность

2

Из моего личного опыта использование относительных путей файла в какой-то момент приведет к головным болям. Поэтому я обычно использую полный путь к файлу. Преимущество этого также в том, что он немного быстрее. Тогда, если в какой-то момент вы получите ошибку включения, легче найти ошибку, так как у вас есть весь доступный путь.

Чтобы иметь возможность делать абсолютные пути, я бы рекомендовал вам добавить константу в свой файл index.php (frontcontroller). Что-то вроде следующего:

Define("ROOT_PATH", realpath(dirname(__FILE__)) . DIRECTORY_SEPARATOR);

Определяет константу, называемую ROOT_PATH , которая ссылается на каталог, в котором находится файл index.php , и, следовательно, ваш корневой каталог. В то же время я добавил разделитель каталога в конец, чтобы упростить запись путей.Чтобы использовать это, вы должны писать.

Require_once ROOT_PATH . "config/config.php";

Bonus Информация

Но если вы используете этот подход в своем классе controller.php вы делаете это зависит в этой константе. Чтобы исправить это, вы можете передать корневой путь как переменную в конструкторе.

Public function __construct($root) {...

И затем использовать его как следующее:

Public function __construct($root) { require_once($root . "config/config.php"); }

Надеется, что это помогает.

0

Я не знаю, что происходит, но require_once() не выдавал ошибку, ссылаясь на себя как include() , потому что это разные функции, плюс, если это весь код, номер строки ошибки не совпадает с ваша линия require_once() , так как это должно быть 4. Попробуйте перезагрузить свой веб-сервер и посмотрите, не исправить ли это что-то, иначе вы, вероятно, будете что-то шутить.

Поделитесь с друзьями или сохраните для себя:

Загрузка...