扩展另一个类后找不到类

时间:2016-11-01 16:21:38

标签: php class extends classnotfound

我有一个名为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上也是如此,但正如我所看到的那样,有些人说这是一个错误,但没有真正的解决方案出现,而且它已经出现了#39有人说过很多早期的版本哦PHP。

2 个答案:

答案 0 :(得分:0)

将文件内的订单切换为:

  1. 宣布上课。

  2. 之前调用它?&gt;以及课程结束后。

  3. 然后HTML代码来了。

  4. 立即行动。

答案 1 :(得分:0)

PHP脚本执行分两步进行:首先将文件编译为二进制格式,然后解释这种二进制格式,一次一个语句。

编译步骤验证程序是否符合语言的词法和语法规则。但是,它仅检查并编译传递给它的主文件。在执行步骤中处理包含的文件。在编译步骤中,不会以任何方式检查它们(甚至不存在它们。)

让我们看看你的程序是如何执行的。首先,验证代码的语法,并将其编译为二进制格式。 Login类在文件中定义,但它扩展了此处未定义的Config类。它可能在includes/Config.php文件中定义,但该文件不是在编译步骤中编译,而是在运行时编译。这使得Login类的定义在编译步骤之后不可用,这就是解释器无法找到它的原因。在解释器读取并执行Config类的定义之后,它将在执行步骤中完成。

如果在声明之后移动Login类的用法,当解释器在运行时到达语句require 'includes/Config.php';时,它会读取并编译文件,这样它就可以了解类{ {1}}。当它到达类Config的声明时,它知道类Login的外观如何,它也可以构建类Config的定义。只有在那之后,课程Login才可供使用。