优化这个PHP代码?

时间:2011-09-04 21:03:41

标签: php mysql performance if-statement mysqli

我目前正在开发一个包含许多数据Feed的mashup。为了在一个页面上显示用户想要的所有提要,我目前正在使用if语句与MySQL数据库进行交叉检查,如下所示:

if($var["type"]=="weather") 

$var是对mysqli_fetch_array

的调用的结果

然后包括与下面的函数(例如weather)相关的代码,然后是另一个feed的另一个“if”语句,依此类推。问题是会有很多提要,所有这些“if”语句都会变得缓慢而冗余。

有没有办法优化这个PHP代码?

7 个答案:

答案 0 :(得分:2)

另一种解决方案可能是使用关联数组将“类型”映射到自定义函数。

e.g。 (伪代码)

function handle_wheater_logic() {
   // ... your code goes here
}

function handle_news_logic() {
  // .. your code goes here
}


$customFunctions = array("wheater" => "handle_wheater_logic", "news" => "handle_news_logic");

while ($row = mysql_fetch_...) {
    call_user_func ($customFunctions[$row["type"]])
}

这将消除使用大量if语句的需要。您也可以在配置文件中执行“type to function”映射,或者只是存储自定义函数的名称以调用数据库表中的每个“类型” - 这取决于您。

您当然也可以将参数传递给自定义函数。只需查看call_user_func [_array]的文档。

答案 1 :(得分:1)

试试这个:

$methods = array(
    "weather" => function() {
        // code
    },

    "otheroption" => function() {
    }
);

然后使用$ var [“type”]作为数组中的索引来获取函数:

$methods[$var["type"]]();

你可以轻易地,为了更好的可读性做类似的事情:

$methods = array(
    "weather" => "wheater_function",

    "otheroption" => "other_function"
);

然后以这种方式调用函数:

call_user_func($methods[$var["type"]]);

为了更加面向对象,我们显然可以存储在实现特定接口的数组对象中,或者存储对象重新加工__call()魔术方法并像函数一样使用它。

答案 2 :(得分:0)

您可以使用switch声明。

答案 3 :(得分:0)

一个很好的解决方案是消除大量的if语句和一个巨大的switch语句来检查一个条件,就是实现一个设计模式,比如策略模式。

通过这种方式,您可以将每种类型的代码分开,这样可以更轻松地进行概述和管理。

以下是实施http://blogs.microsoft.co.il/blogs/gilf/archive/2009/11/22/applying-strategy-pattern-instead-of-using-switch-statements.aspx

的示例

即使您不会严格执行此操作,它也会为您提供有关如何优雅地解决此问题的一些想法。

答案 4 :(得分:0)

创建一个将函数与每种Feed类型相关联的数组:

$actions = array("weather" => "getWeather",
                 "news"    => "getNews");

然后使用call_user_func来调用正确的:

call_user_func($actions[$var["type"]]);

答案 5 :(得分:0)

用于救援的多形态。

inteface FeedInterface {
  public function retrieve($params);
}

class FeedWeather implements FeedInterface {

  public function retrieve($params) {
    //retrieve logic for weather feed
  }

}

class FeedSports implements FeedInterface {

  public function retrieve($params) {
    //retrieve logic for sports feed
  }

}

使用PHP类自动加载,上述每个声明都可以在一个单独的文件中,也可以是命名空间。然后您的Feed检索代码可能如下所示:

$class = 'Feed'.$var["type"];
$feed = new $class;

$feed->retrieve($params);

这是过度简化的,需要一些额外的代码来处理错误,发现不存在的类等等,但这个想法应该是明确的。

答案 6 :(得分:0)

使用If语句或Switch语句将比您关心的更快。它可能看起来很丑陋,维护起来很麻烦,但 会很快。