Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> MVC, экз. класса или стат. класс контроллера, Не проще ли создать стат. класс контр?.. 
:(
    Опции темы
MCMXC
Дата 17.8.2011, 11:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 27.2.2007
Где: Инет :)

Репутация: нет
Всего: нет



У меня возник такой вопрос: почему все создают экземпляр определенного класса контроллера, а не изначально объявляют класс контроллер как статический?.. Ведь по идее, всё равно ж нам не понадобится использовать две копии контроллера в приложении с разными данными... Как вы считаете?..
PM MAIL ICQ   Вверх
krundetz
Дата 17.8.2011, 16:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вечный странник
***


Профиль
Группа: Завсегдатай
Сообщений: 1400
Регистрация: 14.6.2007
Где: НН(Сормово)

Репутация: 20
Всего: 69



Не совсем понимаю ваш вопрос. Можно увидеть пример?


--------------------
!цензоры - Хранитель стратегической жидкости
Группа ТГВ
Группа Нижний Новгород
user posted image
PM MAIL   Вверх
MCMXC
Дата 17.8.2011, 16:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 27.2.2007
Где: Инет :)

Репутация: нет
Всего: нет



Ну смотрите, допустим, фронт контроллер вызывает определенный контроллер в зависимости от запроса пользователя, например, посетитель переходит по ссылке index.php?c=catalog&act=list, сразу вызывается фронт контроллер который создает нужный экземпляр класса, в нашем случае CatalogController

$catalog = new CatalogController();
$catalog->tralivali();

зачем создавать экземпляр контроллера, почему не использовать статические контроллеры, тогда было бы:

CatalogController::tralivali();
PM MAIL ICQ   Вверх
krundetz
Дата 18.8.2011, 15:08 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вечный странник
***


Профиль
Группа: Завсегдатай
Сообщений: 1400
Регистрация: 14.6.2007
Где: НН(Сормово)

Репутация: 20
Всего: 69



Основная и думаю главная причина здесь в том что у нас не создается экземпляр класса, а следовательно:

1. В этом статическом методе должна быть вся реализация конкретного функционала, так как из статического метода мы не можем сделать так:

Код

class CatalogController {
    public function tralivali() {
        $this->tralivali1();
        $this->tralivali2();
    }
    public function tralivali1() {
        /*некое действие 1*/
    }
    public function tralivali2() {
        /*некое действие 2*/
    }
}


Если метод tralivali, будет статическим так сделать не получиться, если только в статическом методе не создавать экземпляр класса.

2. Также из статического метода нельзя обратиться к не статическим свойствам класса,  а соответственно мы не можем хранить состояние, точнее мы должны его тащить за собой.

3. Из 1 и 2 следует, что мы теряем такой мощный инструмент как наследование.То есть вместо того чтобы написать один раз повторяющийся код в классе родителе, мы его повторяем во множестве реализаций контроллеров в нашей системе.

думаю можно ещё перечислить несколько причин, почему так делать не стоит.

То есть, заменяя таким образом вызовы методов их статическими вариантами вы отказываетесь от мощи ООП, возвращаясь к функциональному подходу. То есть все зависит какой концепции вы собираетесь следовать, функциональной или объектно-ориентированной.

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

Это сообщение отредактировал(а) krundetz - 18.8.2011, 15:12


--------------------
!цензоры - Хранитель стратегической жидкости
Группа ТГВ
Группа Нижний Новгород
user posted image
PM MAIL   Вверх
Shogun
Дата 18.8.2011, 21:23 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


сёгун-сан
**


Профиль
Группа: Участник
Сообщений: 290
Регистрация: 8.6.2006
Где: Кишинёв

Репутация: 9
Всего: 11



Цитата(krundetz @  18.8.2011,  15:08 Найти цитируемый пост)
1. В этом статическом методе должна быть вся реализация конкретного функционала, так как из статического метода мы не можем сделать так:

Код

class CatalogController {
    public function tralivali() {
        $this->tralivali1();
        $this->tralivali2();
    }
    public function tralivali1() {
        /*некое действие 1*/
    }
    public function tralivali2() {
        /*некое действие 2*/
    }
}



Код

class CatalogController {
    public static function tralivali() {
        self::tralivali1();
        self::tralivali2();
    }
    public static function tralivali1() {
        /*некое действие 1*/
    }
    public static function tralivali2() {
        /*некое действие 2*/
    }
}


По 2 и 3 почитайте про основы ООП внимательнее.

В общем можно обойтись и статическими классами, но некоторый функционал все-таки теряется.
Так как статический класс не инициализируется то нет возможности использовать конструкторы и деструкторы, также нет и магических методов __set или __get.
Во многих фреймворках к обьекту динамически присваиваются обьекты других загружаемых классов чтобы можно к ним обратится через $this->user например, ну и много чего еще...




--------------------
2b || !2b
PM MAIL ICQ Skype   Вверх
krundetz
Дата 19.8.2011, 11:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вечный странник
***


Профиль
Группа: Завсегдатай
Сообщений: 1400
Регистрация: 14.6.2007
Где: НН(Сормово)

Репутация: 20
Всего: 69



Shogun, вы видимо меня совсем не поняли. Фразой:
Цитата(krundetz @  18.8.2011,  15:08 Найти цитируемый пост)
Если метод tralivali, будет статическим так сделать не получиться, если только в статическом методе не создавать экземпляр класса.

Я имел в виду что нельзя сделать вот так:
Код

class CatalogController {
    public static function tralivali() {
        $this->tralivali1();
        $this->tralivali2();
    }
    public function tralivali1() {
        /*некое действие 1*/
    }
    public function tralivali2() {
        /*некое действие 2*/
    }
}


Ваш пример конечно обходит, это ограничение, но сразу возникает вопрос. А зачем в вашем примере класс вообще нужен? Делайте тогда так:
Код

function tralivali() {
    tralivali1();
    tralivali2();
    }
function tralivali1() {
    /*некое действие 1*/
}
function tralivali2() {
    /*некое действие 2*/
}

В посте выше я это отметил:
Цитата(krundetz @  18.8.2011,  15:08 Найти цитируемый пост)
То есть, заменяя таким образом вызовы методов их статическими вариантами вы отказываетесь от мощи ООП, возвращаясь к функциональному подходу.

Заметьте я не говорю что так делать нельзя, я говорю что вы просто отказываетесь от ООП.

По 2 пункту, посмотрите вот на этот код:
Код

abstract class MyClass1 {
    protected static $myStatic = 'Значение1';
    public static function getMethod () {
        return self::$myStatic;
    }
    abstract public static function setMethod ();
    
}
class MyClass2 extends MyClass1 {
    public static function setMethod () {
        self::$myStatic = 'Значение2';
    }
}

class MyClass3 extends MyClass1 {
    public static function setMethod () {
        self::$myStatic = 'Значение3';
    }
}

MyClass2::setMethod();
echo MyClass3::getMethod() . '<br/>';
MyClass3::setMethod();
echo MyClass2::getMethod() . '<br/>';


По 3 пункту, я опят же не говорю что оно невозможно,  я говорю что мы его теряем.



--------------------
!цензоры - Хранитель стратегической жидкости
Группа ТГВ
Группа Нижний Новгород
user posted image
PM MAIL   Вверх
krundetz
Дата 22.8.2011, 22:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вечный странник
***


Профиль
Группа: Завсегдатай
Сообщений: 1400
Регистрация: 14.6.2007
Где: НН(Сормово)

Репутация: 20
Всего: 69



Shogun, мне было бы интересно продолжить с вами дискусию, если вам тоже, то жду ваших комментариев к вышеописанному.

Это сообщение отредактировал(а) krundetz - 22.8.2011, 22:30


--------------------
!цензоры - Хранитель стратегической жидкости
Группа ТГВ
Группа Нижний Новгород
user posted image
PM MAIL   Вверх
Muerto
Дата 23.8.2011, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1207
Регистрация: 23.9.2006

Репутация: 3
Всего: 4



А можно и со статическими контроллерами работать...

Мне кажется главная причина именно потому что так принято...

Идет раутинг, создается instance контроллера, вызывается действие, далее вызываются модели и тп...

---

Единственное что приходит в ум:

проблем с инкапсуляцией нету
Код

class Test{
    public static function bar(){
        self::foo();
    }
    private static function foo(){
        echo 'z';
    }
}
Test::bar();//z


Но вот какбыть с магическими методами?


--------------------
user posted image
PM MAIL   Вверх
krundetz
Дата 25.8.2011, 08:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вечный странник
***


Профиль
Группа: Завсегдатай
Сообщений: 1400
Регистрация: 14.6.2007
Где: НН(Сормово)

Репутация: 20
Всего: 69



Цитата(Muerto @  23.8.2011,  16:08 Найти цитируемый пост)
проблем с инкапсуляцией нету

вы правы, да и Shogun уже показал способ инкапсулировать вызов статических методов. Мне интересно другое, насколько оправдано использование классов у которых есть только статические методы? Какова их область применения? Возможно проще и разумнее заменить такие классы набором обычных функций?

Цитата(Muerto @  23.8.2011,  16:08 Найти цитируемый пост)
Но вот какбыть с магическими методами? 

Я так понимаю что, никак. Такие магические методы как, __get() и __set() работают со свойствами. А соответственно нам нужно инстанцирование класса.

Добавлено через 3 минуты и 10 секунд
Цитата(MCMXC @  17.8.2011,  11:38 Найти цитируемый пост)
Ведь по идее, всё равно ж нам не понадобится использовать две копии контроллера в приложении с разными данными...

а если понадобиться?


--------------------
!цензоры - Хранитель стратегической жидкости
Группа ТГВ
Группа Нижний Новгород
user posted image
PM MAIL   Вверх
502
Дата 25.8.2011, 10:01 (ссылка)    | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Я всегда прав
*


Профиль
Группа: Участник
Сообщений: 134
Регистрация: 16.7.2011

Репутация: 3
Всего: 4



а что Singleton уже не в моде?

Добавлено через 1 минуту и 42 секунды
Цитата(krundetz @  25.8.2011,  08:53 Найти цитируемый пост)
а если понадобиться? 

нет

контроллер не должен хранить данные, а значит и не надо создавать 2 экземпляра  smile 
PM MAIL   Вверх
krundetz
Дата 26.8.2011, 11:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вечный странник
***


Профиль
Группа: Завсегдатай
Сообщений: 1400
Регистрация: 14.6.2007
Где: НН(Сормово)

Репутация: 20
Всего: 69



Цитата(502 @  25.8.2011,  10:01 Найти цитируемый пост)
а что Singleton уже не в моде?

А у Singliton только статические методы? По моему, в классическом Singleton есть один статический метод, который используется для получения экземпляра класса, либо создания экземпляра если он ещё не создан.
Цитата(502 @  25.8.2011,  10:01 Найти цитируемый пост)
нет

почему?
Цитата(502 @  25.8.2011,  10:01 Найти цитируемый пост)
контроллер не должен хранить данные, а значит и не надо создавать 2 экземпляра

а где я говорил о данных? Я говорил о состояние? Или вы считаете что данные и состояние это одно и тоже?


--------------------
!цензоры - Хранитель стратегической жидкости
Группа ТГВ
Группа Нижний Новгород
user posted image
PM MAIL   Вверх
Absinthe
Дата 26.8.2011, 12:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 526
Регистрация: 4.5.2011

Репутация: 5
Всего: 11



Цитата

У меня возник такой вопрос: почему все создают экземпляр определенного класса контроллера, а не изначально объявляют класс контроллер как статический?
 Начнем с того, что теоретически статические контроллеры стали доступны только в PHP 5.3, т.к. только в нем появилось позднее связывание.
Но смысл изображать объект классом когда можно воспользоваться обычным объектом?

Тема напоминает "Но ведь можно ложки держать попами и друг друга кормить". Можно, но руками то удобнее держать?
PM MAIL   Вверх
Sentox
Дата 27.8.2011, 20:56 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


как то так
**


Профиль
Группа: Участник
Сообщений: 392
Регистрация: 27.1.2009
Где: Зимбабве

Репутация: 7
Всего: 7



Эта проблема не семантического порядка, а проектного.
Статический метод инкапсулирует в себе знания  и алгоритм работы на уровне класса! а не экземпляра. То есть дочерние классы так же, если вызывается статический метод, работают на уровне родительского класса (не важно что он был унаследован),  в противовес своим внутренним методам - интерфейсам, которые являются частью дочернего класса и работают на уровне не класса а экземпляра. Отсюда и строятся две диаграммы в UML  диаграмма объектов и диаграмма классов. Если смотреть со стороны "клиентов", используемых эту архитектуру: это позволяет обеспечить выполнение статического интерфейса исключительно Определённого класса, что в принципе создаст большую связность, но если это укрепит архитектуру то только обеспечит уменьшение архитектурных ошибок, сори за тавтологию.  
PM MAIL   Вверх
502
Дата 27.8.2011, 22:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Я всегда прав
*


Профиль
Группа: Участник
Сообщений: 134
Регистрация: 16.7.2011

Репутация: 3
Всего: 4



Цитата(krundetz @  26.8.2011,  11:57 Найти цитируемый пост)
А у Singliton только статические методы?

нет
Цитата(krundetz @  26.8.2011,  11:57 Найти цитируемый пост)
По моему, в классическом Singleton есть один статический метод, который используется для получения экземпляра класса, либо создания экземпляра если он ещё не создан.

 smile 
Цитата(krundetz @  26.8.2011,  11:57 Найти цитируемый пост)
а где я говорил о данных? Я говорил о состояние?

а что раз вы не говорили то и я не должен?

если у класса есть только методы, то почему его методы не сделать статическими или Singleton?

Цитата(krundetz @  26.8.2011,  11:57 Найти цитируемый пост)
Или вы считаете что данные и состояние это одно и тоже? 

а что, нет?
PM MAIL   Вверх
Sentox
Дата 27.8.2011, 22:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


как то так
**


Профиль
Группа: Участник
Сообщений: 392
Регистрация: 27.1.2009
Где: Зимбабве

Репутация: 7
Всего: 7



502
Цитата(krundetz @  26.8.2011,  11:57 Найти цитируемый пост)
Или вы считаете что данные и состояние это одно и тоже? 
а что, нет?

Глубокое заблуждение.

>если у класса есть только методы, то почему его методы не сделать статическими или Singleton?

Странное понимание, после таких "а почему бы не сделать" архитектура трещит по швам. Выбор должен быть обоснован и аргументирован, и требуется несколько проектных решений. Кстати интересное сравнение сделать методы статическими или Singlton (два совершенно разных аспекта, один решение по конкретному методы, второе решение создание целой абстракции)

Это сообщение отредактировал(а) Sentox - 27.8.2011, 22:28
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1391 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.