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

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

  • Chiffa

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

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

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

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

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

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

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

    include 'DecisionTaker.class.php';

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

    $actionManager->RegisterHandler('edit', 'editItem');

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

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

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

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

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

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

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

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

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

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

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

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


               $actionsArr[$action][] = $handler;
               echo 'registered '.$action;


    Спустя 22 сек.
    нуспел
  • Chiffa

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

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

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

    DecisionTaker::Execute($_GET['action'], $_GET['id']);

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

    $actionManager->Execute($_GET['action'], $_GET['id']);

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

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

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

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

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

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

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

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

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


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

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

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



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

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

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




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

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

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

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

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

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

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

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

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