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
{
我正在使用以下场景,但这不一定只适用于 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
{