У меня есть файл с именем Login.php, который дает мне следующую ошибку:
Fatal error: Class 'Login' not found
Структура файла выглядит следующим образом:
require_once('includes/Config.php');
require_once('includes/Initialize.php');
require_once('includes/Database.php');
require_once('includes/Cookie.php');
$database = new Database();
$login = new Login($database);
?>
<!-- Start of HTML SECTION COMES HERE -->
<form action="Login.php" method="POST">
<input type="text" name="Username" />
<input type="text" name="Password" />
<input type="submit" value="Submit" />
</form>
<!-- End of HTML SECTION COMES HERE -->
<?php
require_once('includes/Config.php');
class Login extends Config{
function __construct(){
//Construct function handles the forms
}
Теперь, как известно, когда вы используете класс, функцию, переменную или любую другую ссылку на имя в языке программирования, вы должны сначала объявить об этом.
Дело в том, что код, как он есть, без расширения:
class Login{
function __construct(){
//Construct function handles the forms
}
Работает отлично.
Сразу после добавления расширения как уже упоминалось выше, проблема возникает.
У меня есть несколько других классов, использующих тот же метод, И расширяющих класс Config, не возвращая никакой ошибки.
Есть идеи, что здесь происходит по-другому?
Кстати, вы думаете, что структура предпочтительнее?
Эта проблема упоминается во многих потоках, а также в stackoverflow, но, как я видел до сих пор, некоторые говорят, что это своего рода ошибка, но никакого реального решения не обнаружено, и это было сказано о гораздо более ранних версиях PHP.
Выполнение сценариев PHP происходит в два этапа: сначала файл компилируется в двоичный формат, затем этот двоичный формат интерпретируется по одному утверждению за раз.
На этапе компиляции проверяется, соответствует ли программа лексическим и синтаксическим правилам языка. Однако он проверяет и компилирует только основной файл, который вы передаете ему. Включенные файлы обрабатываются на этапе выполнения. На этапе компиляции они никоим образом не проверяются (даже если они существуют).
Посмотрим, как выполняется ваша программа. Сначала проверяется синтаксис кода, и он компилируется в двоичный формат. Login
класс определен в файле, но он расширяет Config
класс, который здесь не определен. Это, вероятно, определяется в includes/Config.php
файл, но этот файл не компилируется на этапе компиляции, но во время выполнения. Это делает определение Login
класс недоступен после этапа компиляции, и поэтому интерпретатор не может его найти. Это будет завершено на этапе выполнения, после того как интерпретатор прочитает и выполнит определение Config
учебный класс.
Если вы переместите использование Login
класс после его объявления, когда интерпретатор достигает утверждения require 'includes/Config.php';
во время выполнения он читает и компилирует файл и таким образом изучает класс Config
, Когда он достигает объявления класса Login
это знает как класс Config
выглядит, и он может построить определение класса Login
тоже. Только после этого урок Login
доступен для использования.
Поменял порядок внутри файла, чтобы:
Объявление класса.
Вызывать это до?> И после окончания класса.
Затем приходит HTML-код.
Работает сейчас