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()?

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (2): [1] 2 »   

> Без описания
AlexLF
Отправлено: 12 Июня, 2012 - 13:45:45
Post Id


Новичок


Покинул форум
Сообщений всего: 14
Дата рег-ции: Янв. 2012  


Помог: 0 раз(а)




Читаю книгу Мэтта Зандрастры про шаблоны и объекты. Не получается понять, зачем нужна функция __construct().

В Интернете говорится - для инициализации. То есть для задания начальных значений.

Например:

class ShopProduct {
public $title = "Стандартный товар";
public $producerMainName = "Фамилия автора";
public $producerFirstName = "Имя автора";
public Sprice = 0;

function __construct( $title, $firstName, $mainName, $price ) {
$this->title = $title;
$this->producerFirstName = $firstName;
$this->producerMainName = $mainName;
$this->price = $price;
}

function getProducer() {
return "{$this->producerFirstName} "."{$this->producerMainName}";
}
}

Но зачем вообще нужна такая уродливая конструкция? - с тавтологиями типа $this->title = $title;

Если надо задать начальные значения, то пишем просто:

$product1 = new ShopProduct();
$product1->title = "Собачье сердце";
$product1->producerMainName = "Булгаков";
$product1->producerFirstName = "Михаил";
Sproduct1->price = 5.99;

print «Автор: {$product1->getProducer()}\п»;

Переменные же здесь - public. А если переменные не задали, то есть же значения по умолчанию, которые задавались при задании переменных.

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

$product1 = new ShopProduct( «Собачье сердце», «Михаил», «Булгаков», 5.99 )’;
print «Автор: {$product1->getProducer()}\п»;

В чем разница?

(Отредактировано автором: 12 Июня, 2012 - 13:51:14)

 
 Top
Viper
Отправлено: 12 Июня, 2012 - 16:28:06
Post Id



Активный участник


Покинул форум
Сообщений всего: 4555
Дата рег-ции: Февр. 2007  
Откуда: Симферополь


Помог: 98 раз(а)




AlexLF а если у вас внутри класса методы используют глобальные переменные самого класса вы тоже будете писать за классом присвоение?

PHP:
скопировать код в буфер обмена
  1. class Foo {
  2.         protected $a = 'bar';
  3.  
  4.         public function __construct(){
  5.                 $this->a = 'baz';
  6.         }
  7.  
  8.         public function someActions() {
  9.                 if ($this->a == 'baz') {
  10.                         return true;
  11.                 }
  12.         }
  13. }


теперь на приведенном примере попробуйте провернуть ваш код с минимальными "потерями".
К тому же если множество методов используют одни и те же переменные то логичней их 1 раз объявить в классе.

PS! Это вы еще не столкнулись видимо с ситуацией когда в конструкторе класса нужно получать какие-то данные и выполнять методы для возвращения результата.

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


PS1! Поправьте если где-то ошибся.


-----
Список фильмов с описанием, блекджеком и... для Joomla? -> https://киноархив[dot]com
Демо нового движка для сайта php.su -> php[dot]su, проект на гитхабе
 
 Top
caballero
Отправлено: 12 Июня, 2012 - 16:58:19
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




Цитата:
Читаю книгу Мэтта Зандрастры про шаблоны и объекты. Не получается понять, зачем нужна функция __construct().

Может тебе начать с чего попроще - основ синтаксиса или основ ООП?

Цитата:
Если надо задать начальные значения, то пишем просто:

ага, и на создание нескольких объектов повторяем сию конструкцию каждый раз копипастом.


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
AlexLF
Отправлено: 12 Июня, 2012 - 17:45:42
Post Id


Новичок


Покинул форум
Сообщений всего: 14
Дата рег-ции: Янв. 2012  


Помог: 0 раз(а)




Viper пишет:
AlexLF а если у вас внутри класса методы используют глобальные переменные самого класса вы тоже будете писать за классом присвоение?

теперь на приведенном примере попробуйте провернуть ваш код с минимальными "потерями".
К тому же если множество методов используют одни и те же переменные то логичней их 1 раз объявить в классе.

PS! Это вы еще не столкнулись видимо с ситуацией когда в конструкторе класса нужно получать какие-то данные и выполнять методы для возвращения результата.

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


PS1! Поправьте если где-то ошибся.


Viper спасибо, но пока не догоняю. Попробую у себя попрограммировать более объемные примеры - с отдельными методами для вывода переменных. Потом вернусь к этой теме.

caballero пишет:

ага, и на создание нескольких объектов повторяем сию конструкцию каждый раз копипастом.

caballero, в случае, если начальные переменные разные, почему бы и нет?

По всей видимости, есть ситуации, когда объекты с помощью класса создаются массово - но пока с таким с сталкивался.
 
 Top
caballero
Отправлено: 12 Июня, 2012 - 19:15:07
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




Цитата:
aballero, в случае, если начальные переменные разные, почему бы и нет?


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

Цитата:
По всей видимости, есть ситуации, когда объекты с помощью класса создаются массово - но пока с таким с сталкивался.


это и есть нормальное использование классов. Если создается один объект класс тут и нафиг не нужен.
А вообще переменных передаваемых из вне может и не быть - конструктор прежде всего предназначен для инициализации внутренноего состояния объекта.

(Отредактировано автором: 12 Июня, 2012 - 19:43:08)



-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
ferz
Отправлено: 12 Июня, 2012 - 19:53:22
Post Id


Гость


Покинул форум
Сообщений всего: 77
Дата рег-ции: Март 2012  


Помог: 0 раз(а)




Есле хочишь понять. Напиши класс человек, создание класса будет его рождение. В конструкторе будет инициализироваться базовые свойства рост, вес, дата рождения. Понял?


-----
рожден стоячим
 
 Top
DelphinPRO
Отправлено: 12 Июня, 2012 - 19:56:36
Post Id



Активный участник


Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012  


Помог: 353 раз(а)




AlexLF пишет:
Если надо задать начальные значения, то пишем просто:

$product1 = new ShopProduct();
$product1->title = "Собачье сердце";
$product1->producerMainName = "Булгаков";
$product1->producerFirstName = "Михаил";
Sproduct1->price = 5.99;


а теперь сравните
нам нужно создать несколько объектов, пусть три.

PHP:
скопировать код в буфер обмена
  1.  $product1 = new ShopProduct();
  2.  $product1->title = "Собачье сердце";
  3.  $product1->producerMainName = "Булгаков";
  4.  $product1->producerFirstName = "Михаил";
  5.  Sproduct1->price = 5.99;[/quote]
  6.  
  7.  $product2 = new ShopProduct();
  8.  $product2->title = "Собачье сердце 2";
  9.  $product2->producerMainName = "Булгаков";
  10.  $product2->producerFirstName = "Михаил";
  11.  Sproduct2->price = 5.99;[/quote]
  12.  
  13.  $product3 = new ShopProduct();
  14.  $product3->title = "Собачье сердце 3";
  15.  $product3->producerMainName = "Булгаков";
  16.  $product3->producerFirstName = "Михаил";
  17.  Sproduct3->price = 5.99;[/quote]


или

PHP:
скопировать код в буфер обмена
  1. $product1 = new ShopProduct( «Собачье сердце», «Михаил», «Булгаков», 5.99 );
  2. $product2 = new ShopProduct( «Собачье сердце 2», «Михаил», «Булгаков», 5.99 );
  3. $product3 = new ShopProduct( «Собачье сердце 3», «Михаил», «Булгаков», 5.99 );

(Добавление)
я понимаю, что пример не практичный, и не в этом прелесть __construct
но пусть будет

(Отредактировано автором: 12 Июня, 2012 - 19:57:16)



-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
AlexLF
Отправлено: 12 Июня, 2012 - 20:05:27
Post Id


Новичок


Покинул форум
Сообщений всего: 14
Дата рег-ции: Янв. 2012  


Помог: 0 раз(а)




ferz пишет:
Если хочешь понять. Напиши класс человек, создание класса будет его рождение. В конструкторе будет инициализироваться базовые свойства рост, вес, дата рождения. Понял?


Эт-то я понял. Чтобы создать объект конкретного человека, мне все равно же нужно задавать рост, вес, дату рождения.

Непонятно, почему это надо делать с помощью __construct () и конструкций типа имя_класса (194, 95, 1967). А не "извне" класса.

Либо я неправильно понимаю значение "инициализация".

Хотя конечно, поскольку __construct () вызывается при создании класса, я допускаю, что его можно как-то полезно использовать. Но пока только могу представить - с целью создания сообщения "создан объект такой-то". И пока все...
(Добавление)
DelphinPRO пишет:

а теперь сравните
нам нужно создать несколько объектов, пусть три.

PHP:
скопировать код в буфер обмена
  1.  $product1 = new ShopProduct();
  2.  $product1->title = "Собачье сердце";
  3.  $product1->producerMainName = "Булгаков";
  4.  $product1->producerFirstName = "Михаил";
  5.  Sproduct1->price = 5.99;[/quote]
  6.  
  7.  $product2 = new ShopProduct();
  8.  $product2->title = "Собачье сердце 2";
  9.  $product2->producerMainName = "Булгаков";
  10.  $product2->producerFirstName = "Михаил";
  11.  Sproduct2->price = 5.99;[/quote]
  12.  
  13.  $product3 = new ShopProduct();
  14.  $product3->title = "Собачье сердце 3";
  15.  $product3->producerMainName = "Булгаков";
  16.  $product3->producerFirstName = "Михаил";
  17.  Sproduct3->price = 5.99;[/quote]


или

PHP:
скопировать код в буфер обмена
  1. $product1 = new ShopProduct( «Собачье сердце», «Михаил», «Булгаков», 5.99 );
  2. $product2 = new ShopProduct( «Собачье сердце 2», «Михаил», «Булгаков», 5.99 );
  3. $product3 = new ShopProduct( «Собачье сердце 3», «Михаил», «Булгаков», 5.99 );

(Добавление)
я понимаю, что пример не практичный, и не в этом прелесть __construct
но пусть будет


В данном примере получается, что разница только в записи.

Причем я бы лично предпочел более подробную запись. Поскольку "в скобках" легче перепутать местами аргументы. А так - скопировал аргументы (свойства) и вставил новые значения.
 
 Top
DeepVarvar Супермодератор
Отправлено: 12 Июня, 2012 - 20:08:21
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




AlexLF пишет:
"создан объект такой-то". И пока все...
Во! На пока и все, хватит. Закатив глазки Остальное само придет позднее.
 
 Top
AlexLF
Отправлено: 12 Июня, 2012 - 20:11:20
Post Id


Новичок


Покинул форум
Сообщений всего: 14
Дата рег-ции: Янв. 2012  


Помог: 0 раз(а)




DeepVarvar пишет:
AlexLF пишет:
"создан объект такой-то". И пока все...
Во! На пока и все, хватит. Закатив глазки Остальное само придет позднее.


Во, буду ждать, пока прорастет. Закатив глазки
 
 Top
ferz
Отправлено: 12 Июня, 2012 - 20:14:42
Post Id


Гость


Покинул форум
Сообщений всего: 77
Дата рег-ции: Март 2012  


Помог: 0 раз(а)




AlexLF пишет:
Эт-то я понял. Чтобы создать объект конкретного человека, мне все равно же нужно задавать рост, вес, дату рождения.

Непонятно, почему это надо делать с помощью __construct () и конструкций типа имя_класса (194, 95, 1967). А не "извне" класса.

Либо я неправильно понимаю значение "инициализация".

Хотя конечно, поскольку __construct () вызывается при создании класса, я допускаю, что его можно как-то полезно использовать. Но пока только могу представить - с целью создания сообщения "создан объект такой-то". И пока все...


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

(Отредактировано автором: 12 Июня, 2012 - 20:15:21)



-----
рожден стоячим
 
 Top
AlexLF
Отправлено: 12 Июня, 2012 - 20:24:05
Post Id


Новичок


Покинул форум
Сообщений всего: 14
Дата рег-ции: Янв. 2012  


Помог: 0 раз(а)




ferz пишет:

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



Немного не понял. Можно же указать внутри класса значения по умолчанию: 2 метра, 100 кг, 2000 г. (Это кстати, по мне очень удобно оказалось для отладки содержимого класса.) А "снаружи" класса при создании объекта "Александр" задавать конкретику:

PHP:
скопировать код в буфер обмена
  1. $Александр = new Человек;
  2. $Александр->рост = 150;
  3. $Александр->вес = 50;
  4. $Александр->год_рождения = 1950;

(Отредактировано автором: 12 Июня, 2012 - 20:26:17)

 
 Top
ferz
Отправлено: 12 Июня, 2012 - 20:57:05
Post Id


Гость


Покинул форум
Сообщений всего: 77
Дата рег-ции: Март 2012  


Помог: 0 раз(а)




AlexLF пишет:
PHP:


$Александр = new Человек;

// тут человек рождаеться потом от уже живет N-времени, рождаеться он сразу
с определенными характиристиками и добавлять их потом будет идеологически ошибочно.



$Александр->рост = 150;

$Александр->вес = 50;

$Александр->год_рождения = 1950;

(Отредактировано автором: 12 Июня, 2012 - 20:58:11)



-----
рожден стоячим
 
 Top
caballero
Отправлено: 12 Июня, 2012 - 21:00:59
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




Цитата:
В данном примере получается, что разница только в записи.

разница в количестве строк. По всему проекту это будет до фига.

Цитата:
Можно же указать внутри класса значения по умолчанию: 2 метра, 100 кг, 2000 г.

для этого существует конструктор. Значения по умолчанию не всегда бывают настолько примитивные что их можно сразу присвоить при инициализации поля. Представь что значения по умолчанию у тебя берутся с какого нибудь конфига или БД.

ты бы отложил Метта Зандстру на ближайшие несколько месяцев и начал с азов програмирования вообще и ООП в частности.


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
AlexLF
Отправлено: 12 Июня, 2012 - 21:14:49
Post Id


Новичок


Покинул форум
Сообщений всего: 14
Дата рег-ции: Янв. 2012  


Помог: 0 раз(а)




ferz пишет:

$Александр = new Человек;

// тут человек рождается потом от уже живет N-времени, рождаеться он сразу
с определенными характиристиками и добавлять их потом будет идеологически ошибочно.


Ну, я бы на своем уровне понимания идеологии предположил, что эти все свойства
$Александр->рост = 150;
$Александр->вес = 50;
$Александр->год_рождения = 1950;
и от всех объектов будут болтаться в памяти и ее замусоривать. А если создавать объект "с параметрами внутри скобочек", то нет.

Но это только мое предположение о космосе - не знаю, что там болтается, у меня IDE с отладкой сейчас нет. Закатив глазки NetBeans и PHPStorm на Vista не ставится. Нахмурился
(Добавление)
caballero пишет:
Цитата:
В данном примере получается, что разница только в записи.

разница в количестве строк. По всему проекту это будет до фига.


Попробую писать с конструктором. Сейчас правда проект маленький (учебный практически).

Цитата:

Цитата:
Можно же указать внутри класса значения по умолчанию: 2 метра, 100 кг, 2000 г.

для этого существует конструктор. Значения по умолчанию не всегда бывают настолько примитивные что их можно сразу присвоить при инициализации поля. Представь что значения по умолчанию у тебя берутся с какого нибудь конфига или БД.

Так немного попонятней стало - спасибо.

А то эти тривиальные строки $this->title = $title; внутри конструктора понимания для чего это - не добавляют.


Цитата:

ты бы отложил Метта Зандстру на ближайшие несколько месяцев и начал с азов програмирования вообще и ООП в частности.

Я везде смотрю - точнее отовсюду приходится дергать. ООП в PHP последовательно не особо объясняется. Иначе бы я просто соответствующий раздел в php.net прочитал и все сразу понял. Зандрастра не такой плохой вариант.

(Отредактировано автором: 12 Июня, 2012 - 21:24:59)

 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB