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

Форум PHP

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

 

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

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

тема: Решил начать использовать ООП и не получилось.
 
 автор: Belkin   (22.01.2012 в 16:12)   письмо автору
 
 

Значит есть код, постраничный вывод. Решил сделать его как класс pages.class.php. Без класса он работает, с классом - нет.

Вот код без класса:

<?php
            $page 
intval($_GET['page']);  
                                 
            
$number intval($_SESSION['selectors']);

            if(!isset(
$_GET['page'])) {
                
                
$_GET['page'] = 1;
                                
            }
            
            if(
$number <= || $number 50) {
                
                
$number 10;
                
            }
            
            
# выбираем все записи
            
$query mysql_num_rows(mysql_query("SELECT * FROM `table`"));
                                 
            
# считаем количество страниц
            
$numpages ceil($query/$number);
            
            if(
$page <= || $page $numpages) {
                
                
$page 1;
                
            }
            
            
# выбираем требуемый промежуток записей на страницу
            
$query mysql_query("SELECT * FROM `table` ORDER BY id DESC LIMIT ".($page*$number-$number).", ".$number."");
            
            
# узнаем страницу
            
$url '?pages='.$_GET['pages'].'&';
            
            
# левая сторона
            
if($page 0$page_begin '<a  href="'.$url.'page=1">1</a>';   
            if(
$page 0$page_none_left '<span>...</span>';     
            if(
$page 0$page2left '<a href="'.$url.'page='.($page 2).'">'.($page 2).'</a>';  
            if(
$page 0$page1left '<a href="'.$url.'page='.($page 1).'">'.($page 1).'</a>';
                  
            
# правая сторона
            
if($page <= $numpages$page1right '<a href="'.$url.'page='.($page 1).'">'. ($page 1).'</a>'
            if(
$page <= $numpages$page2right '<a href="'.$url.'page='.($page 2).'">'.($page 2).'</a>';      
            if(
$page <= $numpages$page_none_right '<span>...</span>'
            if(
$page <= $numpages$page_last '<a href="'.$url.'page='.$numpages.'">'.$numpages.'</a>'
            
            
# вывод ссылок
            
if($numpages >= 1) {
                
                
$left $page_begin.$page_none_left.$page2left.$page1left;
                
$right $page1right.$page2right.$page_none_right.$page_last
            
            }
?>


Вот код класса, который я пытался сделать:

<?php

    
/*
    *
    *   Постраничный вывод
    *
    */
    
    
session_start();
    
    class 
Pages {
        
        public 
$page;
        public 
$number;
        public 
$numpages;
        public 
$url;
        public 
$query;
        
        public function 
guard() {
            

            
# $page - номер страницы
            # $number - кол-во значений на страницу (10, 30, 50)
            
            
$page intval($_GET['page']);  
                                 
            
$number intval($_SESSION['selectors']);

            if(!isset(
$_GET['page'])) {
                
                
$_GET['page'] = 1;
                                
            }
            
            if(
$number <= || $number 50) {
                
                
$number 10;
                
            }
             
            if(
$page <= || $page $numpages) {
                
                
$page 1;
                
            }
            
        }

        public function 
go() {
             
            
# выбираем все записи
            
$query mysql_num_rows(mysql_query("SELECT * FROM `table`"));
                                 
            
# считаем количество страниц
            
$numpages ceil($query/$number);
            
            
$this->guard();
            
            
# выбираем требуемый промежуток записей на страницу
            
$query mysql_query("SELECT * FROM `table` ORDER BY id DESC LIMIT ".($page*$number-$number).", ".$number."");
            
            
# узнаем страницу
            
$url '?pages='.$_GET['pages'].'&';
            
        }
        
        public function 
open() {
            
            
$this->guard();
            
$this->go();
            
            
# левая сторона
            
if($page 0$page_begin '<a  href="'.$url.'page=1">1</a>';   
            if(
$page 0$page_none_left '<span>...</span>';     
            if(
$page 0$page2left '<a href="'.$url.'page='.($page 2).'">'.($page 2).'</a>';  
            if(
$page 0$page1left '<a href="'.$url.'page='.($page 1).'">'.($page 1).'</a>';
                  
            
# правая сторона
            
if($page <= $numpages$page1right '<a href="'.$url.'page='.($page 1).'">'. ($page 1).'</a>'
            if(
$page <= $numpages$page2right '<a href="'.$url.'page='.($page 2).'">'.($page 2).'</a>';      
            if(
$page <= $numpages$page_none_right '<span>...</span>'
            if(
$page <= $numpages$page_last '<a href="'.$url.'page='.$numpages.'">'.$numpages.'</a>';             
        
            
# вывод ссылок
            
if($numpages >= 1) {
                
                
$left $page_begin.$page_none_left.$page2left.$page1left;
                
$right $page1right.$page2right.$page_none_right.$page_last
                
                echo 
$left.'<span class="rightb-selectors-active">'.$page.'</span>'.$right;  
                
            }
        
        }
          
    }

   
$pages = new Pages;

   
// ВЫЗЫВАТЬСЯ ДОЛЖНО ТАК:
   
$pages->open();

?>


Теперь на счет вопросов и как я хотел, чтобы он работал. Значит вот:

guard() - это метод проверки, тут проверяются все значения. Второй раз он вызывается для проверки страницы, чтобы не ввели меньше 1 и больше всего количества страниц.

go() - тут все формируется.

open() - должен выводить саму навигацию. И тут тоже вывел гуард для проверки )

Теперь проблемы.
Как все-таки работают эти методы и переменные? проблема в том, что метод Go он формирует данные и получает точное количество страниц $numpages, но когда я вызываю его в open(), то $numpages оказывается равняется 0.

И еще не могу понять, почему не передается значение переменной $_SESSION['selectors'] - это количество значений, которые выводятся на страницу(она присваивается $number). Сессия вроде бы открыта, а значение не передается..и поэтому возникает ошибка, что оно делит на 0.

  Ответить  
 
 автор: cheops   (22.01.2012 в 16:20)   письмо автору
 
   для: Belkin   (22.01.2012 в 16:12)
 

1. Вы не приводите как вызываете класс - без этого сложно воспроизвести ситуацию.
2. Для обращения к переменным класса используется либо префикс $this->, либо Pages:: иначе переменные просто остаются переменными. Из-за этого и не работает
3. Если вам интересно, могу покритиковать объектно-ориентированную схему. Это не относится к работоспособности, но относится к извлечению прибыли из использования ООП, если так и дальше будете составлять классы, очень скоро разочаруетесь в ООП и будете считать, что от него одни проблемы, а проблемы не в нем, а в том, что class и this-> это лишь инструменты, вроде for() и function, а вдохнуть жизнь в программу (в том числе объектно-ориентированную) должны вы и ваши знания.

  Ответить  
 
 автор: Belkin   (22.01.2012 в 16:21)   письмо автору
 
   для: cheops   (22.01.2012 в 16:20)
 

Я же показал вроде бы )
<?php

   
...

   
$pages = new Pages

   
// ВЫЗЫВАТЬСЯ ДОЛЖНО ТАК: 
   
$pages->open(); 

?>


И если не трудно, его долго к рабочему виду приводить? просто я бы посмотрел, как оно должно быть..если не трудно конечно.

Очень интересно - рассказывайте все, что думаете. Просто я думал, что все так легко будет, уже обрадовался, а он не работает..

  Ответить  
 
 автор: cheops   (22.01.2012 в 16:50)   письмо автору
 
   для: Belkin   (22.01.2012 в 16:21)
 

1. Да, не заметил, каюсь :)
2. Вот смотрите
        public function go() { 
              
            # выбираем все записи 
            $query = mysql_num_rows(mysql_query("SELECT * FROM `table`")); 
                                  
            # считаем количество страниц 
            $numpages = ceil($query/$number); 
             
            $this->guard(); 
             
            # выбираем требуемый промежуток записей на страницу 
            $query = mysql_query("SELECT * FROM `table` ORDER BY id DESC LIMIT ".($page*$number-$number).", ".$number.""); 
             
            # узнаем страницу 
            $url = '?pages='.$_GET['pages'].'&'; 
             
        }
У вас переменная $url локальная, чтобы это новое значение было видно в других методах нужно чтобы вместо $url использовался $this->url

  Ответить  
 
 автор: cheops   (22.01.2012 в 17:05)   письмо автору
 
   для: Belkin   (22.01.2012 в 16:12)
 

3. Вообще просто взять готовый код и распилить его на отдельные методы - это довольно часто встречающаяся ошибка, у программистов только начинающих осваивать ООП. Класс - это не просто хранилище кода, это - инструмент. Причем инструмент, в устройство которого можно не вдаваться.
Смотрите у вас в методе guard() используются глобальные переменные $_GET['page'] и $_SESSION['selectors']. Если разработчик использует другие переменные на странице, он не сможет воспользоваться вашим классом, без анализа его кода, а ведь классы ровно для того и вводились, чтобы внешние разработчики пользовались только интерфейсом, не заглядывая внутрь класса и освобождая мозг под более абстрактные задачи. Т.е. очевидно, что эти параметры лучше передать в конструктор класса при объявлении объекта. Причем когда объект объявляется, ему будут передаваться эти параметры и не будет необходимости проверять их потом на протяжении всего жизненного цикла объекта. Задача конструктора как раз и состоит привести объект в согласованное состояние перед работой. А вы пускаете параметры через черный ход, в результате вынуждены их постоянно контролировать.
Далее метод go(), который я так понимаю должен выполняться между guard() и open(). А зачем вообще заставлять пользователя вызывать метод, который к тому же зависит от порядка вызова остальных методов? Чтобы внешний программист проникся важностью класса и его внутренней работы? Так задача класса ровно обратная - как можно больше скрыть от внешнего , чтобы освободить его мозг для других задач. Да вы и сами это понимаете, поэтому вызывали метод go() в open(), а для каких еще целей может go() потребоваться? Может от него лучше избавиться? Ведь класс не обязательно должен состоять из нескольких методов, метод может быть и один... сила классов в том, что вы можете унаследовать от этого класса новый, добавив новый метод, при этом создание нового класса не приведет к нарушению работы старого кода, обращавшегося к старым классам.

Вы бы лучше ввели метод, который возвращает параметр $number = 10; например, get_number() и везде бы использовали $this->get_number(). Захотите потом извлекать это параметр из базы данных (ну например каждый пользователь сам выставляет себе удобное для него число), унаследовали от текущего класса новый, и переопределили там ровно один метод get_number(), вам не придется даже вспоминать, как там у вас постраничная навигация работает, достаточно просто изменить работу одного метода. При этом старый класс останется без изменений и код, его используются не пострадает от внесения правок путем наследования.

  Ответить  
 
 автор: Belkin   (22.01.2012 в 17:11)   письмо автору
 
   для: cheops   (22.01.2012 в 17:05)
 

Все, теперь понял, как работает )

Получилось!

Вот код, правда я тут примитивно поставил $this- почти везде, не знаю правильно это и нужно ли так делать?

<?php

    
/*
    *
    *   Постраничный вывод
    *
    */
    
    
session_start();
    
    class 
Pages {
        
        public 
$page;
        public 
$number;
        public 
$numpages;
        public 
$url;
        public 
$query;
        
        public function 
guard() {
            

            
# $page - номер страницы
            # $number - кол-во значений на страницу (10, 30, 50)
            
            
$this->page intval($_GET['page']);  
                                 
            
$this->number intval($_SESSION['selectors']);

            if(!isset(
$_GET['page'])) {
                
                
$_GET['page'] = 1;
                                
            }
            
            if(
$this->number <= || $this->number 50) {
                
                
$this->number 10;
                
            }
             
            if(
$this->page <= || $this->page $this->numpages) {
                
                
$this->page 1;
                
            }
            
        }

        public function 
go() {
             
            
# выбираем все записи
            
$this->query mysql_num_rows(mysql_query("SELECT * FROM `lessons`"));
                                 
            
# считаем количество страниц
            
$this->numpages ceil($this->query/$this->number);
            
            
$this->guard();
            
            
# выбираем требуемый промежуток записей на страницу
            
$this->query mysql_query("SELECT * FROM `lessons` ORDER BY id DESC LIMIT ".($this->page*$this->number-$this->number).", ".$this->number."");
            
            
# узнаем страницу
            
$this->url '?pages='.$_GET['pages'].'&';
            
        }
        
        public function 
open() {
            
            
$this->guard();
            
$this->go();
            
            
# левая сторона
            
if($this->page 0$page_begin '<a  href="'.$this->url.'page=1">1</a>';   
            if(
$this->page 0$page_none_left '<span>...</span>';     
            if(
$this->page 0$page2left '<a href="'.$this->url.'page='.($this->page 2).'">'.($this->page 2).'</a>';  
            if(
$this->page 0$page1left '<a href="'.$this->url.'page='.($this->page 1).'">'.($this->page 1).'</a>';
                  
            
# правая сторона
            
if($this->page <= $this->numpages$page1right '<a href="'.$this->url.'page='.($this->page 1).'">'. ($this->page 1).'</a>'
            if(
$this->page <= $this->numpages$page2right '<a href="'.$this->url.'page='.($this->page 2).'">'.($this->page 2).'</a>';      
            if(
$this->page <= $this->numpages$page_none_right '<span>...</span>'
            if(
$this->page <= $this->numpages$page_last '<a href="'.$this->url.'page='.$this->numpages.'">'.$this->numpages.'</a>';             
        
            
# вывод ссылок
            
if($this->numpages >= 1) {
                
                
$left $page_begin.$page_none_left.$page2left.$page1left;
                
$right $page1right.$page2right.$page_none_right.$page_last

                echo 
$left.'<span class="rightb-selectors-active">'.$this->page.'</span>'.$right;  
                
            }
        
        }
          
    }
    

?>


Да, так я думал сделать такую штуку, чтобы он гибкий был )

  Ответить  
 
 автор: cheops   (22.01.2012 в 17:14)   письмо автору
 
   для: Belkin   (22.01.2012 в 17:11)
 

>Вот код, правда я тут примитивно поставил $this- почти везде, не знаю правильно это и нужно ли
>так делать?
Вы главное начните :)))

PS Следите за тем, чтобы классами было удобно пользоваться, причем не только вам, но и посторонним людям, желательно, чтобы класс можно было легко вынуть из одного проекта в другой и он не должен за собой тащить пол сайта. Т.е. связи должны быть минимальны, при этом если сам класс создавать сложно и долго - это нормально. Смысл ООП в том, чтобы затратить много времени один раз и потом его больше никогда для решения этой задачи не тратить (даже если нужна не в точности такая же задача, а модификация).

  Ответить  
 
 автор: Belkin   (22.01.2012 в 17:17)   письмо автору
 
   для: cheops   (22.01.2012 в 17:14)
 

Понял, буду стараться все минимализировать и сделать удобно к пользованию!

И еще, вот допусти такой кусок кода:
            # левая сторона 
            if($this->page - 3 > 0) $page_begin = '<a  href="'.$this->url.'page=1">1</a>';    
            if($this->page - 4 > 0) $page_none_left = '<span>...</span>';      
            if($this->page - 2 > 0) $page2left = '<a href="'.$this->url.'page='.($this->page - 2).'">'.($this->page - 2).'</a>';   
            if($this->page - 1 > 0) $page1left = '<a href="'.$this->url.'page='.($this->page - 1).'">'.($this->page - 1).'</a>'; 
                   
            # правая сторона 
            if($this->page + 1 <= $this->numpages) $page1right = '<a href="'.$this->url.'page='.($this->page + 1).'">'. ($this->page + 1).'</a>';  
            if($this->page + 2 <= $this->numpages) $page2right = '<a href="'.$this->url.'page='.($this->page + 2).'">'.($this->page + 2).'</a>';       
            if($this->page + 4 <= $this->numpages) $page_none_right = '<span>...</span>';  
            if($this->page + 3 <= $this->numpages) $page_last = '<a href="'.$this->url.'page='.$this->numpages.'">'.$this->numpages.'</a>';  


нельзя присвоить с самого начала $page - $this-page? так и наглядней вроде бы.

И вот еще один вопрос и все )) я ухожу ))

Как подключают все эти классы? не отдельно же каждый?
у меня появилась идея в папке где будут храниться классы > class, создал файл clasess.hpp и в нем уже подключаю все классы, а уже его подключаю к основной странице.

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

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