我正在开发一个PHP页面。核心页面的大部分代码都在一个if语句下,其余的代码在“else”语句下。我即将添加第三个选项“编辑”,这将使页面更长。什么是将逻辑分解为更易读的块的好策略?子程序?我已经习惯了通过Java的OO。 Web脚本似乎很容易陷入过长的if / else块。
答案 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
或,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或类似模式。如果您的文件逻辑如下所示:
// 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();
...你可以用一组看起来像这样的文件替换它:
function foo() { ... }
function bar() { ... }
function everything_else_useful_on_this_page() { ... }
include "common.php"
print_standard_header($TITLE);
do_edit_lots_of_hairy_logic();
print_standard_footer();
include "common.php"
print_standard_header($TITLE);
who_knows();
print_standard_footer();
include "common.php"
print_standard_header($TITLE);
print_form();
print_standard_footer();
这样做有很多好处:
/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
- “变量”很明显。)缺点?
/dingbat.php
替换为重定向的网页。)common.php
文件起初可能看起来不自然,因为它主要是“页面本地逻辑”。随着时间的推移,这将会消失。其他用户提到了MVC模式,它与这种基于文件的体系结构协同工作。
答案 5 :(得分:0)
这不是一个真正的答案,因为问题是PHP,但我正在考虑将整个代码库转换为Rails。我知道PHP有像Cake这样的MVC框架,但似乎RoR内置了MVC - 强制执行。现在,当我想添加编辑功能时,我需要多长时间才能完成这项工作?