【问题标题】:Php 7.4.3 Class not found找不到 PHP 7.4.3 类
【发布时间】:2021-09-20 12:40:19
【问题描述】:

这是我的项目路径配置

./create.php

/Install/Install.php

create.php

<?php

use Install\Install;

echo "Starting";
$install = new Install();

这给了我错误

PHP 致命错误:未捕获的错误:在 /project/create.php:6 中找不到类“Install\Install”

安装.php

<?php

namespace Install;

class Install
{
    //whatever
}

谁能解释一下那里发生了什么?

显然我猜想在我的文件名中使用require_once 行可能会解决问题......但我认为使用命名空间和使用导入可能会阻止我像在 symfony / magento 这样的经典框架中那样做?

我看过一些关于自动加载的帖子,但我有点迷茫。也找不到关于其他堆栈主题的明确解释。

【问题讨论】:

  • 感谢协助,但我不确定;这是否意味着我必须为此使用作曲家?如果我必须那么我应该在我的 compose 上需要哪个模块?在没有特定模块的情况下无论如何可以做到这一点,因为我不确定我以后是否可以在本地开发之外对我的项目进行 ssh 访问,如果我需要运行 composer,这可能是个问题。
  • 你要不要用compose,也可以stackoverflow.com/questions/39571391/…
  • @NigelRen 事实上,我在你提到的帖子中看到了spl_autoload_register,在下面的答案中,我将深入研究所有这些并试图理解这些概念。感谢您的分享;)

标签: php


【解决方案1】:

PHP 一次编译一个文件的代码。它没有“项目”或“完整程序”的任何原生概念。

这里涉及三个概念,它们相互补充而不是相互替代:

  • 命名空间只是一种命名方式。它们允许您拥有两个名为Install 的类,并且仍然可以区分它们之间的区别。 use 语句只是告诉编译器(在一个文件中)当您编写 Install 时您想要哪些类。 PHP 手册中有a chapter on namespaces,其中详细介绍了所有这些内容。
  • 要求和包含唯一机制,允许一个文件中的代码引用另一个文件中的代码。在某些时候,您需要告诉编译器加载“Install.php”。
  • Autoloading 是 PHP 在您提及尚未看到定义的类时询问您的代码应该加载哪个文件的一种方式。第一次遇到类名时,使用spl_autoload_register 注册的任何函数都将使用该类名调用,然后有机会运行 include/require 来加载定义。有一个相当简短的overview of autoloading in the PHP manual

所以,在你的例子中:

  • use Install\Install; 只是表示“当我写 Install 时,我的意思是 Install\Install
  • new Install() 被编译器翻译成new Install\Install()
  • Install\Install 尚未定义;如果注册了自动加载函数,它将被调用,字符串“Install\Install”作为输入
  • 然后自动加载函数可以查看该类名,并运行require_once __DIR__ . '/some/path/Install.php';

您可以自己编写自动加载函数,也可以使用“现成的”实现,您只需配置类所在的目录,然后按照约定命名它们。

【讨论】:

  • 简单、清晰、易懂的答案。非常感谢你。我会深入研究这个spl_autoload_register
【解决方案2】:

如果你想使用其他文件中的类,你必须includerequire 文件。

use Install\Install; 之前使用require('Install.php');

如果您打算做一个大项目,我建议您使用 PHP 框架,而不是从头开始编码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-20
    • 1970-01-01
    • 1970-01-01
    • 2014-02-25
    • 2017-05-24
    • 2015-04-04
    • 2012-05-04
    • 2012-02-09
    相关资源
    最近更新 更多