ФорумПрограммированиеPHP для идиотовPHP и ООП → и опять MVC...

и опять MVC...

  • sap

    Сообщения: 2701 Репутация: N Группа: Кто попало

    Spritz 5 августа 2008 г. 15:29, спустя 24 минуты 31 секунду

    Не совсем удачный пример я привел :) Возможно, нужно было использовать static — news::add();
    Если взять еще удаление, то news::delete(); пожалуй, грамотней чем $news->delete();

    Но вообще я не об этом. Допустим, у вас есть новости в БД. Тогда (примитивный пример):
    class news
    {
    private $id;

    private $title;
    private $date;
    private $text;

    public function __construct($id)
    {
    $this->id = $id;

    $result = mysql_query('SELECT `title`, `date`, `text` FROM `news_table` WHERE `id`="'.$this->id.'" LIMIT 1');

    $row = mysql_fetch_assoc($result);

    $this->title = $row['title'];
    $this->date = $row['date'];
    $this->text = $row['text'];
    }

    public function get_new()
    {
    return array (
    'id' => $this->id,
    'title' => $this->title,
    'date' => $this->date,
    'text' => $this->text
    );
    }

    public function edit_new($title, $date, $text)
    {
    $this->title = $title;
    $this->date = $date;
    $this->text = $text;

    mysql_query ('UPDATE `news_table` SET `title`="'.$title.'", `date`="'.$this->date.'", `text`="'.$this->text.'" WHERE `id`="'.$this->id.'" LIMIT 1');

    return true;
    }
    }

    Грубо говоря, все свойства хранятся в обьекте; мы можем получать/изменять их в зависимости от наших нужд, при это нужно было всего лишь передать в конструктор id новости. Все! ИМХО, это намного удобнее, чем писать на каждое действие по функции и тягать массив с данными.

    Если же сделать немного более абстрактно, то можно получить вообще что-то на подобии:
    class news
    {
    private $id;

    private $properties = array();

    public function __construct($id)
    {
    $this->id = $id;

    $result = mysql_query('SELECT * FROM `news_table` WHERE `id`="'.$this->id.'" LIMIT 1');

    $row = mysql_fetch_assoc($result);

    foreach ($row as $key=>$value)
    $this->properties[$key] = $value;
    }

    public function get_property($name)
    {
    if (isset($this->properties[$name]))
    return $this->properties[$name];

    return false;
    }

    public function set_property($name, $value)
    {
    if (isset($this->properties[$name])) {
    $this->properties[$name] = $value;
    return true;
    }

    return false;
    }
    }

    А запрос с UPDATE можно вообще засунуть в деструктор :) Вы можете представить себе подобное при использовании функционального подхода?

    Да, можно таскать все данные по элементу в массиве и написать те же самые функции. Но вот это уже как раз… не знаю даже как сказать, неестественно, что ли. По-моему, правильней рассмаривать новость, как обьект, обладающий свойствами, а не как массив данных. Вот вы говорили про несоответствие реального и программного мира — в реальном мире у вас есть, например, рубашка, обладающая свойствами — цвет, тип ткани, размер, количество пуговиц. Но рубашка это именно обьект, а не просто набор этих данных. То же самое и здесь.

    Зачем ей знать как добавлять себя в БД? Или отрисовывать себя в X окнах или консольных терминалах.

    На счет БД — вопрос спорный. На счет отрисовки — ей однозначно не нужно этого «знать». Отрисовка — это уже вью-логика, которая сюда никак не лезет. Но ведь обьект и не содержит html-кода, только данные.
  • killich

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

    Spritz 5 августа 2008 г. 15:48, спустя 19 минут 46 секунд

    от ООП отказываться не нужно, низачто! Слишком многое оно дает что бы им пренебрегать.
    А form::input() и $form->input() все же излишне по сравнению с просто input(). Что в ХТМЛ много элементов с инпутом? input() говорит о себе ничуть не меньше чем form::input() или html->document->form->input->hide(); или еще что то подобное.

    вот самы простой пример:

    function input($name='name', $size='10', $maxlength='10', $value='', $etc='');

    inWork:

    input('login', 10, 10, '', 'style="display: none"');


    смотри у тебя есть оъбект input у которого ты потом можешь вызывать методы например так
    Просто код:
    $form->input()->hide();
    ….

    $form->input()->filter("/a-z/");


    а твоим способом придеться передавать все эти параметры в функцию а потом еще и отменить их нельзя будет или переназначить если чтото поменяеться в логике

    Кого переназначить ? Фильтр?

    Фильтр? Зачем при генерации формы указывать фильтр? При отправке формы проверка:
    1. на клиенте с javascript
    2. на сервере - обработчик формы

    если смотрим 1 случай (а другое и смотреть неможно ибо там уже от самой формы ничего не зависит)  в тот же $ect прописываем событие onBlur с именем функции проверки поля формы, или сам сабмит с обработчиком (на что у меня есть submit() ) .
    А javaScript подключаем к странице и переопределяем когда и как надо. Опять таки, php совсем никчему на мой взгляд знать как обрабатывать формы на стороне клиента, на это js есть.

    Или, наверное, если имели в виду что ставим input сперва на display, а потом что то в скрипте случилось такого что нужно сделать hide и происходит это еще до того момента как начал выводится HTML. Тогда, наверное, Вы просто поспешили начать генерить форму, пусть сначала все логика пройдет, а уж потом по ее результату рисуйте форму и не нужен будет $form->input()->hide(); ибо вызовется тот же input('login', 10, 10, '', 'style="display: none"'); или вообще не вызовется и в форме просто этого поля не будет.

    HTML хелпер у меня работает например вот так. В зависимости от потребностей я его дорабатываю, изменяю и вполне доволен простотой использования. ничего лишнего абс.


    <?php echo form_start() ?>
    <table border="0" cellspacing="0">
    <tr>
    <td class="under_line">Логин:</td>
    <td class="under_line"><?php echo activ_input('login', '30', '30', 'Например: user') ?></td>
    </tr>
    <tr>
    <td class="under_line">Email:</td>
    <td class="under_line"><?php echo activ_input('email', '30', '30', 'Например: [email protected]') ?></td>
    </tr>
    <tr>
    <td class="under_line">Пароль:</td>
    <td class="under_line"><?php echo password('password', '10', '10', 'пароль1' ) ?></td>
    </tr>
    <tr>
    <td class="under_line">Повторите пароль:</td>
    <td class="under_line"><?php echo password('password2', '10', '10', 'пароль2' ) ?></td>
    </tr>
    <tr>
    <td class="under_line">Создать:</td>
    <td class="under_line"><?php echo submit("Вперед!") ?></td>
    </tr>
    </table>

    <?php echo hidden('ctrl', 'registration') ?>
    <?php echo hidden('action', 'user_registration') ?>

    <?php echo form_end() ?>

    Рубист с большой буквы Г. Серый кардинал кулинарного блога open-cook.ru
  • killich

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

    Spritz 5 августа 2008 г. 16:06, спустя 17 минут 55 секунд


    Но рубашка это именно обьект, а не просто набор этих данных.

    В информационном мире объекты реального мира представляются набором данных (информацией) о них. Разве не так?

    О Новостях:

    Если говорить о той же новости как об объекте, или ленте новостей если угодно, то в моей голове тут же созревает Cи подход.
    Я бы создал класс списка объектов (или взял те же самые контейнеры STL - для организации очереди или стека новостей), унаследовал бы его классом новость (или напихал бы новости в контейнер STL) а потом бы создал алгоритм перебирающий новости и отрисовывающий их (или заносящий в БД или файл).
    О том что бы новость знала как ей попасть в БД или стек STL или очередь речи вообще не идет.
    Даже когда очередь создается пользователем и новость наследует родительский класс реализующий очередь - там к каждой новости кроме 2х указателей ничего лишнего не прибавляется. Тем паче - алгоритмов. Если новостей очень много и в каждой есть алгоритм занесения себя в БД - это просто тупо приведет не целесообразному расходу ресурсов.


    Отрисовка — это уже вью-логика


    если говорить красиво - внесение в БД Model логика >:0) зачем же Вы так Model обижаете, у нее прав ничуть не меньше чем у вида.
    Рубист с большой буквы Г. Серый кардинал кулинарного блога open-cook.ru
  • sap

    Сообщения: 2701 Репутация: N Группа: Кто попало

    Spritz 5 августа 2008 г. 16:17, спустя 10 минут 36 секунд



    Но рубашка это именно обьект, а не просто набор этих данных.

    В информационном мире объекты реального мира представляются набором данных (информацией) о них.

    Если хотите, массив — это просто набор данных, а обьект — структуированный набор данных, причем обладающий более высоким уровнем абстракции (соответственно, легко расширяемый и модифицируемый).
  • killich

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

    Spritz 5 августа 2008 г. 16:27, спустя 9 минут 47 секунд

    структуированный набор данных
    120% согласен
    Рубист с большой буквы Г. Серый кардинал кулинарного блога open-cook.ru
  • Trej Gun

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

    Spritz 5 августа 2008 г. 16:31, спустя 3 минуты 58 секунд

    блин, забыл убрать $

    дело не в знаке бакса, например если объект формы создан то теоритически из одного инпута можно получить доступ к другому и к всей форме целиком. а если он статический то нихрена не выйдет

    Если же сделать немного более абстрактно

    а давай тогда будем использовать интерпрайз бины и сделаем именованый сетер и гетер на каждую пропертю

    Зачем ей знать как добавлять себя в БД?

    теоретически это может быть инверсия зависимостей
    http://wiki.agiledev.ru/doku.php?id=ooad:dependency_injection

    html->document->form->input->hide()

    палку не перегибай!

    вот самы простой пример:

    $form->input->setName('name')->setSize(10)->setMaxlength(100);

    или так
    $form->input->set('name','name')->set('size',10)->set('maxlength',100);

    или так
    $form->input->set(array('name','size','maxlength',array('name',10,100));

    помоему это не важно. но это все свойства инпута

    Фильтр? Зачем при генерации формы указывать фильтр?

    представь что этой строкой генерируеться javascript код

    $form->input()->hide();

    допустим есть два инпута, секретный_вопрос и секретный_ответ, в секретный вопрос это селект бокс в котором есть N вариантов и один из них "ваш вариант" когда ты его выбераешь у тебя появляеться дополнительный инпут в который ты пишешь свой вопрос
  • adw0rd

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

    Spritz 5 августа 2008 г. 17:06, спустя 35 минут 41 секунду

    дело не в знаке бакса, например если объект формы создан то теоритически из одного инпута можно получить доступ к другому и к всей форме целиком. а если он статический то нихрена не выйдет


    Мавр я и говорю… тот же самый аналог функций что и у killich. Ты меня не слышишь.
    https://smappi.org/ - платформа по созданию API на все случаи жизни
  • Trej Gun

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

    Spritz 5 августа 2008 г. 17:08, спустя 1 минуту 18 секунд

    тк это ооп ради ооп и никакого толку лучше уж функциями
  • killich

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

    Spritz 5 августа 2008 г. 17:08, спустя 39 секунд



    допустим есть два инпута, секретный_вопрос и секретный_ответ, в секретный вопрос это селект бокс в котором есть N вариантов и один из них "ваш вариант" когда ты его выбераешь у тебя появляеться дополнительный инпут в который ты пишешь свой вопрос.


    ага. видимо, удачный пример, интересненько. пока сам не сделаю - обсудить и поделиться не смогу.
    Рубист с большой буквы Г. Серый кардинал кулинарного блога open-cook.ru
  • adw0rd

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

    Spritz 5 августа 2008 г. 17:10, спустя 1 минуту 30 секунд

    CTAPbIu_MABP, ты это мне?
    https://smappi.org/ - платформа по созданию API на все случаи жизни
  • Trej Gun

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

    Spritz 5 августа 2008 г. 17:15, спустя 4 минуты 58 секунд

    adw0rd, все закрыли тему мы знаим что мы правы и неипет)))
  • killich

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

    Spritz 5 августа 2008 г. 17:17, спустя 2 минуты 14 секунд

    А кто какие MVC основанные платформы пользовал. Поделитесь. Как общее впечатление, удержались ли вы на них, с какой стенкой столкнулись?
    Рубист с большой буквы Г. Серый кардинал кулинарного блога open-cook.ru
  • sap

    Сообщения: 2701 Репутация: N Группа: Кто попало

    Spritz 5 августа 2008 г. 18:05, спустя 48 минут 9 секунд

    А я не люблю юзать чьи-то платформы :)

    все закрыли тему мы знаим что мы правы и неипет)))

    Угу =)))
  • adw0rd

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

    Spritz 5 августа 2008 г. 18:28, спустя 22 минуты 30 секунд

    CTAPbIu_MABP, а нееттт :) я люблю правду :)

    Нафег мне делать дополнительную функцию вне моего класса, который занимается определенной деятельностью, только лишь потому, что некоторые считают что это ООП ради ООП?
    https://smappi.org/ - платформа по созданию API на все случаи жизни
  • Trej Gun

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

    Spritz 5 августа 2008 г. 18:58, спустя 30 минут 48 секунд

    adw0rd, на следующем рпс мне морду набьешь за ооп, договорились?!)))

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