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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как правильнее подключать и использовать класс? 
:(
    Опции темы
Gold Dragon
Дата 28.6.2011, 17:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

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



Как правильнее подключать и использовать класс?

Так?
Код

$GDK = new GDK();

switch($task) {
    case 'page1':
        gdk_page1($GDK);
        break;
    case 'page2':
        gdk_page2($GDK);
        break;
    default:    // главная страница компонента
    gdk_page0($GDK);
}
function gdk_page0($GDK){
//.....
}
function gdk_page1($GDK){
//.....
}
function gdk_page1($GDK){
//.....
}

или так?
Код

switch($task) {
    case 'page1':
        gdk_page1();
        break;
    case 'page2':
        gdk_page2();
        break;
    default:    // главная страница компонента
    gdk_page0();
}
function gdk_page0(){
    $GDK = new GDK();
//.....
}
function gdk_page1(){
    $GDK = new GDK();
//.....
}
function gdk_page1(){
    $GDK = new GDK();
//.....
}



Это сообщение отредактировал(а) Gold Dragon - 28.6.2011, 17:51


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
Valinur
Дата 28.6.2011, 18:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Судя вашей логике, можно даже и так
Код

$GDK = new GDK();
switch($task) {
    case 'page1':
        gdk_page1();
        break;
    case 'page2':
        gdk_page2();
        break;
    default:    // главная страница компонента
    gdk_page0();
}
function gdk_page0(){
//.....
}
function gdk_page1(){
//.....
}
function gdk_page1(){
//.....



А вообще как-то неправильно выглядит эта конструкция вся. Сам подход.
--------------------
Не бойтесь совершенства, Вы все равно его не достигнете (с) ...
PM MAIL   Вверх
Gold Dragon
Дата 28.6.2011, 18:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

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



Valinur, поясни?

Добавлено через 45 секунд
Цитата(Valinur @  28.6.2011,  19:03 Найти цитируемый пост)
Судя вашей логике, можно даже и так
а как функции получат глобальную переменную?



--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
Valinur
Дата 28.6.2011, 18:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(Gold Dragon @  28.6.2011,  18:09 Найти цитируемый пост)
а как функции получат глобальную переменную?

Да, простите, как-то не подумал об этом. Но у нас ведь есть ООП.
Почему бы не завести класс, одним из членов которой был бы как раз $GDK? И тогда в каждой функции просто пришлось бы обращаться только к $this->GDK

Мне правда не известны детали вашего кода.... Но конкретно в вашем примере, я бы использовал первый вариант в силу обратной совместимости:
Код

$GDK = new GDK();
switch($task) {
    case 'page1':
        gdk_page1($GDK);
        break;
    case 'page2':
        gdk_page2($GDK);
        break;
    default:    // главная страница компонента
    gdk_page0($GDK);
}
function gdk_page0($GDK){
//.....
}
function gdk_page1($GDK){
//.....
}
function gdk_page1($GDK){
//.....



Т.е. если вдруг нам придется менять вызов конструктора, передавать ему какие-то аргументы, или например после создания объекта надо будет его настроить, то это надо будет сделать только в одном месте - в самом начале, а не бегать по каждой функции.
--------------------
Не бойтесь совершенства, Вы все равно его не достигнете (с) ...
PM MAIL   Вверх
Gold Dragon
Дата 28.6.2011, 18:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

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



Цитата(Valinur @  28.6.2011,  19:27 Найти цитируемый пост)
И тогда в каждой функции просто пришлось бы обращаться только к $this->GDK
это функции, а не методы smile Они вне класса

Я тоже склоняюсь к первому варианту, он намного проще и более понятен.. Но скажется ли это на работе? Ведь в первом случае мы создаём глобальную переменную, а она достаточно большая, и гоняем её. Во втором случае мы создаём только локальные переменные, которые умирают после завершения функции



--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
Valinur
Дата 28.6.2011, 18:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(Gold Dragon @  28.6.2011,  18:42 Найти цитируемый пост)
это функции, а не методы  Они вне класса

Да, конечно. Но никто не мешает их сделать членами класса.

Цитата(Gold Dragon @  28.6.2011,  18:42 Найти цитируемый пост)
Ведь в первом случае мы создаём глобальную переменную, а она достаточно большая, и гоняем её. Во втором случае мы создаём только локальные переменные, которые умирают после завершения функции

А unset-нуть нельзя разве ее после?
--------------------
Не бойтесь совершенства, Вы все равно его не достигнете (с) ...
PM MAIL   Вверх
Gold Dragon
Дата 28.6.2011, 18:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

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



Цитата(Valinur @  28.6.2011,  19:47 Найти цитируемый пост)
А unset-нуть нельзя разве ее после? 
а зачем лишний код smile



--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
Valinur
Дата 28.6.2011, 19:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Почему же лишний? Вполне себе уместное применение функции unset. Подчищаем мусор за собой. Ну или можно "сунуть" его в деструктор этого объекта, если не хотим "лишнего" кода.
--------------------
Не бойтесь совершенства, Вы все равно его не достигнете (с) ...
PM MAIL   Вверх
Absinthe
Дата 28.6.2011, 21:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата

Вполне себе уместное применение функции unset. 
Цитата

Но у нас ведь есть ООП.
 Противоречие.

Добавлено через 30 секунд
Топикстартер, ru.wikipedia.org/wiki/Абстрактная_фабрика
PM MAIL   Вверх
Valinur
Дата 28.6.2011, 22:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(Absinthe @  28.6.2011,  21:01 Найти цитируемый пост)
 Противоречие.

Ну или можно "сунуть" его в деструктор этого объекта, если не хотим "лишнего" кода. 
--------------------
Не бойтесь совершенства, Вы все равно его не достигнете (с) ...
PM MAIL   Вверх
Absinthe
Дата 29.6.2011, 00:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата

Ну или можно "сунуть" его в деструктор этого объекта, если не хотим "лишнего" кода. 
 Я не понял, хотел бы пример.

Это сообщение отредактировал(а) Absinthe - 29.6.2011, 00:31
PM MAIL   Вверх
Gold Dragon
Дата 29.6.2011, 05:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

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



Absinthe, поясни по абстрактной фабрике


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
Absinthe
Дата 29.6.2011, 10:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Gold Dragon, создание объектов - это типовая ситуация, поэтому для создания объектов применяются типовые решения.
Одно из таких решений - абстрактная фабрика, мне показалось, что оно подойдет тебе. Можешь посмотреть другие типовые решения.
Использование таких решений вместо корявых велосипедов делает код проще и читаемее. И не надо думать, как извратиться с велосипедом.

А unset применяется только для удаления элементов массива. Если удаляешь переменные - это костыль для устранение части последствий какой-то проблемы(но не самой проблемы).

PM MAIL   Вверх
Gold Dragon
Дата 30.6.2011, 08:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

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



Absinthe, нарыл кучу статей, прочитал. Но,к сожалению, не понял этот принцип. Я то душой понимаю что это хорошо. Даже реально видел как с ним работают разные CMS. Но что-то мне не хватает в мозгу smile прям чуть-чуть ... Все примеры какие встречал - просто перепечатка одного и того же со своими тонкостями.. Мне бы на очень простом примере с подробным пояснением ;)


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
Absinthe
Дата 30.6.2011, 13:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата

Мне бы на очень простом примере с подробным пояснением ;)
 Пока не научишься грамотно использовать ООП, паттерны трогать не стоит.
Чтобы научиться грамотно использовать ООП освой 1-2 фреймворка. Например ZF и что-то из Yii/Kohana.
PM MAIL   Вверх
Gold Dragon
Дата 30.6.2011, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

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



Absinthe, что значит освой? И что значит "пока не научишься? Я для чего тут вопросы задаю? Наверное чтобы научиться. И зачем мне подобные ответы нужны?

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


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
MoLeX
Дата 30.6.2011, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Местный пингвин
****


Профиль
Группа: Модератор
Сообщений: 4076
Регистрация: 17.5.2007

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



Gold Dragon, а какая цель всего этого?


--------------------
Amazing  smile 
PM MAIL WWW ICQ   Вверх
Gold Dragon
Дата 30.6.2011, 14:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

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



а вот хамить не стоит. Absinthe, не считай себя умнее других. На каком уровне ООП нужно знать чтобы с тобой общаться? Если тебе не хочется "сюсюкаться" со мной, так просто забей на эту тему. Просто интересно, зачем ты сам на этом форуме? Помогать или получать помощь? Я лично в данной момент хочу получить помощь, а не особое мнение по поводу моих знаний. На Винграде люди учатся, т.е. задают вопросы и получают ответы даже по самым элементарным основам. Или ты хочешь что-то изменить тут?

Цитата(MoLeX @  30.6.2011,  14:19 Найти цитируемый пост)
Gold Dragon, а какая цель всего этого? 
Научиться создавать это и использовать. Я нарисовал в самом начале как у меня это. Если что не хватает, то могу показать дальше. Главное чтоб направляли в нужное русло



--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
baldina
Дата 30.6.2011, 15:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Gold Dragon @  28.6.2011,  18:42 Найти цитируемый пост)
Ведь в первом случае мы создаём глобальную переменную, а она достаточно большая, и гоняем её.

