Jump to content
  • 0

static function


solovin1986
 Share

Question

Не могу понять static function

class MyClass {
static function helloWorld() {
print "Hello, world";
}
}

class MyClass {
function helloWorld() {
print "Hello, world";
}
}

Эти две функции при вызове

MyClass::helloWorld();

поводят себя одинаково у меня PHP Version 5.2.12

Link to comment
Share on other sites

Recommended Posts

  • 0

по умолчанию, ф-ция public всегда, даже без явного объявления об этом, и вызывается только после объявления класса: $var = new MyClass();

а вот к статику можно без объявления класса обращаться как у вас: MyClass::helloWorld();

а у вас эти два класса в одном и том же файле записаны? и вызываются там же?

Link to comment
Share on other sites

  • 0

Это же php - язык с тяжелым наследием. Переходите на 5.3 для начала.

php -v

PHP 5.3.10 (cli) (built: Mar 12 2012 13:21:28)

php -r ' class testclass { function test() {} }; testclass::test(); '

Strict Standards: Non-static method testclass::test() should not be called statically in Command line code on line 1

Edited by MiksIr
Link to comment
Share on other sites

  • 0

На практике прихожу к такому выводу: статик методы нужны в случаях, когда надо дать некий функционал в разных местах, без создания экземпляра класса (new), без наследования. Не всегда удобно таскать по всем классам экземпляр, или плодить новые объекты одного и того же класса в разных местах.

К примеру утилиты какие-то, вспомогательные функции. Плюс в том, что вызываются так же просто как и пользовательские функции, а класс помогает организовать их.

если метод можно сделать статичным лучше его таким и делать

Обоснуйте пожалуйста.

Link to comment
Share on other sites

  • 0

быстрее работают

хм... а есть тесты пруф? вот набросал примитивный тестик:


<?php
class StaticClass{
static $var = 0;
static function method(){
return self::$var++;
}
}
class MyClass{
public $var = 0;
public function method(){
return $this->var++;
}
}

print "<pre>";
$x = 100000;

$start = microtime(1);
for($i = 0; $i++ < $x; ){
StaticClass::method();
}
print "exec static: ".(microtime(1) - $start)."\n";

$start = microtime(1);
$obj = new MyClass();
for($i = 0; $i++ < $x; ){
$obj->method();
}

print "exec object: ".(microtime(1) - $start)."\n";

итог: статик медленнее раза в два показал результат. ЧЯДНТ?

И да, как заметил Лунатик, аргумент не айс))

Link to comment
Share on other sites

  • 0

Вообще статика - зло. Ну и к ООП отношения ясно дело никакого не имеет. Статика, это так, украшательство функций, типа неймспейса для функций. Но в общем используйте, чо ;) Сами дойдете до всего, если более-менее серьезного программиста разовьетесь. А по началу все говнокодили, чо уж :yahoo:

Link to comment
Share on other sites

  • 0

Вообще статика - зло. Ну и к ООП отношения ясно дело никакого не имеет. Статика, это так, украшательство функций, типа неймспейса для функций. Но в общем используйте, чо ;) Сами дойдете до всего, если более-менее серьезного программиста разовьетесь. А по началу все говнокодили, чо уж :yahoo:

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

Link to comment
Share on other sites

  • 0

итог: статик медленнее раза в два показал результат.


<?php
class Test1{
public static function test(){
static $j = 0;
for($i=0; $i<=1000; $i++)
$j += $i;
}
}

class Test2{
private $j = 0;
public function test() {
for ($i=0; $i<=1000; $i++){
$this->j += $i;
}
}

}

print "<pre>";


$start = microtime(1);
Test1::test();

print "exec static: ".(microtime(1) - $start)."\n";

$start = microtime(1);
$obj = new Test2();
$obj->test();


print "exec object: ".(microtime(1) - $start)."\n";

Link to comment
Share on other sites

  • 0

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


class Test1{
static $j = 0;
public static function test(){
for($i=0; $i<=1000000; $i++)
self::$j += $i;
}
}

class Test2{
public $j = 0;
public function test() {
for ($i=0; $i<=1000000; $i++){
$this->j += $i;
}
}
}

print "<pre>";


$start = microtime(1);
Test1::test();

print "exec static: ".(microtime(1) - $start)."\n";

$start = microtime(1);
$obj = new Test2();
$obj->test();

print "exec object: ".(microtime(1) - $start)."\n";

И снова статик медленнее. хотя не так значительно.

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

Link to comment
Share on other sites

  • 0

Вообще статика - зло. Ну и к ООП отношения ясно дело никакого не имеет. Статика, это так, украшательство функций, типа неймспейса для функций. Но в общем используйте, чо ;) Сами дойдете до всего, если более-менее серьезного программиста разовьетесь. А по началу все говнокодили, чо уж :yahoo:

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

Я то прекрасно понимаю ;) А минусуйте, чего, других аргументов когда нет, поколение хабры :rolleyes:

Когда начнете свои "кода" тестами обкладывать, поймете - зло статика или не зло =)

Link to comment
Share on other sites

  • 0

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

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

Link to comment
Share on other sites

  • 0

Ребята, ну хватит уже может уже письками меряться?

По теме хоть один ответ будет, не?

Вопрос был почему так себя ведет статик и паблик, а не кто быстрее/нужнее/полезнее...

Link to comment
Share on other sites

  • 0

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

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

хых, а функциональный подход ещё быстрее, как уже заметили. короче нет аргументации.

