ФорумПрограммированиеPHP для идиотовPHP и ООП → Замена switch-case классом

Замена switch-case классом

  • Chiffa

    Сообщения: ? Репутация: N Группа: Джедаи

    Spritz 9 июля 2009 г. 2:22

    Всё началось со спора на работе, о том, что switch-case на 5 экранов это не есть хорошо, и надо бы заменять его чем-то красивым. Было предложено несколько вариантов на плюсах и с#, по паттернам и крайне ООП-шно.
    А я, со своей стороны, решила сделать простенькую реализацию на php. Без паттернов, не заумную, для себя…
    Есть некий класс DecisionTaker

    <?php
    class DecisionTaker{
    private static $actionsArr = array();

    public function RegisterHandler($action, $handler){
    if(isset($actionsArr[$action]) || $actionsArr[$action] > &#39;&#39;){
    echo &#39;Fail to register handler. The action with such name already exists&#39;;
    return false;
    }else{
    $actionsArr[$action] = $handler;
    echo &#39;registered &#39;.$action;
    }
    }

    public function Execute($action, $item_id){
    if(isset($actionsArr[$action]) || $actionsArr[$action] > &#39;&#39;)
    $actionsArr[$action]($id);
    }
    }
    ?>

    В упрощенном варианте: массив хранит пары действие-обработчик, есть возможность зарегистрировать новый обработчик для события и собственно выполнить обработку.
    Функции пишу и регистрирую в отдельном файле handlers.php

    include &#39;DecisionTaker.class.php&#39;;

    $actionManager = new DecisionTaker();
    function editItem($item_id){
    echo &#39;Editing item №&#39;.$item_id;
    }

    $actionManager->RegisterHandler(&#39;edit&#39;, &#39;editItem&#39;);

    function deleteThisShit($item_id){
    echo &#39;Deleting item №&#39;.$item_id;
    }
    $actionManager->RegisterHandler(&#39;delete&#39;, &#39;deleteThisShit&#39;);

    Если после второго вызова
    $actionManager->RegisterHandler(&#39;edit&#39;, &#39;editItem&#39;);

    посмотреть на массив $actionsArr, он содержит только один элемент - последний. Ну а на момент попытки вызова Execute $actionsArr вообще пустой. Тоесть при каждом обращении к объекту массив чистится(( Чё так?.. И как сделать, чтоб было как мне надо?
    На вопрос: &quot;Зачем и кому это вообще нужно?&quot; Отвечаю - &quot;Нахрен никому не нужно&quot;. Последние пол-года не пишу на пхп, вот пытаюсь его не забывать. Не пытаюсь сделать что-то полезное для потомков равно как и нечто эталонно ООП-шное.
    Заранее пасиба за помощь)
    Если кто видит еще какие косяки - буду благодарна за советы, подсказки и указание на лажи
  • artoodetoo

    Сообщения: 5138 Репутация: N Группа: в ухо

    Spritz 9 июля 2009 г. 2:39, спустя 16 минут 44 секунды

    $this->actionsArr[$action] = $handler;
    ιιlllιlllι унц-унц
  • Chiffa

    Сообщения: ? Репутация: N Группа: Джедаи

    Spritz 9 июля 2009 г. 2:48, спустя 9 минут 29 секунд

    спасибо)) исправилась, помогло
    действительно очень глупая ошибка((( работаем дальше…
  • Trej Gun

    Сообщения: 5299 Репутация: N Группа: в ухо

    Spritz 9 июля 2009 г. 2:56, спустя 7 минут 42 секунды

    r2d2 правду говорит ты его просто переписываешь, сделай так:


               $actionsArr[$action][] = $handler;
               echo &#39;registered &#39;.$action;


    {+++22+++} нуспел
  • Chiffa

    Сообщения: ? Репутация: N Группа: Джедаи

    Spritz 9 июля 2009 г. 5:47, спустя 2 часа 50 минут 58 секунд

    ура)) все заработало как надо. всем спасибо за помощь
    еще пришлось подправить лажу в месте вызова… там какого-то хрена было обращение

    DecisionTaker::Execute($_GET[&#39;action&#39;], $_GET[&#39;id&#39;]);

    но заменить на

    $actionManager->Execute($_GET[&#39;action&#39;], $_GET[&#39;id&#39;]);

    я уже сама дотумкала)))
  • phpdude

    Сообщения: 26617 Репутация: N Группа: в ухо

    Spritz 9 июля 2009 г. 6:01, спустя 13 минут 54 секунды

    ну ты тумка!
    Сапожник без сапог
  • Chiffa

    Сообщения: ? Репутация: N Группа: Джедаи

    Spritz 9 июля 2009 г. 6:03, спустя 2 минуты 8 секунд

    уж какая есть…)
    но я над собой работаю ;)
  • NRG

    Сообщения: 4761 Репутация: N Группа: в ухо

    Spritz 9 июля 2009 г. 7:23, спустя 1 час 20 минут 41 секунду


    ну ты тумка!
    )))))))))))
    бля, ну ты жгёш))))))
  • phpdude

    Сообщения: 26617 Репутация: N Группа: в ухо

    Spritz 9 июля 2009 г. 10:59, спустя 3 часа 35 минут 27 секунд



    ну ты тумка!
    )))))))))))
    бля, ну ты жгёш))))))
    солнышком через линзу тараканофф =))
    Сапожник без сапог
  • rider-sx

    Сообщения: 2717 Репутация: N Группа: Адекваты

    Spritz 9 июля 2009 г. 17:20, спустя 6 часов 21 минуту 2 секунды




    ну ты тумка!
    )))))))))))
    бля, ну ты жгёш))))))
    солнышком через линзу тараканофф =))
    Злодей
  • artoodetoo

    Сообщения: 5138 Репутация: N Группа: в ухо

    Spritz 10 июля 2009 г. 1:28, спустя 8 часов 8 минут 31 секунду

    Chiffa, ты, скорее всего, будешь порождать единственный экземпляр этого класса? Я заметил, что конструктор/деструктор тебе вроде не понадобился.

    Можешь немного переделать его так, чтобы методы тоже были static и избавиться от строки с new. &quot;$this->&quot; меняешь на &quot;self::&quot; …
    Полностью статический класс — стопудовый standalone. Быстрый и блестящий как всё равно что!
    ιιlllιlllι унц-унц
  • Chiffa

    Сообщения: ? Репутация: N Группа: Джедаи

    Spritz 10 июля 2009 г. 2:27, спустя 59 минут 1 секунду

    artoodetoo, спасиб за совет. попробую, переделаю

Пожалуйста, авторизуйтесь, чтобы написать комментарий!