PHP 有条件地延长 Class? (CodeIgniter 3 用例)

PHP Extend Class Conditionally? (CodeIgniter 3 Use Case)

我正在使用以下场景,但这不一定只适用于 CodeIgniter

HMVC: https://bitbucket.org/wiredesignz/codeigniter-modular-extensions-hmvc

国际化 (i18n): https://github.com/waqleh/codeigniter-language-in-url-internationalization

HMVC 和 i18n 都通过扩展 CI_Config(以及相关的 CI_ classes)来工作。

要使 i18n HMVC 一起工作,我首先必须要求适当的 HMVC 文件,然后进一步扩展 class。

例如,CI_Config 由 HMVC MX_Config 扩展,然后由 i18n MY_Config.

进一步要求和扩展

但现在 i18n 只有在 HMVC 已经到位的情况下才有效。

如果没有 HMVC(没有 MX_Config 和相关)怎么办?

我希望 i18n 可以同时工作 with/without HMVC.

有没有办法有条件地要求和扩展一个 class 或另一个?或者更确切地说,在没有冲突的情况下扩展 CI_Config (和相关的)两次?还是有其他方法可以完成我想要的?

HMVC MX_Config 部分:

/**
 * HMVC
 */
class MX_Config extends CI_Config
{

i18n MY_Config 部分:

/* load HMVC's MX_Config class */
require APPPATH . "third_party/MX/Config.php";

/**
 * Language
 */
class MY_Config extends MX_Config
{

如果 class MX_Config 不存在,动态声明它怎么样?

<?php

class CI_Config {}

if (!class_exists('MX_Config')) {
    class MX_Config extends CI_Config {}
}

class MY_Config extends MX_Config {}

$config = new MY_Config();

var_dump(
    $config instanceof MX_Config,
    $config instanceof CI_Config
);

例如,参见:

localheinz 的回答有效但没有考虑到:

CodeIgniter 在 HMVC MX_ 之前加载核心文件 CI_ & MY_ 。所以没有办法让 MY_ 检查是否声明了 MX_

我也不想编辑核心 CI_ 文件,因为它们不应该被修改。

工作解决方案:

注意:下面的相同逻辑可以应用于其他MY_ 类。

MY_Config部分:

/* load HMVC's MX_Config class */
if ( file_exists(APPPATH . "third_party/MX/Config.php") ) {
    require APPPATH . "third_party/MX/Config.php";
/* otherwise declare MX_Config class */
} else {
    class MX_Config extends CI_Config {}
}


/**
 * Language
 */
class MY_Config extends MX_Config
{