我目前正在开发一个包含许多数据Feed的mashup。为了在一个页面上显示用户想要的所有提要,我目前正在使用if语句与MySQL数据库进行交叉检查,如下所示:
if($var["type"]=="weather")
$var
是对mysqli_fetch_array
然后包括与下面的函数(例如weather)相关的代码,然后是另一个feed的另一个“if”语句,依此类推。问题是会有很多提要,所有这些“if”语句都会变得缓慢而冗余。
有没有办法优化这个PHP代码?
答案 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语句来检查一个条件,就是实现一个设计模式,比如策略模式。
通过这种方式,您可以将每种类型的代码分开,这样可以更轻松地进行概述和管理。
的示例即使您不会严格执行此操作,它也会为您提供有关如何优雅地解决此问题的一些想法。
答案 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
语句将比您关心的更快。它可能看起来很丑陋,维护起来很麻烦,但 会很快。