Оптимизировать этот код PHP? - PullRequest
       11

Оптимизировать этот код PHP?

1 голос
/ 05 сентября 2011

В настоящее время я работаю над гибридным приложением, которое включает в себя множество каналов данных. Чтобы отобразить ВСЕ каналы, которые пользователь хочет на одной странице, я в настоящее время использую операторы if для перекрестной проверки с базой данных MySQL, например:

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

$var является результатом вызова mysqli_fetch_array

и затем включая код, относящийся к функции (например, погоде), и еще один оператор «если» для другого канала, и так далее, и так далее. Проблема в том, что будет много каналов, и все эти операторы «если» будут медленными и избыточными.

Есть ли способ оптимизировать этот код PHP?

Ответы [ 7 ]

2 голосов
/ 05 сентября 2011

Другим решением может быть сопоставление «типа» пользовательской функции с использованием ассоциативных массивов.

например (псевдокод)

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"]])
}

Это избавит от необходимости использовать многоиз если заявления.С тем же успехом вы можете выполнить сопоставление типа для функции в файле конфигурации или просто сохранить имя настраиваемой функции для вызова каждого «типа» в таблице базы данных - это ваше дело.

ВыМожно, конечно, также передать параметры пользовательской функции.Просто ознакомьтесь с документацией для call_user_func [_array].

1 голос
/ 05 сентября 2011

Попробуйте это:

$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 (), и использовать его как функции.

0 голосов
/ 05 сентября 2011

Использование оператора If или оператора Switch будет быстрее, чем вам нужно.Это может выглядеть уродливо и неудобно в обслуживании, но будет быстро

0 голосов
/ 05 сентября 2011

Полиморфизм для спасения.

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 каждое из приведенных выше объявлений может быть в отдельном файле, возможно, также с пространством имен.Тогда ваш код поиска канала может выглядеть следующим образом:

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

$feed->retrieve($params);

Это слишком упрощено и потребует некоторого дополнительного кода для обработки ошибок, обнаружения несуществующих классов и тому подобного, но идея должна быть ясной.

0 голосов
/ 05 сентября 2011

Создать массив, который связывает функцию с каждым типом канала:

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

Затем используйте call_user_func для вызова правильного:

call_user_func($actions[$var["type"]]);
0 голосов
/ 05 сентября 2011

Хорошим решением для устранения большого количества операторов if и большого оператора switch, просто проверяющего одно условие, было бы внедрение шаблона проектирования, такого как шаблон Strategy.

Таким образом, вы будете иметь код для каждого типа отдельно, что облегчает просмотр и управление.

Вот пример реализации http://blogs.microsoft.co.il/blogs/gilf/archive/2009/11/22/applying-strategy-pattern-instead-of-using-switch-statements.aspx

Даже если вы не будете применять это строго, это даст вам некоторые идеи о том, как решить это элегантно.

0 голосов
/ 05 сентября 2011

Вы можете использовать оператор switch .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...