Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Гостевая с использованием ООП
 
 автор: (Sandr)   (22.05.2011 в 22:45)   письмо автору
 
 

Подкажите как сделать скрипт более объектно ориентированным?

Знаю, что гостевая это не то место где можно применить ООП, но надо же с чегото начать)

<?php 
require_once "connect.php";
class 
add
{
    public 
$name,$mess,$ins;
    function  
__construct($name,$mess)
    {
        
$obj->name $name;
        
$obj->mess $mess;
        
$obj->ins "INSERT INTO `gb` (name, mess)VALUES('{$obj->name}','{$obj->mess}')";
        if(
$obj->name == NULL or $obj->mess == NULL)
        {
            echo 
'Ошибка! Одна из переменных пуста!';
        }
        else
        {
            
$ins mysql_query($obj->ins);
            if(
$ins == true)
            {
                echo 
'Запись успешно произведена';
            }
            else
            {
                echo 
'Ошибка!';
            }
        }
    }
}
switch(
$_GET['a'])
{
    case 
'form':
    echo 
'<form action="?a=write" method="POST">
    <input type="text" name="name"><br>
    <input type="text" name="mess"><br>
    <input type="submit">
    </form>'
;
    exit;
    break;
    
    case 
'write':
    
$obj = new add($_POST['name'],$_POST['mess']);
    echo 
'<br><a href="/">Главная</a>';
    exit;
    break;
}

$res mysql_query("SELECT * FROM `gb`");
while(
$arr mysql_fetch_array($res))
{
    echo 
$arr['name'].'<br>'.$arr['mess'].'<br><hr>';
}
echo 
'<a href="?a=form">Добавить</a>';
?>

  Ответить  
 
 автор: cheops   (22.05.2011 в 23:00)   письмо автору
 
   для: (Sandr)   (22.05.2011 в 22:45)
 

1) Концепция add для класса - плохая идея, создайте лучше класс message, который моделирует одно сообщение и имеет методы для добавления, редактирования, удаления, сокрытия/отображения сообщения (причем этот класс должен с успехом применяться как в системе представления, так и в системе администрирования).
2) switch-ей, особенно в таком простом приложении быть не должно - используйте класс страницы, который в зависимости от переданного параметра вызывает тот или иной метод класса message.
3) Сообщений в гостевой книге может быть много, создайте класс постраничной навигации, причем такой, чтобы его можно было взять и использовать в любом другом приложении, ну или унаследовать от него новый класс и чуть-чуть дописать, но чтобы вся логика постраничной навигации была в базовом классе и переписывать её не приходилось бы. Этому же классу можно поручить формирование списков сообщений на странице.
4) Создайте класс моделирующий HTML-форму, причем такой, чтобы его было удобно использовать в любом приложении, где потребуется создать форму.

PS Делайте что хотите, но 70% вашего кода должна быть легко использована в любом другом приложении (не путем заимстовования, а путем объявления объектов существующих классов и вызовов статических методов). Комментарии вообще нужны очень часто, постарайтесь так сконструировать гостевую книгу, чтобы весь этот механизм можно было прикрепить к товарной позиции, статье и т.д.

  Ответить  
 
 автор: (Sandr)   (22.05.2011 в 23:48)   письмо автору
 
   для: cheops   (22.05.2011 в 23:00)
 

Спасибо за советы) Особено за первый)
Можно по подробнее насчёт 2 и 4 совета?
+++
(Не по теме конечно, но все же. Вы когда-то писали, что на сайте будет расширяться раздел по С++. Сейчас посмотрел, ничего в роде бы не поменялось, или это я плохо искал?)

  Ответить  
 
 автор: cheops   (23.05.2011 в 00:17)   письмо автору
 
   для: (Sandr)   (22.05.2011 в 23:48)
 

2) ООП изобрели для того, чтобы избавиться от огромного количества switch-ей, по сути каждый case-блоков должен быть отдельным классом, которые наследуют от единого класса, а вы просто вызываете метод (полиморфизм - методы у них одинаковые), не заботясь что там за класс. Понятно, что тут скорее всего вам будет сложно избавиться от switch, так как вы вступаете в противоречие с моделью Интернет, которая не является объектно-ориентированной. Но стремиться нужно к тому, чтобы switch-ей в ООП коде не было.
4) Подробнее эта проблематика описана в нашей книге Объектно-ориентированное программирование на PHP. Формы - это рутина, которая забирает очень много времени, хорошо бы эту задачу свести к набору небольших классов, которые удобно объявлять и которые удобно настраивать для оформления форм.

PS Не так быстро, все-таки ведущих программистов в первую очередь бросают на коммерческие проекты, все некоммерческие проекты - в свободное от работы времени, которого не очень много.

  Ответить  
 
 автор: Красная_шляпа   (23.05.2011 в 06:47)   письмо автору
 
   для: (Sandr)   (22.05.2011 в 22:45)
 

Вся эта лабуда с классами тут не уместна, у ООП подхода очень много недостатков(читаем критику), что касается примера, то нужно что-то вроде этого

class GuestBook {
public method addMessage () {
// ...
}
public method editMessage () {
// ...
}
public method deleteMessage () {
// ...
}
// ...
}

  Ответить  
 
 автор: (Sandr)   (25.05.2011 в 23:08)   письмо автору
 
   для: Красная_шляпа   (23.05.2011 в 06:47)
 

Переделал код. Но вот понят как избавиться от switch не могу.. Может на if'ах тогда? Подскажите, как улучшить данный код?

<?php session_start();
require_once 
"connect.php";
class 
Messages
{
    public 
$name,$mess,$date,$sel,$ins,$upd,$del,$id;
    public function 
Show()
    {
        
$obj->sel "SELECT * FROM `gb`";
        
$sel mysql_query($obj->sel);
        while(
$arr mysql_fetch_array($sel))
        {
            echo 
$arr['name'].'<br>'.$arr['mess'].'<br><hr>';
        }
    }

    public function 
Add($name,$mess)
    {
        
$obj->name $name;
        
$obj->mess $mess;
        
$obj->ins "INSERT INTO `gb` (name, mess)VALUES('{$obj->name}','{$obj->mess}')";
        if(
$obj->name == NULL or $obj->mess == NULL)
        {
            echo 
'Ошибка! Одна из переменных пуста!';
        }
        else
        {
            
$ins mysql_query($obj->ins);
            if(
$ins == true)
            {
                echo 
'Запись успешно произведена';
            }
            else
            {
                echo 
'Ошибка!';
            }
        }
    }

    public function 
Del($id)
    {
        
$obj->id $id;
        
$obj->del "DELETE FROM `gb` WHERE id='{$obj->id}'";
        if(empty(
$obj->id))
        {
            echo 
'Ошибка! Ид сообщения пуст!';
        }
        else
        {
            
$del mysql_query($obj->del);
            if(
$del == true)
            {
                echo 
'Сообщение удалено.';
            }
            else
            {
                echo 
'Ошибка! Сообщение не удалено!';
            }
        }
    }
    
    public function 
Edit($id)
    {
        
$obj->id $id;
        
$obj->sel "SELECT * FROM `gb` WHERE `id`='{$obj->id}'";
        
$sel mysql_fetch_array(mysql_query($obj->sel));
        echo 
'<form action="" method="POST">
            <input type="text" name="name" value="'
.$sel['name'].'"><br>
            <input type="text" name="mess" value="'
.$sel['mess'].'"><br>
            <input type="submit">
            </form>'
;
    }
}

switch(
$_GET['a'])
{
    case 
'form':
    echo 
'<form action="?a=write" method="POST">
    <input type="text" name="name"><br>
    <input type="text" name="mess"><br>
    <input type="submit">
    </form>'
;
    exit;
    break;
    
    case 
'write':
    
$obj = new Messages;
    
$obj->Add($_POST['name'],$_POST['mess']);
    echo 
'<br><a href="/">Главная</a>';
    exit;
    break;
}

$obj = new Messages;
echo 
$obj->Show();
echo 
'<a href="?a=form">Добавить</a>';
?>

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования