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
Отправлено: 03 Апреля, 2012 - 22:20:57
Post Id


Новичок


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


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




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

Недавно наткнулся на то, что вызов статического метода из класса при помощи "::" работает намного медленнее "объект->".

Вопрос? Есть ли у кого-нибудь данные по этому поводу? Нужно ли использовать статические методы вообще? Или они правда работают медленнее? А что насчет конструкции "self::" в сравнении с "$this->"?

Красота красотой, но быстродействие мне кажется важнее.
 
 Top
Bio man
Отправлено: 03 Апреля, 2012 - 22:39:03
Post Id


Постоянный участник


Покинул форум
Сообщений всего: 2751
Дата рег-ции: Июль 2010  
Откуда: Даугавпилс, Латвия


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




Не с правильной стороны подходишь к вопросу. Объекты в РНР как правило медленнее процедур и памяти жрут больше. Но это не значит, что стоит от них отказываться. ОО подход делает систему более гибкой и расширяемой, и разрабатываються такие системы гораздо быстрее чем в процедурном стиле.
По теме
ole-martyno пишет:
если метод можно сделать статическим, то рекомендуется так делать.
Точно скажу, что речь шла не о быстродействии а о памяти. Если создавать объект, для того что бы обратиться к методу который может быть статическим, то при каждом создании объекта будет выделяться память.
ole-martyno пишет:
Нужно ли использовать статические методы вообще?
Нужно, но с умом, то есть не лепить их где попало. Когда подайдете к более серьезным вещам, тогда поймете прелесть статических методов и свойств.
ole-martyno пишет:
А что насчет конструкции "self::" в сравнении с "$this->"?
self конструкция для обращения к методам, свойствам и константам, не важно к статическим или нет, в контексте класса. $this это грубо говоря указатель на самого себя, для доступа к динамичным методам и свойствам.
 
 Top
ole-martyno
Отправлено: 03 Апреля, 2012 - 23:07:23
Post Id


Новичок


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


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




Не очень понятно, то есть и self и $this-> можно использовать в контексте класса применимо к динамическим методам? В чем разница?
 
 Top
caballero
Отправлено: 03 Апреля, 2012 - 23:31:02
Post Id


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


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


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




Цитата:
Красота красотой, но быстродействие мне кажется важнее.


там где важно вычислительное быстродействие PHP не используют
Цитата:
Не очень понятно, то есть и self и $this-> можно использовать в контексте класса применимо к динамическим методам? В чем разница?

первый к статичкеским методам второй к любым


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
DlTA
Отправлено: 03 Апреля, 2012 - 23:49:53
Post Id



Постоянный участник


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


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




caballero пишет:
первый к статичкеским методам второй к любым

работает
PHP:
скопировать код в буфер обмена
  1. class test{
  2.         public function a(){ return 1;}
  3.         public function main(){ return self::a();}
  4. }
  5.  
  6. echo test::main();


ошибка "Fatal error: Using $this when not in object context "
PHP:
скопировать код в буфер обмена
  1. class test{
  2.         public function a(){ return 1; }
  3.         public function main(){ return $this->a(); }
  4. }
  5. echo test::main();


работает:
PHP:
скопировать код в буфер обмена
  1. class test{
  2.         static function a(){ return 1; }
  3.         public function main(){ return $this->a(); }
  4. }
  5. $cTest = new test();
  6. echo $cTest->main();


работает:
PHP:
скопировать код в буфер обмена
  1. class test{
  2.         public function a(){ return 1; }
  3.         public function main(){ return self::a(); }
  4. }
  5. $cTest = new test();
  6. echo $cTest->main();

как то сложно выводы строить
но получается что $this-> можно применять только к динамическим методам
а self:: к любым методам
 
 Top
DelphinPRO
Отправлено: 04 Апреля, 2012 - 00:24:27
Post Id



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


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


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




DlTA пишет:
а self:: к любым методам

в php5.2 да, но лучше к этому не привыкать - в 5.3 подобные финты уже выдают ошибки StrictStandards

CODE (text):
скопировать код в буфер обмена
  1. Strict Standards: Non-static method JLoader::import() should not be called statically in W:\html\resort.local\www\libraries\joomla\import.php on line 29


-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
caballero
Отправлено: 04 Апреля, 2012 - 01:28:33
Post Id


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


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


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




Цитата:
но получается что $this-> можно применять только к динамическим методам
а self:: к любым методам


шо сие такое "динамический метод"? Динамическими могут быть свойста но не методы. Не надо употреблять терминологию как попало. изза этого и возникают вопросы где self а где $this. Хотя если почитать документацию по синтаксису языка - никакого вопроса тут нет.
self к статическим методам (без создания екземпляра класса) $this к любым ( с созданием оного)

(Отредактировано автором: 04 Апреля, 2012 - 01:30:35)



-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 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