我想知道在我的PHP代码中复杂的if/else结构是否是一个糟糕的设计决策.有很多if语句会导致PHP运行缓慢,站点加载速度较慢等吗?
这是代码:(我不知道wordpress如何处理is_page等)
<?php
if (is_page()) {
//
if (is_page(122)) {
//subscribe page
echo "subscribe page";
}
elseif (is_page(1263)) {
//photography course
echo "photography course page";
}
elseif (is_page(array(210,184,128))) {
//210 copyright policy, 184 privacy policy, 128 contact
echo "this is either copyright policy, privacy or contact page!";
//nothing happens here, we don't need social buttons on these pages.
}
elseif (is_page(array(379,71,7,45,124,8,105,175,9,125,110))) {
//379 photo galleries, 71 car photos, 7 conceptual, 45 event photos, 124 fashion, 8 landscape, 105 misc, 175 journalism, 9 portrait, 125 street photography, 110 travel
echo "gallery pages and albums";
}
else {
//any other page
echo "any other page";
}
//
}
elseif (is_single()) {
//
if (in_category(array(147,196,35))) {
//147 car photography, 196 car wallpapers, 35 photo stories
echo "photo posts";
}
else {
//any other post
echo "any other post";
}
//
}
elseif (is_archive()) {
//
//any category
echo "this is archive template"
}
//
?>
Run Code Online (Sandbox Code Playgroud)
Mr.*_*ama 13
不.事实上,在大多数情况下它实际上会加速它(因为它允许跳过代码块).
只有当您检查的条件需要处理时,大量if语句才会减慢它的速度.一个例子是:
while (true)
{
if (count($some_array) == 0) { break; }
/* some other code */
}
Run Code Online (Sandbox Code Playgroud)
迭代循环检查是否count($some_array) == 0.这意味着每次传递,PHP必须手动count输入项目数,$some_array因为它可能已经改变.这也适用于for循环中的停止条件.这是因为for循环总是可以重写为while循环:
for ([INITIALIZER_ACTION]; [CONDITION]; [POST_ITERATION_ACTION]) { [CODE]; }
Run Code Online (Sandbox Code Playgroud)
是相同的...
[INITIALIZER_ACTION];
while ([CONDITION]) { [CODE]; [POST_ITERATION_ACTION]; }
Run Code Online (Sandbox Code Playgroud)
如果你正在考虑将一堆if语句合并为一个:不要,你就不会得到任何好处.PHP会短路,这意味着如果它达到了解结果的程度,它将跳过剩下的部分.
例如,考虑一下$a = 5; if ($a > 0 || $b > 100 || $c > 200) {}.
一旦PHP看到$a > 0条件满足,整个语句解析为true(因为OR值的使用)并且不打扰检查$b > 100或$c > 200.
所以回答你的问题:除非你有一些不合适的条件,每个条件都需要复杂的计算或有副作用,你通常可以认为它们的数量是无关紧要的.
但是,正如其他人所指出的那样,if语句太多会降低代码的可读性.在许多情况下,如果您可以删除条件而不影响代码的行为,那么您不需要它开始.
If-clauses是一些最便宜的操作,性能方面.
但是,你在 if子句中放入的内容可能非常慢.
例如,if (true) { ... }速度会非常快,但单个if (calculatePi()) { ... }字体将永远占据一席之地.它if本身是如此之快,以至于你永远不必担心它,此外,你所做的其他事情if无论如何都涉及到很多,例如当你做for或while循环或switch陈述时.所有这些本质上都包含if(一个或多个).
至于设计,很多ifs可能会让其他开发人员感到困惑,这取决于你写的是什么以及它是如何编写的.有时你最好使用switch/case语句或其他一些应用程序工作流程,但说实话,一堆ifs可能比你想出的任何结构都要快.但是,如果您唯一的关注点是表现,那么只能牢记这一点.设计软件是不是,我再说一遍,不主要是关于性能.良好的软件设计与其他方面有关,例如可维护性,即读取和成功升级代码的容易程度.
简而言之,如果您正在优化性能,请不要试图减少ifs 的数量.而是关注于ifs询问的内容,或者取决于它们是返回真还是假而发生的事情.
希望能帮助到你.
我刚刚看过WPShout 的一篇非常有趣的文章,该文章使用非常人性化的类比来邀请我们编写更智能的代码,以及为什么深层嵌套的if { .. }语句不仅会降低性能,还会降低代码的可维护性。如果逻辑具有性能意识,而没有不必要的肿的迭代检查,则最终您将获得井井有条,响应式的干净代码。
代码示例(摘自本文)
“让我们通过看两个简单的代码示例来具体化:首先是气泡样式,然后是网关样式”。
坏:气泡样式
$is_first_thing_working = true;
$is_second_thing_working = true;
$is_third_thing_working = true;
$is_fourth_thing_working = true;
if( $is_first_thing_working === true ) {
if( $is_second_thing_working === true ) {
if( $is_third_thing_working === true ) {
if( $is_fourth_thing_working === true ) {
return 'Working properly!';
}
else {
return 'Fourth thing broken.';
}
}
else {
return 'Third thing broken.';
}
}
else {
return 'Second thing broken.';
}
}
else {
return 'First thing broken.';
}
Run Code Online (Sandbox Code Playgroud)
良好:网关样式
$is_first_thing_working = true;
$is_second_thing_working = true;
$is_third_thing_working = true;
$is_fourth_thing_working = true;
if( $is_first_thing_working !== true ) {
return 'First thing broken.';
}
if( $is_second_thing_working !== true ) {
return 'Second thing broken.';
}
if( $is_third_thing_working !== true ) {
return 'Third thing broken.';
}
if( $is_fourth_thing_working !== true ) {
return 'Fourth thing broken.';
}
return 'Working properly!';
Run Code Online (Sandbox Code Playgroud)
范例说明
上面两个代码段之间的区别归结为一个关键区别:
bubble方法询问重要条件是否为真,并且仅在满足条件时才运行代码。
网关方法询问重要条件是否为假,如果条件为假,则立即为每个条件发出退出指令。
冒泡方法会强制嵌套,因为在进入要运行的代码之前,必须先检查“ true,true,true,true”。每个“ true”检查都是一个嵌套级别,这是您的代码必须存在的条件。
网关方法不是嵌套的:
如您所见,代码从不超过一层逻辑深度。这是因为一旦通过给定的网关,我们就可以完全忘记它。换句话说,由于我们没有在$is_first_thing_working检查后退出,因此我们自动知道其余代码$is_first_thing_working是正确的。
“这就像现实生活:如果您在历史课上坐在我旁边,我知道您是人类,是我高中的学生,等等–否则您将永远不会上过我的课地方。无需检查。”