【问题标题】:Does extending a parent class in PHP require the file with the class being included?在 PHP 中扩展父类是否需要包含该类的文件?
【发布时间】:2012-06-28 16:25:34
【问题描述】:

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

例如,我有一个名为 Shapes 的类

class Shapes {

}

然后我创建了一个名为

的子类
require_once('shapes.php');

class Circle extends Shapes {

}

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

【问题讨论】:

标签: php oop inheritance require


【解决方案1】:

你需要做一些事情让PHP在处理子类之前看到你的基类定义,否则会发生致命错误。

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

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

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

【讨论】:

    【解决方案2】:

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

    还有一个名为Autoloading Classes 的功能,您可以使用它创建如下函数:

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

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

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

    【讨论】:

      【解决方案3】:

      您也可以使用 composer 来简化流程。

      像这样制作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 中。

      【讨论】:

        猜你喜欢
        • 2015-07-30
        • 2014-12-16
        • 1970-01-01
        • 2012-01-06
        • 2015-01-12
        • 1970-01-01
        • 1970-01-01
        • 2019-09-09
        相关资源
        最近更新 更多