Класс не найден после расширения другого класса

У меня есть файл с именем 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.

-1

Решение

Выполнение сценариев PHP происходит в два этапа: сначала файл компилируется в двоичный формат, затем этот двоичный формат интерпретируется по одному утверждению за раз.

На этапе компиляции проверяется, соответствует ли программа лексическим и синтаксическим правилам языка. Однако он проверяет и компилирует только основной файл, который вы передаете ему. Включенные файлы обрабатываются на этапе выполнения. На этапе компиляции они никоим образом не проверяются (даже если они существуют).

Посмотрим, как выполняется ваша программа. Сначала проверяется синтаксис кода, и он компилируется в двоичный формат. Login класс определен в файле, но он расширяет Config класс, который здесь не определен. Это, вероятно, определяется в includes/Config.php файл, но этот файл не компилируется на этапе компиляции, но во время выполнения. Это делает определение Login класс недоступен после этапа компиляции, и поэтому интерпретатор не может его найти. Это будет завершено на этапе выполнения, после того как интерпретатор прочитает и выполнит определение Config учебный класс.

Если вы переместите использование Login класс после его объявления, когда интерпретатор достигает утверждения require 'includes/Config.php'; во время выполнения он читает и компилирует файл и таким образом изучает класс Config, Когда он достигает объявления класса Login это знает как класс Config выглядит, и он может построить определение класса Login тоже. Только после этого урок Login доступен для использования.

0

Другие решения

Поменял порядок внутри файла, чтобы:

  1. Объявление класса.

  2. Вызывать это до?> И после окончания класса.

  3. Затем приходит HTML-код.

Работает сейчас

0