-2

我有一个 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   
    }
}

是否有意义?我走对了吗?还有其他好方法吗?谢谢

4

1 回答 1

8

在考虑将该代码移至另一个范式 (OO) 之前,您必须首先对其进行清理,以便它能够显示其真实的颜色、它的作用、它的优点(工作)和它的错误(错误)。

所以我们必须首先重构代码。例如:

摆脱错误: 您在循环外打开<div>s 并在foreach循环内关闭它们,并且仅在case "close". 现在,由于该行为由数据结构控制,$options您可能在数据结构的末尾为循环提供了一个“关闭”值,因此可能的错误永远不会出现,但它可以并且整个事情使您的代码难以读。将<div>s 的关闭移到它们必须在的循环之外,因为无论数据结构如何,我们都必须始终关闭它们。

摆脱陈旧的代码: 现在上面的更改导致'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();

当然上面的课程需要改变

  1. 每次您需要添加新选项时
  2. 每次我们需要更改选项的呈现方式时

因此,在下一步中,您将希望将数据结构更改为对象集合,每个对象都知道如何处理render()自己。那么渲染SmwPage将只是一个循环,通过这些对象的集合和对它们的render()方法的调用。

于 2013-08-18T07:17:36.290 回答