PHP расширяет класс условно? (Вариант использования CodeIgniter 3)

Я использую следующий сценарий, но это не обязательно относится только к 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_ классы).

Чтобы заставить i18n работать рядом HMVC, сначала я должен запросить соответствующий файл HMVC, а затем расширить этот класс.

Так, например, CI_Config продлен HMVC MX_Config а затем дополнительно требуется & продлен i18n MY_Config,

Но теперь i18n работает только если HMVC уже на месте.

Что делать, если HMVC отсутствует (нет MX_Config и связанные)

Я хочу, чтобы i18n работал как с / без HMVC.

Есть ли способ условно требовать & продлить один класс или другой? Или, скорее, продлить 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
{

0

Решение

Как насчет объявления класса 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
);

Например, смотрите:

1

Другие решения

Ответ localheinz действителен, но не учитывает:

CodeIgniter загружает файлы ядра CI_ & MY_ до HMVC MX_ , Так что нет возможности иметь 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
{
0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector