【问题标题】: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 中。