Link to comment
Share on other sites

  • 0

Вообще статика - зло. Ну и к ООП отношения ясно дело никакого не имеет. Статика, это так, украшательство функций, типа неймспейса для функций. Но в общем используйте, чо ;) Сами дойдете до всего, если более-менее серьезного программиста разовьетесь. А по началу все говнокодили, чо уж :yahoo:

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

Я то прекрасно понимаю ;) А минусуйте, чего, других аргументов когда нет, поколение хабры :rolleyes:

Когда начнете свои "кода" тестами обкладывать, поймете - зло статика или не зло =)

Реализуйте хотябы, например патерн синглтон, без статика или по-вашему это тоже зло?

(Мне-то всегда есть что сказать, были бы достойные слушатели)

Link to comment
Share on other sites

  • 0

Ага, единственный случай, когда можно использовать статичский метод. Исключение, которое подтверждает правило? ;))

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

Link to comment
Share on other sites

  • 0

Ага, единственный случай, когда можно использовать статичский метод. Исключение, которое подтверждает правило? ;))

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

Воды много льёте безосновательной, очень смахивает на троллинг, где аргументы?

Link to comment
Share on other sites

  • 0

А без воды, это очень долгий разговор, выходящий за рамки моих кофебрейков ;) Давайте я от вас ссылкой отделаюсь, ладно? ;)

http://misko.hevery.com/code-reviewers-guide/ в частности - раздел 3.

Спасибо за ссылку, статья полезная, заставляет поразмышлять и призадуматься, но автор статьи как и вы слишком категоричны и делят всё на чёрное и белое. Всегда надо находить компромиссы и быть более лояльным, особенно это касается такого языка как PHP, возможно эти правила больше подходтят к Cи и JAVA. В любом случае даже там проскальзывают местами оговорки.

Я хочу чтоб не было лишней перепалки и вы понимали мою позицию в данном вопросе: Я не «против» Статическийх методов, но и я не «за» их наляпование всюду и везде, всё надо использовать к месту и в некоторых случаях их использовать можно и нужно (не смотря на высказывания нытиков что тестить неудобно) потому что это решает многие проблемы в построении архитектуры приложения (касательно web-PHP).

И ещё раз спасибо за статью, было познавательно.

Link to comment
Share on other sites

  • 0

Это же php - язык с тяжелым наследием. Переходите на 5.3 для начала.

php -v

PHP 5.3.10 (cli) (built: Mar 12 2012 13:21:28)

php -r ' class testclass { function test() {} }; testclass::test(); '

Strict Standards: Non-static method testclass::test() should not be called statically in Command line code on line 1

Короче говоря поставил PHP Version 5.3.3 и тоже все равно статик объявлен или нет.

Я так понял что и в этой версии еще интерпретатор не доделали.

Link to comment
Share on other sites

  • 0

Спасибо за ссылку, статья полезная, заставляет поразмышлять и призадуматься, но автор статьи как и вы слишком категоричны и делят всё на чёрное и белое. Всегда надо находить компромиссы и быть более лояльным, особенно это касается такого языка как PHP, возможно эти правила больше подходтят к Cи и JAVA. В любом случае даже там проскальзывают местами оговорки.

Я хочу чтоб не было лишней перепалки и вы понимали мою позицию в данном вопросе: Я не «против» Статическийх методов, но и я не «за» их наляпование всюду и везде, всё надо использовать к месту и в некоторых случаях их использовать можно и нужно (не смотря на высказывания нытиков что тестить неудобно) потому что это решает многие проблемы в построении архитектуры приложения (касательно web-PHP).

И ещё раз спасибо за статью, было познавательно.

От языка это вообще не зависит. Зависит от задач, скорее. У этого чувака четкая задача организации тестирования. Тестировать при налчии статики/синглтонов обчень сложно. С сервис-локаторами попроще, ибо можно уже подменять моками классы через локатор, но все-равно преродически возникают проблемы. Это даже по своему опыту могу сказать. А проблемы - это поненциально пробущенные баги или повышенные трудозатраты на сами тесты. DI в данном случае очень красивое решение.

От статики как бы польностью не отказываюсь, просто я так отреагировал на посты выше, типа "все в статику". Тот же Mi?ko Hevery допускает статику в определенных жеско оговоренных условиях. Да и в реальности мы имеем дело со всякими фреймворками/битриксами, где уже ничего не спасет :dash: Даже любимый мной Yii пронизан статикой.

Если же с нуля - статика не решает никаких проблем архитектуры вообще, а лишь "упрощает жизнь", типа быстрее можно что-то сварганить, да. Ну так в этом случае я в самом первом посте сказал, в качесте чего она используется. На да, за исключением Синглтон.

Это же php - язык с тяжелым наследием. Переходите на 5.3 для начала.

php -v

PHP 5.3.10 (cli) (built: Mar 12 2012 13:21:28)

php -r ' class testclass { function test() {} }; testclass::test(); '

Strict Standards: Non-static method testclass::test() should not be called statically in Command line code on line 1

Короче говоря поставил PHP Version 5.3.3 и тоже все равно статик объявлен или нет.

Я так понял что и в этой версии еще интерпретатор не доделали.

Не, просто у вас стрикт ошибки подавлены скорее всего.

php -d error_reporting='E_ALL | E_STRICT' -r 'class testclass { function test() {} }; testclass::test();'

проверил на 5.3.3 - ругается

Edited by MiksIr
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy