PHP - 如何避免过长的if-else块

时间:2011-01-05 03:57:40

标签: php

我正在开发一个PHP页面。核心页面的大部分代码都在一个if语句下,其余的代码在“else”语句下。我即将添加第三个选项“编辑”,这将使页面更长。什么是将逻辑分解为更易读的块的好策略?子程序?我已经习惯了通过Java的OO。 Web脚本似乎很容易陷入过长的if / else块。

6 个答案:

答案 0 :(得分:2)

类,函数,包括。

我喜欢将多个页面上出现的内容模块放入自己的文件中,只使用include_once()语句。例如,您可以为页面标题保留一个php文件,并在多个页面上重复使用它。

另外,请务必了解__autoload函数。它只在需要时自动加载类。

答案 1 :(得分:1)

如果可以,请查看MVC设计模式。

您应该能够添加一个控制器,您可以将操作分组。

您可以合并路由,以便像这样的网址......

 /user/edit

将在PHP(简化)中调用它...

$controller = new User;

$controller->edit();

当然,您需要使用变量函数名称才能使其动态运行:)

答案 2 :(得分:0)

您需要考虑一些真正的设计问题。而亚历克斯建议的MVC可能是一个好主意。您应该考虑这三种情况之间的共同点,您可能会发现它们的差异可以通过一些变量来解释。

与此同时,为了避免使用意大利面条代码,您可以将这三种情况中的每一种都放入一个函数中。我不知道这些函数是否需要回显某些东西,或者需要返回值,或者是什么,但你应该能够弄明白。

除此之外,您可以将这些函数作为同一文件中的函数(如果此'核心'文件具有类,请考虑创建这些成员函数)或将它们放在其他地方的静态类中。我将展示静态选项。

class BodyFunctions
{
    public static function one() {echo "this is what you now call the 'if' block";}  //think of better names for these first two
    public static function two() {echo "this is what you now call the 'else' block";}
    public static function three() {echo "this is the edit part you want to add";}
}

并从“核心”页面调用它们

BodyFunctions::$mode(); //where mode is 'one', 'two', or 'edit'.  like the variable your if statements are currently based on

或者您可以像这样将功能添加到您的核心页面,并使用call_user_func

调用它们
function one() {echo "this is what you now call the 'if' block";}
....
call_user_func($mode);

我不建议将这些函数放在需要实例化的类中,即使这个类缺少任何类型的状态,实例化的唯一目的是运行里面的函数。不必要地做这件事就是我的一种宠儿。

我不能强调这应该被视为一种中间措施,以避免你正在进行的if-else链或切换情况。研究MVC或更彻底的解决方案。

答案 3 :(得分:0)

如果您比较多组条件,那么其他是不可避免的

您可以使用switch statement

PHP 5.3中的

goto has been introduced(提防恐龙)

将条件包装在函数/方法

function  lots_of_conditions($id, $type, $category)
{
  if ($id==1) return 1;
  if ($type=='member') return 2;
  if ($category=='keyword') return 4;
  return 8;
}

$status = lost_of_conditions($id=2, $type='x', $category='y');
switch ($status)
{
  case 1:  ...; break;
  case 2:  ...; break;
  case 4:  ...; break;
  default: ...; break;
}

答案 4 :(得分:0)

考虑到PHP通常托管在一些已经使用“前端控制器”模式的Web服务器后面 - Apache或Lighttpd或类似模式。如果您的文件逻辑如下所示:

/dingbat.php

// local page setup, function definitions, etc...
function foo() { ... }
function bar() { ... }
function everything_else_useful_on_this_page() { ... }
print_standard_header($TITLE);

if ($mode == "edit") {
    do_edit_lots_of_hairy_logic();
} else if ($mode = "new thing") {
    who_knows();
}
else {
    print_form();
}

print_standard_footer();

...你可以用一组看起来像这样的文件替换它:

/dingbat/common.php

function foo() { ... }
function bar() { ... }
function everything_else_useful_on_this_page() { ... }

/dingbat/edit.php

include "common.php"
print_standard_header($TITLE);
do_edit_lots_of_hairy_logic();
print_standard_footer();

/dingbat/new-thing.php

include "common.php"
print_standard_header($TITLE);
who_knows();
print_standard_footer();

/dingbat/index.php

include "common.php"
print_standard_header($TITLE);
print_form();
print_standard_footer();

这样做有很多好处:

  • 编写的代码比实现自己的Front Controller要少。
  • 执行PHP运行时的代码少于单个页面,因此速度更快。
  • 它可以扩展到任意数量的可能模式(仅受文件系统的限制)。
  • 它是递归的(想象/dingbat/edit/easy.php vs /dingbat/edit/expert.php,共享功能的私有/dingbat/edit/common.php
  • 它使单个文件更小,因此更容易被开发人员“掌握”。
  • 它会自动使网址对用户和搜索引擎都更容易被发现(而不是/dingbat.php?mode=edit&a=1&b=2你有/dingbat/edit.php?a=1&b=2 - “变量”很明显。)
  • 如果您的网页是公开的,它会改善搜索引擎优化和代理行为(网址路径远比查询字符串重要)。 ModRewrite可以解决搜索引擎优化问题,但使用这种方案根本就没有必要。

缺点?

  • 您必须更改现有网址(请考虑将现有/dingbat.php替换为重定向的网页。)
  • common.php文件起初可能看起来不自然,因为它主要是“页面本地逻辑”。随着时间的推移,这将会消失。
  • 如果共同的逻辑压倒了单个页面内容,那么就没有太大的好处。

其他用户提到了MVC模式,它与这种基于文件的体系结构协同工作。

答案 5 :(得分:0)

这不是一个真正的答案,因为问题是PHP,但我正在考虑将整个代码库转换为Rails。我知道PHP有像Cake这样的MVC框架,但似乎RoR内置了MVC - 强制执行。现在,当我想添加编辑功能时,我需要多长时间才能完成这项工作?