В php есть ли причина использовать статический метод в классе вместо независимого метода? - PullRequest
2 голосов
/ 24 февраля 2010

Мы обсуждаем это здесь. Что лучше и почему?

1) PHP-файл, который просто включает в себя функцию ...

function bar(){}

называется так

bar();

2) php, содержащий класс со статическим методом.

class foo{
static function bar(){}
}

называется так Foo :: бар ();

Есть ли какие-либо соображения по поводу производительности, чтобы сделать одно или другое? Для целей организации кода статический метод выглядит лучше, но здесь есть несколько программистов, которые не видят причин для объявления классов.

Ответы [ 2 ]

6 голосов
/ 24 февраля 2010

Я бы сказал, что главное преимущество - это возможность повторного использования и модульность - что если у вас есть две разные «библиотеки» функций, которые вы создали A и B, и у них обоих, как оказалось, bar() функции? Как статические методы вы можете вызывать A::bar() и B::bar(), но как независимые функции у вас могут возникнуть конфликты имен.

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

В PHP 5.3+ вы также можете использовать пространства имен для достижения этой цели, если хотите.

2 голосов
/ 24 февраля 2010

Для организационных целей пространства имен были добавлены в php 5.3+.

Статические методы имеют доступ к защищенным / закрытым членам объекта этого класса. например,

class Foo {
  protected function xyz() {
    return 'abc';
  }

  public static function bar(Foo $f) {
    echo $f->xyz();
  }
}

$f = new Foo;
Foo::bar($f);

И вы можете использовать одни и те же параметры видимости, чтобы обмениваться статическими свойствами между различными методами одного и того же класса, но защищать их от "внешних" Э.Г.

class Foo {
  protected static $abc;

  public static function set($x) {
    self::$abc = $x*2;
  }

  public static function get() {
    return self::$abc;
  }

}
Foo::set(1);
echo Foo::get();
...