рано думаете об оптимизации. думайте об архитектуре, если выйдет хорошая, и оптимизировать не понадобится.
как Вам такое решение:
Код

abstract class Page {
  private $gdk;

  function __construct ()  {
    $this->gdk = new GDK();
  }

  function & gdk () { return $this->gdk; }

  abstract function page ();
};

class Page0 extends Page {
  /* override */ function page ();
};
class Page1 extends Page {
  /* override */ function page ();
};
class Page2 extends Page {
  /* override */ function page ();
};

function TaskMaker ($task_name)
{
  switch($task_name) {
    case 'Page1':
        return new Page1 ();
    case 'Page2':
        return new Page2 ();
    default:    // главная страница компонента
        return new Page0 ();
  }
}

$t = TaskMaker ('Page1');
$t->page ();
$t = TaskMaker ('Page2');
$t->page ();
$t = TaskMaker ('Page3');
$t->page ();

http://codepad.org/QfR4jInv

можно даже замутить че то вроде
Код

function TaskMaker ($task_name)
{
  if (class_exists ($task_name))
    return new $task_name ();
  else
    return new Page0 ();
}


Добавлено через 11 минут и 11 секунд
http://codepad.org/dVVrEc63

Это сообщение отредактировал(а) baldina - 30.6.2011, 15:27
PM MAIL   Вверх
Gold Dragon
Дата 30.6.2011, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

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



baldina, сейчас наложу на свой проект и расскажу что и как.. Я уже малость почитал про это и примеры зажаться уже знакомыми smile Просто нужно ручками пощупать реально.. Часть уже сделал, вроде пока без ошибок.. Правда есть несколько моментов, которые не совсем понятны. Но думаю додумаю  smile 

Это сообщение отредактировал(а) Gold Dragon - 30.6.2011, 15:43


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
Gold Dragon
Дата 30.6.2011, 20:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

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



Да ты дал ссылку на Вики. Да я получил что-то похожее на общее представление. Но где пояснения, или считаешь что и так всё понятно? baldina ответил похоже, но его ответ более мне понятен.

В общем суть простая. Мы оба погорячились и вспылили. У всех свои амбиции. Предлагаю это недопонимание закончить здесь и сейчас. Если что-то осталось, то перенести в личную переписку. И всё что будет не по теме дальше тут, будет удалено. Оставим тут простой вопрос и простые ответы....

Это сообщение отредактировал(а) MoLeX - 1.7.2011, 05:24


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
Gold Dragon
Дата 6.7.2011, 07:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

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



в общем попробовал эту абстрактную фабрику... Даже малость разобрался.. Но как я понял, это хорошо на достаточно больших проектах типа CMS. Но для простых сайтов, пусть даже больше чем просто визитка, это слишком громостко, т.е. излишне. Получается механизм для управления механизмом. Хотя пока изучал наткнулся на достаточно большое количество противников данного метода smile


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
MoLeX
Дата 6.7.2011, 07:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Местный пингвин
****


Профиль
Группа: Модератор
Сообщений: 4076
Регистрация: 17.5.2007

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



Цитата(Gold Dragon @  6.7.2011,  07:09 Найти цитируемый пост)
это хорошо на достаточно больших проектах типа CMS. Но для простых сайтов, пусть даже больше чем просто визитка, это слишком громостко, т.е. излишне. 

а зачем на визитках и больше чем визитки ООП?


--------------------
Amazing  smile 
PM MAIL WWW ICQ   Вверх
Gold Dragon
Дата 6.7.2011, 07:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

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



ну я образно "визитки".. Например, та же "визитка" + управление шаблонами + новостной канал + форма обратной связи + гостевая книга + "вопрос-ответ"
Получается средненький сайт, но при этом всем этим нужно управлять. И для каждой системы свой класс..

Добавлено через 1 минуту и 13 секунд
можно конечно и процедурно всё сделать, но лучше всё таки разделить


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
baldina
Дата 6.7.2011, 09:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Gold Dragon @  6.7.2011,  07:44 Найти цитируемый пост)
можно конечно и процедурно всё сделать, но лучше всё таки разделить 

"процедурно" тоже разделить можно
PM MAIL   Вверх
Gold Dragon
Дата 6.7.2011, 09:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

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



согласен, но тут уж наверное дело вкуса.. ООП как-то более нагляднее и интуитивно понятнее


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

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

Важно:

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

Внимание:

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

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

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


 




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


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

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