gpt4 book ai didi

php - 将过程代码重构为 OOP,范围界定困难

转载 作者:搜寻专家 更新时间:2023-10-31 21:25:03 24 4
gpt4 key购买 nike

我目前正在重构一个巨大的开关,将页面从过程代码解析为 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 数据库中。

问题:

  1. 如何在我的片段对象中使用构建器对象?
  2. 一些对象被存储到数据库中,所以当我在新对象中使用引用变量时,这些引用也会被存储吗?

最佳答案

依赖注入(inject)模式确实可以帮助您解决范围界定问题。这是一篇关于在 PHP 中使用依赖注入(inject)模式的好文章: http://fabien.potencier.org/what-is-dependency-injection.html

关于php - 将过程代码重构为 OOP,范围界定困难,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38041442/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com