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 - 03 Апреля, 2012 - 22:20:57 - перейти к сообщению
Читал когда-то по оптимизации работы классов, что если метод можно сделать статическим, то рекомендуется так делать.

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

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

Красота красотой, но быстродействие мне кажется важнее.
2. Bio man - 03 Апреля, 2012 - 22:39:03 - перейти к сообщению
Не с правильной стороны подходишь к вопросу. Объекты в РНР как правило медленнее процедур и памяти жрут больше. Но это не значит, что стоит от них отказываться. ОО подход делает систему более гибкой и расширяемой, и разрабатываються такие системы гораздо быстрее чем в процедурном стиле.
По теме
ole-martyno пишет:
если метод можно сделать статическим, то рекомендуется так делать.
Точно скажу, что речь шла не о быстродействии а о памяти. Если создавать объект, для того что бы обратиться к методу который может быть статическим, то при каждом создании объекта будет выделяться память.
ole-martyno пишет:
Нужно ли использовать статические методы вообще?
Нужно, но с умом, то есть не лепить их где попало. Когда подайдете к более серьезным вещам, тогда поймете прелесть статических методов и свойств.
ole-martyno пишет:
А что насчет конструкции "self::" в сравнении с "$this->"?
self конструкция для обращения к методам, свойствам и константам, не важно к статическим или нет, в контексте класса. $this это грубо говоря указатель на самого себя, для доступа к динамичным методам и свойствам.
3. ole-martyno - 03 Апреля, 2012 - 23:07:23 - перейти к сообщению
Не очень понятно, то есть и self и $this-> можно использовать в контексте класса применимо к динамическим методам? В чем разница?
4. caballero - 03 Апреля, 2012 - 23:31:02 - перейти к сообщению
Цитата:
Красота красотой, но быстродействие мне кажется важнее.


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

первый к статичкеским методам второй к любым
5. DlTA - 03 Апреля, 2012 - 23:49: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:: к любым методам
6. DelphinPRO - 04 Апреля, 2012 - 00:24:27 - перейти к сообщению
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
7. caballero - 04 Апреля, 2012 - 01:28:33 - перейти к сообщению
Цитата:
но получается что $this-> можно применять только к динамическим методам
а self:: к любым методам


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

 

Powered by ExBB FM 1.0 RC1