# Статические методы в ООП на PHP

При работе с классами можно делать методы, которые для своего вызова не требуют создания объекта. Такие методы называются статическими. Чтобы объявить метод статическим, нужно после модификатора доступа написать ключевое слово `static`:

`<?php class Test { // Статический метод: public static function method() { return '!!!'; } } ?>`

Чтобы обратиться к статическому методу, нужно написать имя класса, потом два двоеточия и имя метода, объект класса при этом создавать не надо, вот так:

`<?php echo Test::method(); // выведет '!!!' ?>`

## Пример

Давайте рассмотрим статические методы на более практическом примере. Пусть у нас дан вот такой математический класс `Math` (пока без статических методов):

`<?php class Math { // Находит сумму: public function getSum($a, $b) { return $a + $b; } // Находит произведение: public function getProduct($a, $b) { return $a * $b; } } ?>`

Давайте воспользуемся нашим классом:

`<?php $math = new Math; // создаем объект класса echo $math->getSum(1, 2) + $math->getProduct(3, 4); // используем методы ?>`

Наш класс `Math` представляет собой просто набор методов и, фактически, нам нужен только один объект этого класса. В таком случае удобно объявить методы класса статическими и вообще не создавать объект этого класса, а сразу использовать его методы. Сделаем это:

`<?php class Math { public static function getSum($a, $b) { return $a + $b; } public static function getProduct($a, $b) { return $a * $b; } } ?>`

Воспользуемся методами нашего класса без создания объекта класса:

`<?php echo Math::getSum(1, 2) + Math::getProduct(3, 4); ?>`

## Статические методы внутри класса

Если вы хотите использовать статические методы внутри класса, то к ним следует обращаться не через `$this->`, а с помощью `self::`.

Для примера добавим в наш класс `Math` метод `getDoubleSum`, который будет находить удвоенную сумму чисел. Используем внутри нового метода уже существующий метод `getSum`:

`<?php class Math { // Найдем удвоенную сумму: public static function getDoubleSum($a, $b) { return 2 * self::getSum($a, $b); // используем другой метод } public static function getSum($a, $b) { return $a + $b; } public static function getProduct($a, $b) { return $a * $b; } } ?>`

Воспользуемся новым методом:

`<?php echo Math::getDoubleSum(1, 2); ?>`

## Практика

Пусть у нас дан вот такой класс `ArraySumHelper`, который мы рассматривали в одном из предыдущих уроков:

`<?php class ArraySumHelper { public function getSum1($arr) { return $this->getSum($arr, 1); } public function getSum2($arr) { return $this->getSum($arr, 2); } public function getSum3($arr) { return $this->getSum($arr, 3); } public function getSum4($arr) { return $this->getSum($arr, 4); } private function getSum($arr, $power) { $sum = 0; foreach ($arr as $elem) { $sum += pow($elem, $power); } return $sum; } } ?>`

Переделайте методы класса `ArraySumHelper` на статические.

Пусть дан массив с числами. Найдите с помощью класса `ArraySumHelper` сумму квадратов элементов этого массива.

←→
↑