За последние 24 часа нас посетили 49711 программистов и 1731 робот. Сейчас ищут 626 программистов ...

ООП и статические методы

Тема в разделе "PHP для новичков", создана пользователем Лунтик-Некрофил, 4 окт 2011.

  1. Лунтик-Некрофил

    Лунтик-Некрофил Активный пользователь

    С нами с:
    15 май 2010
    Сообщения:
    67
    Симпатии:
    0
    Адрес:
    Тверь
    Добрый вечер!
    Столкнулся с проблемкой - в документации не нашел возможности работы с конструктором/деструктором при обращении к статическим методам. Т.е., при обращении к статическому методу класса нужно передать в конструктор какие-то параметры и обработать их.
    Приведу короткий пример:
    Имеется класс для работы с бд, обращение к классу такое:
    PHP:
    1. <?php
    2. $db = new DB('users'); #в конструктор класса передаем название таблицы
    3. $data = $db->findAll(); #вызов метода класса и присвоение результата в $data
    4. #.. и далее уже обработка данных
    5. ?>
    6.  
    Все хорошо, но не нравится, что объявление класса занимает лишнюю строку, а при работе с множеством таблиц это существенно увеличит размер кода. Сделал в одну строку - в самом классе описал статический метод, создающий новый класс и возвращающий его.
    В итоге имеем:
    PHP:
    1. <?php
    2. #добавленный метод класса:
    3. class DB
    4. {
    5.     public static function model($tbl_name)
    6.     {
    7.         return new DB($tbl_name);
    8.     }
    9. }
    10. #удобное обращение к методу класса
    11. DB::model('users')->findAll();
    12. ?>
    13.  
    Есть ли более правильный подход к данной задаче? Просто на мой взгляд, не очень красиво объявлять класс дважды.
    Заранее спасибо, с ув. Лунтик-Некрофил.
     
  2. MiksIr

    MiksIr Активный пользователь

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    Так и в чем проблема?
     
  3. Лунтик-Некрофил

    Лунтик-Некрофил Активный пользователь

    С нами с:
    15 май 2010
    Сообщения:
    67
    Симпатии:
    0
    Адрес:
    Тверь
    Есть ли более правильный подход к данной задаче? Просто на мой взгляд, не очень красиво объявлять класс дважды. (что, кстати, и написано предпоследней строкой).
     
  4. MiksIr

    MiksIr Активный пользователь

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    Обявить класс дважды нельзя. Можно класс с новым именем наследовать от старого.
    class myDB extends DB

    Но для ваших целей и это не нужно - просто объявить новый класс с именем новым.

    Ну и в общем, если, то такие финты смысла не имеют. Делают их, если нужно получить один экземпляр класса. Например, если вы хотите, что бы DB::model("users") всегда возвращала один и тот же объект, а не создавала новые.
    А для экономии строчек кода такое не делают.
     
  5. Лунтик-Некрофил

    Лунтик-Некрофил Активный пользователь

    С нами с:
    15 май 2010
    Сообщения:
    67
    Симпатии:
    0
    Адрес:
    Тверь
    Так вот меня и интересует, почему такого не делают?
    Например, смотрю на фреймворки - там наоборот, используется, и довольно часто.
    Так кому верить? Вам или разработчикам фреймворков? Меня интересуют хоть какие-то факты, доказательства.
     
  6. MiksIr

    MiksIr Активный пользователь

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    Почитайте "синглтон" - зачем он используется. То, что вы пытаетесь сделать - это копировать внешний вид не понимая зачем он. Синглтон с параметром - это мультитон.
    По сути больше причин использовать статические классы - почти нет.
     
  7. Лунтик-Некрофил

    Лунтик-Некрофил Активный пользователь

    С нами с:
    15 май 2010
    Сообщения:
    67
    Симпатии:
    0
    Адрес:
    Тверь
    Спасибо, то что надо. В документации с таким, к сожалению, не сталкивался.
     
  8. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    PHP:
    1. <?
    2. $db = new DB();
    3. $usersData = $db->findAll('users');
    4. $ordersData = $db->findAll('orders');
    5. ...
    6.  
    не?
     
  9. Михаил

    Михаил Активный пользователь

    С нами с:
    12 июл 2009
    Сообщения:
    545
    Симпатии:
    0
    Адрес:
    Bielarus
    можно же в разных пространствах имён