我有一个PHP函数,我想从程序转换为OOP,但我很困惑如何做到这一点。请帮忙。
以下是我原来的PHP代码。
function smw_admin() {
global $smw, $shortname, $options;
$i=0;
if ( $_REQUEST['saved'] ) echo '<div id="message" class="updated fade"><p><strong>'.$smw.' settings saved.</strong></p></div>';
if ( $_REQUEST['reset'] ) echo '<div id="message" class="updated fade"><p><strong>'.$smw.' settings reset.</strong></p></div>';
?>
<div class="wrap rm_wrap">
<h2><?php echo $smw; ?></h2>
</div>
<form method="post">
<div class="wrap rm_wrap">
<div class="rm_opts">
<?php foreach ($options as $value) {
switch ( $value['type'] ) {
case "open":
?>
<?php break;
case "close":
?>
</div>
</div>
<br />
<?php break;
case "title":
?>
<p>To easily use the <?php echo $smw;?>, you can use the menu below.</p>
<?php break;
case 'text':
?>
<div class="rm_input rm_text">
<label for="<?php echo $value['id']; ?>"><?php echo $value['name']; ?></label>
<input name="<?php echo $value['id']; ?>" id="<?php echo $value['id']; ?>" type="<?php echo $value['type']; ?>" value="<?php if ( get_settings( $value['id'] ) != "") { echo stripslashes(get_settings( $value['id']) ); } else { echo $value['std']; } ?>" />
<small><?php echo $value['desc']; ?></small>
<div class="clearfix"></div>
</div>
<?php
break;
case 'textarea':
?>
<div class="rm_input rm_textarea">
<label for="<?php echo $value['id']; ?>"><?php echo $value['name']; ?></label>
<textarea name="<?php echo $value['id']; ?>" type="<?php echo $value['type']; ?>" cols="" rows=""><?php if ( get_settings( $value['id'] ) != "") { echo stripslashes(get_settings( $value['id']) ); } else { echo $value['std']; } ?>
</textarea>
<small><?php echo $value['desc']; ?></small>
<div class="clearfix"></div>
</div>
<?php
break;
case 'select':
?>
<div class="rm_input rm_select">
<label for="<?php echo $value['id']; ?>"><?php echo $value['name']; ?></label>
<select name="<?php echo $value['id']; ?>" id="<?php echo $value['id']; ?>">
<?php foreach ($value['options'] as $option) { ?>
<option <?php if (get_settings( $value['id'] ) == $option) { echo 'selected="selected"'; } ?>><?php echo $option; ?></option>
<?php } ?>
</select>
<small><?php echo $value['desc']; ?></small>
<div class="clearfix"></div>
</div>
<?php
break;
case "checkbox":
?>
<div class="rm_input rm_checkbox">
<label for="<?php echo $value['id']; ?>"><?php echo $value['name']; ?></label>
<?php if(get_option($value['id'])){ $checked = "checked=\"checked\""; }else{ $checked = "";} ?>
<input type="checkbox" name="<?php echo $value['id']; ?>" id="<?php echo $value['id']; ?>" value="true" <?php echo $checked; ?> />
<small><?php echo $value['desc']; ?></small>
<div class="clearfix"></div>
</div>
<?php break;
case "section":
$i++;
?>
<div class="rm_section">
<div class="rm_title">
<h3><img src="<?php echo plugin_dir_url(__FILE__);?>/assets/images/trans.png" class="inactive" alt="""><?php echo $value['name']; ?></h3>
<span class="submit">
<input name="save<?php echo $i; ?>" type="submit" value="Save changes" />
</span>
<div class="clearfix"></div>
</div>
<div class="rm_options">
<?php break;
}
}
?>
<input type="hidden" name="action" value="save" />
</form>
<form method="post">
<p class="submit">
<input name="reset" type="submit" value="Reset" />
<input type="hidden" name="action" value="reset" />
</p>
</form>
</div>
<?php
}
这是我写的OOP,
class Admin_Option{
public function smw_admin() {
$i=0;
if ( $_REQUEST['saved'] ) echo '<div id="message" class="updated fade"><p><strong>'.$this->smw.' settings saved.</strong></p></div>';
if ( $_REQUEST['reset'] ) echo '<div id="message" class="updated fade"><p><strong>'.$this->smw.' settings reset.</strong></p></div>';
?>
<div class="wrap rm_wrap">
<h2><?php echo $this->smw; ?></h2>
</div>
<form method="post">
<div class="wrap rm_wrap">
<div class="rm_opts">
<?php foreach ($this->options as $value) {
switch ( $value['type'] ) {
case "open":
?>
<?php break;
case "close":
?>
</div>
</div>
<br />
<?php break;
case "title":
?>
<p>To easily use the <?php echo $this->smw;?>, you can use the menu below.</p>
<?php break;
case 'text':
?>
<div class="rm_input rm_text">
<label for="<?php echo $value['id']; ?>"><?php echo $value['name']; ?></label>
<input name="<?php echo $value['id']; ?>" id="<?php echo $value['id']; ?>" type="<?php echo $value['type']; ?>" value="<?php if ( get_settings( $value['id'] ) != "") { echo stripslashes(get_settings( $value['id']) ); } else { echo $value['std']; } ?>" />
<small><?php echo $value['desc']; ?></small>
<div class="clearfix"></div>
</div>
<?php
break;
case 'textarea':
?>
<div class="rm_input rm_textarea">
<label for="<?php echo $value['id']; ?>"><?php echo $value['name']; ?></label>
<textarea name="<?php echo $value['id']; ?>" type="<?php echo $value['type']; ?>" cols="" rows=""><?php if ( get_settings( $value['id'] ) != "") { echo stripslashes(get_settings( $value['id']) ); } else { echo $value['std']; } ?></textarea>
<small><?php echo $value['desc']; ?></small>
<div class="clearfix"></div>
</div>
<?php
break;
case 'select':
?>
<div class="rm_input rm_select">
<label for="<?php echo $value['id']; ?>"><?php echo $value['name']; ?></label>
<select name="<?php echo $value['id']; ?>" id="<?php echo $value['id']; ?>">
<?php foreach ($value['options'] as $option) { ?>
<option <?php if (get_settings( $value['id'] ) == $option) { echo 'selected="selected"'; } ?>><?php echo $option; ?></option>
<?php } ?>
</select>
<small><?php echo $value['desc']; ?></small>
<div class="clearfix"></div>
</div>
<?php
break;
case "checkbox":
?>
<div class="rm_input rm_checkbox">
<label for="<?php echo $value['id']; ?>"><?php echo $value['name']; ?></label>
<?php if(get_option($value['id'])){ $checked = "checked=\"checked\""; }else{ $checked = "";} ?>
<input type="checkbox" name="<?php echo $value['id']; ?>" id="<?php echo $value['id']; ?>" value="true" <?php echo $checked; ?> />
<small><?php echo $value['desc']; ?></small>
<div class="clearfix"></div>
</div>
<?php break;
case "section":
$i++;
?>
<div class="rm_section">
<div class="rm_title">
<h3><img src="<?php echo plugin_dir_url(__FILE__);?>/assets/images/trans.png" class="inactive" alt="" /><?php echo $value['name']; ?></h3>
<span class="submit">
<input name="save<?php echo $i; ?>" type="submit" value="Save changes" />
</span>
<div class="clearfix"></div>
</div>
<div class="rm_options">
<?php break;
}
}
?>
<input type="hidden" name="action" value="save" />
</form>
<form method="post">
<p class="submit">
<input name="reset" type="submit" value="Reset" />
<input type="hidden" name="action" value="reset" />
</p>
</form>
</div>
<?php
}
}
有意义吗?我会以正确的方式前进吗?还有其他好办法吗? 感谢
答案 0 :(得分:8)
在考虑将代码移动到另一个范例(OO)之前,您必须首先清理它,以便它可以显示其真实颜色,它做什么,它做什么好(工作)以及它做错了什么(错误)。
所以我们必须首先重构代码。例如:
摆脱错误
您在<div>
循环之外打开foreach
并在循环内关闭它们,并且仅在case "close"
中。现在,因为这种行为是由$options
的数据结构控制的,所以你可能在数据结构末尾给出了一个'close'值的循环,因此可能的错误永远不会出现,但它可以和整个事情使您的代码难以阅读。将<div>
的关闭移动到它们必须的循环之外,因为无论数据结构如何,我们必须始终关闭它们。
摆脱陈旧的代码:
现在上述更改会导致'close'
无效,并且您有另一个案例'open'
无效。必须完全删除这两个案例 - 除了提醒我们某个地方我们有一个可以具有开放和接近价值的数据结构之外,它们没有用处。
收集您的意见:
查看您的输入是什么,并将它们移动到代码块的开头,以便您可以一目了然地看到它们。给他们有意义的名称,例如$i
可能正在计算部分编号,因此将其命名为$sectionNumber
。此外,您现在在特定点上看到您根据__FILE__
使用资产,稍后当您将代码文件移动到另一个相对位置时,您将轻松更改它。
同样在陈旧代码部门,您还有一个未使用的变量$shortname
。我们也放弃它。
将逻辑与演示文稿分开:
不,我没有暗示像MVC
这样的任何东西只是让你的代码不止一行,这样你就可以看到代码的逻辑。只需将它们变成函数 - 即使只是从代码中的一个点开始使用 - 并将它们移开。稍后当你清理掉逻辑时,你可能会制作一个适当的模板,你将用它需要的数据提供等等。
看看有什么变化和什么保持不变等等
现在以上所有结果都更容易阅读:
<?php
function smw_admin() {
global $smw, $options;
$saved = $_REQUEST['saved'];
$reset = $_REQUEST['reset'];
$imageTrans = plugin_dir_url(__FILE__) . '/assets/images/trans.png';
$sectionNumber=0;
if ($saved) echo '<div id="message" class="updated fade"><p><strong>'.$smw.' settings saved.</strong></p></div>';
if ($reset) echo '<div id="message" class="updated fade"><p><strong>'.$smw.' settings reset.</strong></p></div>';
?>
<div class="wrap rm_wrap">
<h2><?php echo $smw; ?></h2>
</div>
<form method="post">
<div class="wrap rm_wrap">
<div class="rm_opts">
<?php
foreach ($options as $value) {
switch ( $value['type'] ) {
case "open":
break;
case "close":
break;
case "title":
echo "<p>To easily use the $smw, you can use the menu below.</p>";
break;
case 'text':
render_div_rm_input_rm_text($value);
break;
case 'textarea':
render_rm_input_rm_textarea($value);
break;
case 'select':
render_rm_input_rm_select($value);
break;
case "checkbox":
render_rm_input_rm_checkbox($value);
break;
case "section":
$sectionNumber++;
render_rm_section($imageTrans, $value, $sectionNumber);
break;
}
}
?>
</div>
</div>
<br />
<input type="hidden" name="action" value="save" />
</form>
<form method="post">
<p class="submit">
<input name="reset" type="submit" value="Reset" />
<input type="hidden" name="action" value="reset" />
</p>
</form>
</div>
<?php
}
以及各种功能:
function render_rm_section($imageTrans, $value, $i)
{
?>
<div class="rm_section">
<div class="rm_title">
<h3><img src="<?php echo $imageTrans; ?>" class="inactive" alt="""><?php echo $value['name']; ?></h3>
<span class="submit">
<input name="save<?php echo $i; ?>" type="submit" value="Save changes"/>
</span>
<div class="clearfix"></div>
</div>
<div class="rm_options">
<?php
}
此时您可以启动OO方式 - 尽管您应该更多地重构它,例如不直接回显结果,而是将结果作为返回值,合并更多的代码库等。
第一阶段的例子可能是:
Class SmwPage {
private options;
private $smw;
private $imageTrans;
function __construct($options, $smw) {
$this->options = $options;
$this->smw = $smw;
$this->imageTrans = plugin_dir_url(__FILE__) . '/assets/images/trans.png';
}
function render() {
// render the beggining
// the same code as before only we now operate with $this-> at the class member variables (properties)
foreach ($this->options as $value) {
// switch statement here
}
// render the end
}
使用:
$smwPage = new SmwPage($options, $smw);
$smwPage->render();
当然上面的课程需要改变
因此,在下一步中,您需要将数据结构更改为每个都知道如何render()
本身的对象集合。然后,SmwPage
的渲染只是循环这些对象的集合并调用它们的render()
方法。