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 :: Вопрос по созданию объектов

 PHP.SU

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


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

> Без описания
ole-martyno
Отправлено: 27 Февраля, 2013 - 10:28:20
Post Id


Новичок


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


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




Я использую с недавнего времени в своем проекте фреймворк Kohana, изучал его по видео и прочим материалам. Так вот, заметил такую стилистику использования метода factory, когда объект каждый раз создается заново:

PHP:
скопировать код в буфер обмена
  1.  
  2. $users = Model::factory('users')->getAll();
  3. $online = Model::factory('users')->getOnlinemap();
  4.  


вместо такого использования:

PHP:
скопировать код в буфер обмена
  1.  
  2. $model = Model::factory('users');
  3. $users = $model->getAll();
  4. $online = $model->getOnlinemap();
  5.  


Я не очень понимаю преимущества первого способа, хотя у меня есть предположения, что:
1. Красота кода
2. Экономия оперативной памяти

Но что если необходимо вызывать метод factory 10-20 раз? Стоит ли в этом случае использовать 1 метод? Или разница в скорости будет минимальна?
 
 Top
DeepVarvar Супермодератор
Отправлено: 27 Февраля, 2013 - 10:35:18
Post Id



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


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


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




ole-martyno пишет:
когда объект каждый раз создается заново
ole-martyno пишет:
Красота кода
ole-martyno пишет:
Экономия оперативной памяти
Жара. Вся фишка в return $this;
(Добавление)
И это, зря начал с фреймворков. Надо было начинать с чистого, тогда бы не было таких вопросов.
Так например все "перцы" юзают фреймворк "жуйквери" в душе не умея чистый жаваскрипт.
Беда...
 
 Top
ole-martyno
Отправлено: 27 Февраля, 2013 - 10:48:05
Post Id


Новичок


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


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




А где искать эту информацию? Я искал, но ответа толком не нашел.

Можно поподробнее ответить на сам вопрос) Я просто хочу толковый ответ получить)

(Отредактировано автором: 27 Февраля, 2013 - 10:48:28)

 
 Top
DeepVarvar Супермодератор
Отправлено: 27 Февраля, 2013 - 10:51:29
Post Id



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


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


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




PHP:
скопировать код в буфер обмена
  1. class test {
  2.   public function aaa() {
  3.     echo "aaa";
  4.     return $this;
  5.   }
  6.   public function bbb() {
  7.     echo "bbb";
  8.     return $this;
  9.   }
  10.   public function ccc() {
  11.     echo "ccc";
  12.     return $this;
  13.   }
  14. }
  15. $obj = new test;
  16. $obj->aaa()->bbb()->ccc();

Толково?
 
 Top
DelphinPRO
Отправлено: 27 Февраля, 2013 - 10:54:21
Post Id



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


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


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




ole-martyno пишет:
когда объект каждый раз создается заново:

объект не создается много раз. он создается один раз, при первом обращении (в пределах всего приложения), а потом только возвращается фабричным методом.

ps это вы еще какой нибудь орм не видели Улыбка типа
PHP:
скопировать код в буфер обмена
  1. $db->select('*')->from('table')->where('id=1')->join() ...
Ха-ха
(Добавление)
упс, DeepVarvar уже показал цепочки ..


-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
ole-martyno
Отправлено: 27 Февраля, 2013 - 11:03:40
Post Id


Новичок


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


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




Цитата:
объект не создается много раз. он создается один раз, при первом обращении (в пределах всего приложения), а потом только возвращается фабричным методом.


Я думал, что это только в синглтоне объект "запоминается". Непонятно...

Цитата:
ps это вы еще какой нибудь орм не видели


видел, даже использовал. Я не понимаю причем здесь цепочки. Мой вопрос про быстродействие и какой способ(в моем первом сообщении) лучше.

Для справки, вот как выглядит метод factory в кохановском классе:

PHP:
скопировать код в буфер обмена
  1.         public static function factory($name)
  2.         {
  3.                 // Add the model prefix
  4.                 $class = 'Model_'.$name;
  5.  
  6.                 return new $class;
  7.         }

(Отредактировано автором: 27 Февраля, 2013 - 11:06:06)

 
 Top
DeepVarvar Супермодератор
Отправлено: 27 Февраля, 2013 - 11:05:44
Post Id



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


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


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




ole-martyno пишет:
Мой вопрос про быстродействие и какой способ(в моем первом сообщении) лучше.
Тогда вопрос не корректен, т.к. не может рассматриваться для всех случаев и ситуаций.
 
 Top
ole-martyno
Отправлено: 27 Февраля, 2013 - 11:09:16
Post Id


Новичок


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


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




DeepVarvar пишет:
ole-martyno пишет:
Мой вопрос про быстродействие и какой способ(в моем первом сообщении) лучше.
Тогда вопрос не корректен, т.к. не может рассматриваться для всех случаев и ситуаций.


Вот как выглядит factory в кохановском Model:
PHP:
скопировать код в буфер обмена
  1.         public static function factory($name)
  2.         {
  3.                 // Add the model prefix
  4.                 $class = 'Model_'.$name;
  5.  
  6.                 return new $class;
  7.         }


Я спрашиваю, почему автор материалов, по которым я изучал фреймворк предпочитает
такой способ:
PHP:
скопировать код в буфер обмена
  1.         $users = Model::factory('users')->getAll();
  2. $online = Model::factory('users')->getOnlinemap();


а не такой:

PHP:
скопировать код в буфер обмена
  1. $model = Model::factory('users');
  2. $users = $model->getAll();
  3. $online = $model->getOnlinemap();
 
 Top
ams
Отправлено: 27 Февраля, 2013 - 13:34:21
Post Id



Посетитель


Покинул форум
Сообщений всего: 351
Дата рег-ции: Нояб. 2010  


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





Он гонит Улыбка


Если в методе factory лежит return new $class;, то будет каждый раз создаваться экземпляр объекта. В данном случае - это не айс. Но бываю моменты, когда нужно так сделать, это наподобие клонирования
 
 Top
DeepVarvar Супермодератор
Отправлено: 27 Февраля, 2013 - 13:38:07
Post Id



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


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


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





ams, ты тоже Радость ТС интересует чо такое текучий интерфейс
Автору материалов конечно если нечего было сказать по этому поводу, то и материалы бы не делал.
ole-martyno пишет:
Я спрашиваю, почему автор материалов, по которым я изучал фреймворк предпочитает
такой способ:
а не такой:
Я уже ответил выше.
 
 Top
DelphinPRO
Отправлено: 27 Февраля, 2013 - 15:51:10
Post Id



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


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


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




сорри
ole-martyno пишет:
Я думал, что это только в синглтоне объект "запоминается". Непонятно...

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


-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
esterio
Отправлено: 27 Февраля, 2013 - 15:58:45
Post Id



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


Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012  
Откуда: Украина, Львов


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




все верно ТС написал
Вот тут
https://github[dot]com/kohana/core/b[dot][dot][dot]Kohana/Model.php
PHP:
скопировать код в буфер обмена
  1. **
  2. * Model base class. All models should extend this class.
  3. *
  4. * @package Kohana
  5. * @category Models
  6. * @author Kohana Team
  7. * @copyright (c) 2008-2012 Kohana Team
  8. * @license http://kohanaframework.org/license
  9. */
  10. abstract class Kohana_Model {
  11.  
  12. /**
  13. * Create a new model instance.
  14. *
  15. * $model = Model::factory($name);
  16. *
  17. * @param string $name model name
  18. * @return Model
  19. */
  20. public static function factory($name)
  21. {
  22. // Add the model prefix
  23. $class = 'Model_'.$name;
  24.  
  25. return new $class;
  26. }
  27.  
  28. } // End Model

Значит вам нужно искать новые уроки, а еще лучше читать документацию
 
 Top
DeepVarvar Супермодератор
Отправлено: 27 Февраля, 2013 - 16:19:16
Post Id



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


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


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




DelphinPRO пишет:
В данном конкретном приведенном вами примере, разумнее сохранять полученный объект в переменную.
Нифига - только если она будет нужна далее. А так у объекта текучий интерфейс, и для одноразового использования того, что вернула фабрика, переменная эта не нужна:
PHP:
скопировать код в буфер обмена
  1. Model::factory('users')->aaa()->bbb()->ccc();
 
 Top
esterio
Отправлено: 27 Февраля, 2013 - 16:25:16
Post Id



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


Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012  
Откуда: Украина, Львов


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




DeepVarvar пишет:
Model::factory('users')->aaa()->bbb()->ccc();

В случае с ТС не покатит
ole-martyno пишет:
$users = Model::factory('users')->getAll();
$online = Model::factory('users')->getOnlinemap();
 
 Top
DeepVarvar Супермодератор
Отправлено: 27 Февраля, 2013 - 17:56:36
Post Id



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


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


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




Он не спрашивал прокатит или нет, он спрашивал надо или не надо.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Объектно-ориентированное программирование »


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB