Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737 Форумы портала PHP.SU :: Зачем нужен конструктор - __construct()?
Покинул форум
Сообщений всего: 14
Дата рег-ции: Янв. 2012
Помог: 0 раз(а)
Читаю книгу Мэтта Зандрастры про шаблоны и объекты. Не получается понять, зачем нужна функция __construct().
В Интернете говорится - для инициализации. То есть для задания начальных значений.
Например:
class ShopProduct {
public $title = "Стандартный товар";
public $producerMainName = "Фамилия автора";
public $producerFirstName = "Имя автора";
public Sprice = 0;
теперь на приведенном примере попробуйте провернуть ваш код с минимальными "потерями".
К тому же если множество методов используют одни и те же переменные то логичней их 1 раз объявить в классе.
PS! Это вы еще не столкнулись видимо с ситуацией когда в конструкторе класса нужно получать какие-то данные и выполнять методы для возвращения результата.
Тем более если нужно какой-то метод выполнять каждый раз при вызове класса, то без конструктора у вас одинаковый код увеличится в разы.
Покинул форум
Сообщений всего: 14
Дата рег-ции: Янв. 2012
Помог: 0 раз(а)
Viper пишет:
AlexLF а если у вас внутри класса методы используют глобальные переменные самого класса вы тоже будете писать за классом присвоение?
теперь на приведенном примере попробуйте провернуть ваш код с минимальными "потерями".
К тому же если множество методов используют одни и те же переменные то логичней их 1 раз объявить в классе.
PS! Это вы еще не столкнулись видимо с ситуацией когда в конструкторе класса нужно получать какие-то данные и выполнять методы для возвращения результата.
Тем более если нужно какой-то метод выполнять каждый раз при вызове класса, то без конструктора у вас одинаковый код увеличится в разы.
PS1! Поправьте если где-то ошибся.
Viper спасибо, но пока не догоняю. Попробую у себя попрограммировать более объемные примеры - с отдельными методами для вывода переменных. Потом вернусь к этой теме.
caballero пишет:
ага, и на создание нескольких объектов повторяем сию конструкцию каждый раз копипастом.
caballero, в случае, если начальные переменные разные, почему бы и нет?
По всей видимости, есть ситуации, когда объекты с помощью класса создаются массово - но пока с таким с сталкивался.
caballero
Отправлено: 12 Июня, 2012 - 19:15:07
Активный участник
Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011 Откуда: Харьков
Помог: 126 раз(а)
Цитата:
aballero, в случае, если начальные переменные разные, почему бы и нет?
при чем тут разные или нет? у тебя несколько строк кода будет тупо повторятся по всему проекту
Цитата:
По всей видимости, есть ситуации, когда объекты с помощью класса создаются массово - но пока с таким с сталкивался.
это и есть нормальное использование классов. Если создается один объект класс тут и нафиг не нужен.
А вообще переменных передаваемых из вне может и не быть - конструктор прежде всего предназначен для инициализации внутренноего состояния объекта.
Покинул форум
Сообщений всего: 77
Дата рег-ции: Март 2012
Помог: 0 раз(а)
Есле хочишь понять. Напиши класс человек, создание класса будет его рождение. В конструкторе будет инициализироваться базовые свойства рост, вес, дата рождения. Понял?
----- рожден стоячим
DelphinPRO
Отправлено: 12 Июня, 2012 - 19:56:36
Активный участник
Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012
Помог: 353 раз(а)
AlexLF пишет:
Если надо задать начальные значения, то пишем просто:
Покинул форум
Сообщений всего: 14
Дата рег-ции: Янв. 2012
Помог: 0 раз(а)
ferz пишет:
Если хочешь понять. Напиши класс человек, создание класса будет его рождение. В конструкторе будет инициализироваться базовые свойства рост, вес, дата рождения. Понял?
Эт-то я понял. Чтобы создать объект конкретного человека, мне все равно же нужно задавать рост, вес, дату рождения.
Непонятно, почему это надо делать с помощью __construct () и конструкций типа имя_класса (194, 95, 1967). А не "извне" класса.
Либо я неправильно понимаю значение "инициализация".
Хотя конечно, поскольку __construct () вызывается при создании класса, я допускаю, что его можно как-то полезно использовать. Но пока только могу представить - с целью создания сообщения "создан объект такой-то". И пока все... (Добавление)
DelphinPRO пишет:
а теперь сравните
нам нужно создать несколько объектов, пусть три.
(Добавление)
я понимаю, что пример не практичный, и не в этом прелесть __construct
но пусть будет
В данном примере получается, что разница только в записи.
Причем я бы лично предпочел более подробную запись. Поскольку "в скобках" легче перепутать местами аргументы. А так - скопировал аргументы (свойства) и вставил новые значения.
DeepVarvar
Отправлено: 12 Июня, 2012 - 20:08:21
Активный участник
Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008 Откуда: Альфа Центавра
Помог: 353 раз(а)
AlexLF пишет:
"создан объект такой-то". И пока все...
Во! На пока и все, хватит. Остальное само придет позднее.
Покинул форум
Сообщений всего: 14
Дата рег-ции: Янв. 2012
Помог: 0 раз(а)
DeepVarvar пишет:
AlexLF пишет:
"создан объект такой-то". И пока все...
Во! На пока и все, хватит. Остальное само придет позднее.
Во, буду ждать, пока прорастет.
ferz
Отправлено: 12 Июня, 2012 - 20:14:42
Гость
Покинул форум
Сообщений всего: 77
Дата рег-ции: Март 2012
Помог: 0 раз(а)
AlexLF пишет:
Эт-то я понял. Чтобы создать объект конкретного человека, мне все равно же нужно задавать рост, вес, дату рождения.
Непонятно, почему это надо делать с помощью __construct () и конструкций типа имя_класса (194, 95, 1967). А не "извне" класса.
Либо я неправильно понимаю значение "инициализация".
Хотя конечно, поскольку __construct () вызывается при создании класса, я допускаю, что его можно как-то полезно использовать. Но пока только могу представить - с целью создания сообщения "создан объект такой-то". И пока все...
ну ты сам логически подумай, как можно родиться без веса, роста, и заранее, а потом указать эти данные вызовом метода?
Покинул форум
Сообщений всего: 14
Дата рег-ции: Янв. 2012
Помог: 0 раз(а)
ferz пишет:
ну ты сам логически подумай, как можно родиться без веса, роста, и заранее, а потом указать эти данные вызовом метода?
Немного не понял. Можно же указать внутри класса значения по умолчанию: 2 метра, 100 кг, 2000 г. (Это кстати, по мне очень удобно оказалось для отладки содержимого класса.) А "снаружи" класса при создании объекта "Александр" задавать конкретику:
Покинул форум
Сообщений всего: 77
Дата рег-ции: Март 2012
Помог: 0 раз(а)
AlexLF пишет:
PHP:
$Александр = new Человек;
// тут человек рождаеться потом от уже живет N-времени, рождаеться он сразу
с определенными характиристиками и добавлять их потом будет идеологически ошибочно.
Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011 Откуда: Харьков
Помог: 126 раз(а)
Цитата:
В данном примере получается, что разница только в записи.
разница в количестве строк. По всему проекту это будет до фига.
Цитата:
Можно же указать внутри класса значения по умолчанию: 2 метра, 100 кг, 2000 г.
для этого существует конструктор. Значения по умолчанию не всегда бывают настолько примитивные что их можно сразу присвоить при инициализации поля. Представь что значения по умолчанию у тебя берутся с какого нибудь конфига или БД.
ты бы отложил Метта Зандстру на ближайшие несколько месяцев и начал с азов програмирования вообще и ООП в частности.
Покинул форум
Сообщений всего: 14
Дата рег-ции: Янв. 2012
Помог: 0 раз(а)
ferz пишет:
$Александр = new Человек;
// тут человек рождается потом от уже живет N-времени, рождаеться он сразу
с определенными характиристиками и добавлять их потом будет идеологически ошибочно.
Ну, я бы на своем уровне понимания идеологии предположил, что эти все свойства
$Александр->рост = 150;
$Александр->вес = 50;
$Александр->год_рождения = 1950;
и от всех объектов будут болтаться в памяти и ее замусоривать. А если создавать объект "с параметрами внутри скобочек", то нет.
Но это только мое предположение о космосе - не знаю, что там болтается, у меня IDE с отладкой сейчас нет. NetBeans и PHPStorm на Vista не ставится. (Добавление)
caballero пишет:
Цитата:
В данном примере получается, что разница только в записи.
разница в количестве строк. По всему проекту это будет до фига.
Попробую писать с конструктором. Сейчас правда проект маленький (учебный практически).
Цитата:
Цитата:
Можно же указать внутри класса значения по умолчанию: 2 метра, 100 кг, 2000 г.
для этого существует конструктор. Значения по умолчанию не всегда бывают настолько примитивные что их можно сразу присвоить при инициализации поля. Представь что значения по умолчанию у тебя берутся с какого нибудь конфига или БД.
Так немного попонятней стало - спасибо.
А то эти тривиальные строки $this->title = $title; внутри конструктора понимания для чего это - не добавляют.
Цитата:
ты бы отложил Метта Зандстру на ближайшие несколько месяцев и начал с азов програмирования вообще и ООП в частности.
Я везде смотрю - точнее отовсюду приходится дергать. ООП в PHP последовательно не особо объясняется. Иначе бы я просто соответствующий раздел в php.net прочитал и все сразу понял. Зандрастра не такой плохой вариант.
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.