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
Форумы портала PHP.SU :: Версия для печати :: Вопрос по созданию объектов
Форумы портала PHP.SU » » Объектно-ориентированное программирование » Вопрос по созданию объектов

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

1. ole-martyno - 27 Февраля, 2013 - 10:28:20 - перейти к сообщению
Я использую с недавнего времени в своем проекте фреймворк 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 метод? Или разница в скорости будет минимальна?
2. DeepVarvar - 27 Февраля, 2013 - 10:35:18 - перейти к сообщению
ole-martyno пишет:
когда объект каждый раз создается заново
ole-martyno пишет:
Красота кода
ole-martyno пишет:
Экономия оперативной памяти
Жара. Вся фишка в return $this;
(Добавление)
И это, зря начал с фреймворков. Надо было начинать с чистого, тогда бы не было таких вопросов.
Так например все "перцы" юзают фреймворк "жуйквери" в душе не умея чистый жаваскрипт.
Беда...
3. ole-martyno - 27 Февраля, 2013 - 10:48:05 - перейти к сообщению
А где искать эту информацию? Я искал, но ответа толком не нашел.

Можно поподробнее ответить на сам вопрос) Я просто хочу толковый ответ получить)
4. DeepVarvar - 27 Февраля, 2013 - 10:51:29 - перейти к сообщению
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();

Толково?
5. DelphinPRO - 27 Февраля, 2013 - 10:54:21 - перейти к сообщению
ole-martyno пишет:
когда объект каждый раз создается заново:

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

ps это вы еще какой нибудь орм не видели Улыбка типа
PHP:
скопировать код в буфер обмена
  1. $db->select('*')->from('table')->where('id=1')->join() ...
Ха-ха
(Добавление)
упс, DeepVarvar уже показал цепочки ..
6. ole-martyno - 27 Февраля, 2013 - 11:03:40 - перейти к сообщению
Цитата:
объект не создается много раз. он создается один раз, при первом обращении (в пределах всего приложения), а потом только возвращается фабричным методом.


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

Цитата:
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.         }
7. DeepVarvar - 27 Февраля, 2013 - 11:05:44 - перейти к сообщению
ole-martyno пишет:
Мой вопрос про быстродействие и какой способ(в моем первом сообщении) лучше.
Тогда вопрос не корректен, т.к. не может рассматриваться для всех случаев и ситуаций.
8. ole-martyno - 27 Февраля, 2013 - 11:09:16 - перейти к сообщению
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();
9. ams - 27 Февраля, 2013 - 13:34:21 - перейти к сообщению

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


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

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

все верно. но синглтон это частный случай фабрики. я просто не знаю как там кохана устроена. Если каждый раз создается новый экземпляр, то соглашусь с вами в непонимании автора уроков (может он тоже не знает как устроены фабричные методы в кохане Улыбка ).
В данном конкретном приведенном вами примере, разумнее сохранять полученный объект в переменную.
12. esterio - 27 Февраля, 2013 - 15:58:45 - перейти к сообщению
все верно ТС написал
Вот тут
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

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

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

 

Powered by ExBB FM 1.0 RC1