@suhuxa1

Какая разница между public function и public static function?

Гору литературы прочитал по ООП, я вроде работаю не первый год, но никак до меня не доходит static. Вот все остальное доходит, а статик нет. Зачем его используют?) Я вроде уже и забыл про это, обычно пишу в ларавеле всегда:
public function xxx()
А тут смотрю код в курсе, и вижу среди точно таких же функций, одну такую:
public static function add()

Его функция в коде используется для добавления комментария на сайте. А почему бы ее не сделать просто:
public function add()

Что в этом случае пойдет не так? Спасибо!
  • Вопрос задан
  • 5327 просмотров
Пригласить эксперта
Ответы на вопрос 3
@alexalexes
Если делать статику:
class any_class
{
  public static function add()
  {
  }
}

... то, чтобы воспользоваться методом, не надо создавать объект, классу которого принадлежит этот метод, он доступен, если есть описание класса.
any_class::add()
А так лишний раз создавать объект по любому поводу, чтобы воспользоваться методом add().
class any_class
{
  public function add()
  {
  }
}

$any_class_object = new any_class;
$any_class_object->add();

Если методы общеупотребительные, и используются на каждый чих, конечно, их выгодно делать статичными.
Ответ написан
Комментировать
sevirinov
@sevirinov
Web Developer
Объявление свойств и методов класса статическими позволяет обращаться к ним без создания экземпляра класса. Свойство класса, объявленное как статическое, не может быть доступно посредством экземпляра класса (но статический метод может быть вызван).
Так как статические методы вызываются без создания экземпляра класса, то псевдопеременная $this недоступна внутри метода, объявленного как статический.
Ответ написан
Комментировать
By_Engine
@By_Engine
Статические методы и свойства прмнадлежат классу, а не объекту проще всего будет объяснить на примере свойств

class Foo {
static public $a = 0;
public $b = 0;

public function getA(){
return self::$a;
}
}

$Foo1 = new Foo;
$Foo2 = new Foo;

Значение свойства "b" принадлежит объекту
$Foo1 -> b = 1;
echo $Foo2 -> b; // Выведет 0

Статическое свойство "а" принадлежит классу и доступно любому объекту класса
Foo::$a = 15;

echo $Foo1 -> getA(); // 15
echo $Foo2 -> getA(); // 15
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы