在 PHP 中扩展父类是否需要包含类的文件


Does extending a parent class in PHP require the file with the class being included?

我应该包含/require_once我在PHP中扩展的父类吗?

例如,我有一个名为形状的类

class Shapes {
}

然后我创建了一个名为

require_once('shapes.php');
class Circle extends Shapes {
}

扩展时是否应该要求父类? 还是应该只使用 将子类扩展到其父类,即使它们位于同一文件夹中?

您需要执行一些操作才能让 PHP 在处理子类之前看到您的基类定义,否则将发生致命错误。

这可以是基类文件的手动require_once,也可以是自动加载(还有其他自动加载选项,但您应该使用spl_autoload_register选项)。

使用哪种方法取决于范围:在编写小型测试项目时,设置自动加载可能是矫枉过正。但随着代码库变得越来越大,自动加载变得越来越有吸引力,因为:

  • 它可以隐藏复杂的源文件解析逻辑(例如,如果你有一个可配置的基类目录;还有更高级的方案)
  • 它可以增量配置:您可以使用多个作为链运行的自动加载器,并且应用程序的每个独立模块都可以注册其独立的自动加载器,该自动加载器与所有其他模块和平共存

是的,如果该类未在同一文件中声明,则必须包含它。

还有一个名为自动加载类的功能,您可以使用它创建这样的函数:

function __autoload($class){
    require_once('classes/' . $class . '.php');
}

它将自动包含在现有范围内找不到的类

您也可以阅读有关此功能的信息:autoload_register

您还可以使用作曲家来简化该过程。

composer.json像这样

{
...
    "autoload": {
        "psr-4": {
            "": "src/"
        }
    },
...
}

从 https://getcomposer.org/获取作曲家并运行composer install .你应该加载作曲家的自动加载脚本一次,就像

require_once __DIR__ . '/vendor/autoload.php';

如果您的 PHP 低于 5.3.0,请将 __DIR__ 替换为 dirname(__FILE__)

并将文件放入src文件夹中。例如,如果您有类Acme'Utils'FooBar那么它应该在 src/Acme/Utils/FooBar.php 中。