организация структуры выбора [PHP]
у меня есть массив в котором задается набор ключей которые характеризуют дальнейшие действия
$element2 = array("set", "add");
по суте своей напоминает загруску и выполнение модулей
(пример: http://forum.codenet.ru/newthread.php?do=newthread&f=19 где do=newthread определяет модуль)
но в случае с модулями выполяется один модуль а не несколько
мне в голову пришло три способа организации выбора
первый базовый
// действия для элимента get
}
if (isset($element1['set'])){
// действия для элимента set
}
if (isset($element1['add'])){
// действия для элимента add
}
if (isset($element1['del'])){
// действия для элимента del
}
второй, который мне кажется более удобным
switch($do){
case 'get':
// действия для элимента get
break;
case 'set':
// действия для элимента set
break;
case 'add':
// действия для элимента add
break;
case 'del':
// действия для элимента del
break;
}
}
третий вариант который может быть более удобным при реализации ООП
$fname = "mod_".$do;
if (function_exists($fname)){
$fname();
}
}
function mod_get(){
// действия для элимента get
}
function mod_set(){
// действия для элимента set
}
function mod_add(){
// действия для элимента add
}
function mod_del(){
// действия для элимента del
}
собственно вопрос какой из методов вы считаете
наиболее удобным
мение ресурсо емким
акураттным с точки зрения организации кода
может у вас есть какието предлажения на этот счет
в моем случае действия элимента занимают от 3 до 10 строчек
количество действий может со временем измениться
мне кажется что если действия элимента предстовляют из себя что-то действительно серьезное и честно заслуживают название "модуль"
то лучше использовать третий вариант и ООП, но какой использовать в моем случае не знаю
Мое виденье следуючее. Делаем обработчик для каждого действия, которому передаем весь масив ключей, а он сам решает выполнятся или нет. Визиваем обработчики в нужной нам последовательности.
Мое виденье следуючее. Делаем обработчик для каждого действия, которому передаем весь масив ключей, а он сам решает выполнятся или нет. Визиваем обработчики в нужной нам последовательности.
тоесть чтото типа?
foreach ($alldo as $do){
$fname = "mod_".$do
$fname($element1);
}
function mod_get($elem){
if (isset($elem['get'])){
// действия для элимента get
}
}
function mod_set($elem){
if (isset($elem['set'])){
// действия для элимента set
}
}
function mod_add($elem){
if (isset($elem['add'])){
// действия для элимента add
}
}
function mod_del($elem){
if (isset($elem['del'])){
// действия для элимента del
}
}
и порядок выполнения действий опредиляет $alldo а не $element1
Я предлагаю держать в отдельном масиве последовательность обработчиков (в том порядке в каком вам нужно) и foreach делать по ним.
Я предлагаю держать в отдельном масиве последовательность обработчиков (в том порядке в каком вам нужно) и foreach делать по ним.
ну я собственно это и делаю
в элименте [COLOR="Blue"]$element1[/COLOR] приходят данные извне
а в элименте [COLOR="Blue"]$alldo[/COLOR] установлены все доступные обработчики в нужной мне последовательности
просто неочень коректно описал
в элименте [COLOR=Blue]$element1[/COLOR] приходят данные извне
а в элименте [COLOR=Blue]$alldo[/COLOR] установлены все доступные обработчики в нужной мне последовательности
просто неочень коректно описал
Ну тогда да. Я просто чуток недопонял.
Использовать foreach в для этой задачи считаю не самым удачным рещением, да и с точки удобочитаемости if или case выглядит наглядней + foreach все равно потом дергается ифом - смысл?
Кажысь вы читали не внимательно :). else там никаким боком не пойдет
Возможно ) но все равно останусь при совем мнении foreach тут не нужен
* Контроллер
*/
class CSomeController
{
/**
* Обработчик запроса
*
* @param array $aRequest Данные HTTP-запроса
* @return int Код успеха
*/
public function handle( array $aRequest )
{
// Инициализация переменных
$mResult = 0;
try{
// Проверка входных данных
if( !isset( $aRequest['sType'] ) )
throw new Exception( "Не задан тип действия" );
// Обработка полученных данных
$sType = $aRequest['sType'];
// Определение запрашиваемого действия
$sMethodName = "_Action" . strtoupper( $sType[0] ) . substr( $sType, 1 );
if( !method_exists( $this, $sMethodName ) )
throw new Exception( "Действие " . $sMethodName . " не определено" );
// Вызов запрашиваемого действия
$mResult = $this->{$sMethodName}( $aData );
}
// Обработка ошибок
catch( Exception $e )
{
$mResult = -1;
}
return $mResult;
} // end function handle
/**
* Действие: Create
*/
private function _ActionCreate( array $aData )
{
/**/
}
/**
* Действие: Delete
*/
private function _ActionDelete( array $aData )
{
/**/
}
} // end class CSomeController
// Обработка запроса
$oController = new CSomeController();
$iResult = $oController->handle( $_POST );
Аналогичные (почти) решения используются в таких фреймворках как ZF, Symfony и т.д.
благодарю за код, он мне очень понравился
но боюсь вас огорчить
вы как Fenyx не совсем правильно поняли поставленный мною вопрос
вы предлагаете вариант решения для случая выбора 1 из n
один ключ действия и n элементов действия
выполняется 1 действие
меня же интересует решение для случая m из n
m ключей действия и n элементов действия (m<=n)
выполняется m действий
схемы очень похожи, но все же они различны