概括访问多种类型对象的函数(通过函数和数组)

时间:2012-05-16 23:16:04

标签: php refactoring

我现在有2个函数来构造html来显示,具体取决于数据源; 1来自database,另一来自form post

function buildForm_newUser($user){
     $html_username = 'Username = ' . $_POST['username'];
     $html_location = 'location = ' . $_POST['location'];
     : // similar rows follow more than 20 times 
}

function buildForm_exsitingUser($user){
     $html_username = 'Username = ' . $user->get_property('username');
     $html_location = 'location = ' . $user->get_property('location');
     :
}

只用1个功能才能实现这些功能吗?

我试图切换源对象(即上面的$user$_POST),但后来被卡住,因为后者的函数使用了指定对象的函数,而前者没有。此外,因为有许多行必须访问任一对象,所以我喜欢在仅一个位置声明新生成的变量(上例中的$ html_ *变量)。那就是说,我想要这样的事情:

function buildForm($user){ // Number and type of argument can vary

     // Do something here to specify object type

     $html_username = 'Username = ' . // following here, either $_POST or $user->get_property to get 'username'
     $html_location = 'location = ' . // following here, either $_POST or $user->get_property to get 'location'
     :
}

感谢。

(也赞赏更好标题的建议......)

2 个答案:

答案 0 :(得分:1)

正如你在问题中正确写的那样,这两个函数在某种程度上是相同的,所以你想要改为使用一个函数。

你的动力很好,你发现了一个改善的地方。怎么做?首先,提取一种新的第三种方法:

function buildForm_array($array)
{
     $html_username = 'Username = ' . $array['username'];
     $html_location = 'location = ' . $array['location'];
     ... // similar rows follow more than 20 times 

}

然后在两个现有方法中使用第三个方法:

function buildForm_newUser()
{
     buildForm_array($_POST);
}

function buildForm_exsitingUser($user)
{
     $array['username'] = $user->get_property('username');
     $array['location'] = $user->get_property('location');
     ...
     buildForm_array($array);
}

根据您的实际代码的样子,这可能会导致不同的结果(此处的示例显然不是结束),例如,您可以根据{{1}创建$user对象然后使用它来使用现有的$_POST函数生成表单。

这类似于使用新的第三个函数,但没有创建它。因此找到模式,只需减少重复的代码。简化。

这一直在进行中,因此请保持代码动态,进行更改。

答案 1 :(得分:0)

什么叫这个功能?您只需接受用户名和用户位置作为参数...