我目前正在重构一个巨大的开关,它将一个页面从过程代码解析为OOP。
我有一些构建器类需要一些目前存在范围问题的依赖项。
这是以前代码的片段:
function parsePage($sLanguageCode) {
$oTranslator = new translator($sLanguageCode);
$aTranslations = $oTranslator->translations('page');
$oBuilderClass = new builder($aTranslations);
//... queries to get data and set pagedata and get the template file
$oPageData = $oPage->getData();
$aTemplateTags = $oTemplate->getTags();
foreach($aTemplateTags as $sTag) {
switch($sTag) {
case 'php':
if(is_object($oPageData->getPhp())) {
include $oPageData->getPhp()->getData();
} elseif(is_array($oPageData->getPhp())) {
foreach($oPageData->getPhp() as $oElement) {
include $oElement->getData();
}
}
break;
case 'element':
if(is_object($oPageData->getElements())) {
$oBuilderClass->buildElement($oPageData->getElements()->getData());
} elseif(is_array($oPageData->getElements())) {
foreach($oPageData->getElements() as $oElement) {
$oBuilderClass->buildElement($oElement);
}
}
break;
//... A lot more cases here, like 20
}
}
//....
}
如上所示,存在大量重复代码,我需要在更多函数中检索数据,因此我想在对象中封装逻辑以防止重复代码。 这是在OOP中删除的代码:
function parsePage($sLanguageCode) {
$oTranslator = new translator($sLanguageCode);
$aTranslations = $oTranslator->translations('page');
$oBuilderClass = new builder($aTranslations);
//... queries to get data and set pagedata and get the template file
$oPageData = $oPage->getData();
$aTemplateTags = $oTemplate->getTags();
foreach($aTemplateTags as $sTag) {
$oPageData->outputData($sTag);
//....
}
包含所有数据对象的pageData类类似于:
class pageData {
protected $aPhpFragments;
protected $aElementFragments;
public function outputData($sTag) {
switch($sTag) {
case 'php':
foreach($this->aPhpFragments as $oPhpFragment) {
$oPhpFragment->render();
}
break;
case 'element':
foreach($this->aElementFragments as $oElementFragment) {
$oElementFragment->render();
}
break;
}
}
}
某些数据类如下所示:
class phpFragment {
private $sData;
function render() {
return include $oElement->sData;
}
}
class elementFragment {
private $sData;
function render() {
echo $oBuilderClass->buildElement($this->sData);
}
}
这些数据对象中的大多数都可以在没有任何依赖的情况下呈现其内容,但有些数据对象需要一些构建器/数据对象。与elementFragment类一样,这需要带有翻译集的$ oBuilderClass。 我只想创建一次这些依赖对象,因为有些对象非常大,例如包含很多翻译。 数据对象被序列化并存储到MySQL数据库中。
问题:
答案 0 :(得分:1)
依赖注入模式确实可以帮助您解决范围问题。这是一篇关于在PHP中使用依赖注入模式的好文章: http://fabien.potencier.org/what-is-dependency-injection.html