【问题标题】:Class not found after extending another class扩展另一个类后找不到类
【发布时间】:2017-03-14 20:02:47
【问题描述】:

我有一个名为 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。

【问题讨论】:

  • 只添加extends Configrequire 行之后?无论哪种方式,请同时提供 Config 代码。
  • 您正在调用$login = new Login($database);之后,您有class Login... - 这不是让您觉得......有问题吗?
  • 正如我所提到的,代码一直工作到现在,在调用之后使用类 Login。只是添加了“extends Config”后,问题出现了。
  • includes/Config.php 有两个包含。这不是必需的。但是请给我们看这个文件。我的猜测是,它无法创建类 Login,因为它扩展的类 Config 存在问题。顺便一提。从 Config 继承 Login 似乎很奇怪。

标签: php class extends classnotfound


【解决方案1】:

将文件内的顺序切换为:

  1. 声明类。

  2. 在 ?> 之前和课程结束之后调用它。

  3. 然后HTML代码来了。

现在工作。

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-05
      • 1970-01-01
      • 1970-01-01
      • 2019-01-06
      • 2019-12-06
      • 1970-01-01
      • 1970-01-01
      • 2020-02-06
      相关资源
      最近更新 更多