Статические методы в PHP
Язык программирования PHP является объектно-ориентированным. Для всех разработок этой категории характерно использование классов и методов с приблизительно схожим синтаксисом. Классом является находится что-то, чем можно обобщить входящие в него объекты. К примеру, в классе Car могут присутствовать объекты $brand, $colour, $maxspeed, $maxcapacity и прочие. Они задают свойства для, как в этом примере, автомобиля. Кроме того, в объект может входить метод – например, open_door. Его можно вызвать извне.
То есть, посредством классов можно легко сгруппировать фрагменты кода, чтобы он не выглядел слишком «разбросанно». На этом моменте описание данной части языка PHP не заканчивается, а, наоборот, лишь начинается. Темой этой статьи стали статические методы: текст поможет понять, как использовать эту особенность «с нуля».
Описание
Не всегда обязательно помещать метод в объект – ничто не мешает разместить его сразу внутри класса, тогда первый будет именоваться статическим. По названию легко догадаться, что использовать этот вариант следует, если не предполагается изменение свойства или метода на уровне кода. Для того, чтобы объявить о статичности, достаточно использовать структурную единицу языка – слово static.
Важно учитывать момент в виде использования слова selfтам, где у нестатических методов используется this. Кроме того, перед именем свойства нужно ставить знак доллара, как у названий переменных.
<?php
classAlien {
publicstatic $name = «Инопланетянин Алёша»;
publicstaticfunctiondisplay_name() {
printself::$name;
}
}
Вызов такого метода вне класса производится следующим образом: сначала вводится название класса, следующими должны быть указаны два знака двоеточия, а потом – наименование функции, имеющей параметр static. Она должна принадлежать ранее объявленному классу. Дополнительно, можно привязать это значение к обычной переменной. Это полезно, если всё же планируется всё же изменить данные, однако возможности прямо сейчас обновить в коде тип метода нет.
Константы
В одном из абзацев выше заострялось внимание на слове «статичный». Тем не менее, ничто не мешает всё же изменить свойство, несмотря на этот фактор. Логика выполнения скрипта от этого не поменяется, однако, если требуется установить строгий запрет на редактирование, следует использовать константы внутри класса. Если попытаться управлять ими программно, скрипт не выполнится, а в логах зафиксируется ошибка. Чтобы приписать какое-либо значение к константе, используйте единицу языка const.
Значением может быть строка, число, десятичная дробь и практически что угодно. Тем не менее, нельзя считать константы незначительно отличающимися от переменных только из-за одной этой особенности. Скорее наоборот: раз уж такие данные изменять нельзя, то и слово «переменные» для них некорректно. Вывод значений проводится с помощью слова self, двух двоеточий и наименования константы.
Простыми словами
Ещё легче, чем в предыдущих подразделах статьи:
- Есть класс «Car» (машина).
- В нём присутствуют свойства $name(название автомобиля), $colour(цвет), $capacity(вместимость), $existence (существование).
- Существуют объекты $ferrariи $lamborghini.
- У $lamborghini и $ferrari – разные цвета, названия и параметры вместимости. Чтобы не создавать огромное количество переменных, лучше просто менять значения свойств для каждого автомобиля.
- Какое-то свойство не планируется менять, однако оно всё же должно задействоваться где-то в программе. Пусть таким будет $existence– оба бренда реально существуют, поэтому значение для них может являться true.
- Чтобы какое-то значение не менялось, его можно: 1)просто объявить по умолчанию, чтобы, если не указывать значение вручную, происходило автоматическое унаследование; 2) задать в качестве статического свойства; 3) указать, как константу, чтобы изменения не могли вноситься вовсе.
<?php
classCar {
public $name;
public $colour;
public $capacity;
const exsistence = true;
functionchange_name($name) {
$this->name = $name;
}
functionget_name($name) {
return $this->name;
}
}
$ferrari = newCar();
$lamborghini = newCar();
$ferrari->change_name(«SF90 Stradale»);
$lamborghini->change_name(«Gallardo»);
$ferrari_name = $ferrari->get_name();
$lamborghini_name = $lamborghini->get_name();
echo(«Ferrari «.{$ferrari_name}.»\n».»Lamborghini «.{$lamborghini_name});
Конечно, ничто не мешает создавать переменные для каждого значения, такие как $ferrari_color, $ferrari_capacity, $lamborghini_color, $lamborghini_capacity, но если таких значений станет много, код будет неудобно ни читать, ни редактировать.
Статические переменные
Удивительно, но команда staticне только используется так, как показано выше. Её можно задействовать для написания рекурсивных функций: например, требуется скрипт, который должен сосчитать до ста. Чтобы не писать код вида $value = $value + 1, $value = $value + 1 и так далее, стоит задействовать именно эту особенность программирования. Она сработает только если используется статическая переменная – при попытке задействовать обычную такой момент не сработает, как надо, и в результате будет выведено начальное значение.
При использовании рекурсивных функций важно продумать возможность их отключения. Если установить внутри функции проверку на то, является ли значение равным 100, то после этого начнёт выполняться остальная часть кода. Если же проигнорировать это, то скрипт «уйдёт» в рекурсию, и он будет «убит» веб-сервером по истечении тайм-аута, обычно составляющего от 30 до 60 секунд.
<?php
functioncounter() {
static $number = 0;
$a++;
echo $number;
if ($number < 100) {
counter();
} else {
echo»Выполнение подсчёта завершено.»;
}
$a—;
}
Значением статической переменной могут выступать как явно указанные данные по типу «Hello, World», так и результаты арифметических вычислений (123+123=246). Использовать результаты задействования функций здесь нельзя, поэтому ни прочитать файл, ни вывести подстроку определённой длины, ни сделать что-либо ещё «динамическое» не получится.
<?php
functiondemo() {
static $var = 123; # допускается
static $var = 123+999; # допускается
static $var = file_get_contents(«https://example.edu/»); # не допускается
}
Дополнительно
Обновления
Разработчики PHP,коими являются энтузиасты, вносят информацию о существенных изменениях, касающихся возможностей ООП, на отдельной странице документации. Она важна для ознакомления, если планируется работать с широким кругом спецификаций языка (не всегда заказчики услуг готовы обновить версию PHP, поэтому может понадобиться «подстраиваться» под указанные по ссылке выше особенности).
Стоит также уделить внимание следующему факту: крупные обновления ООП производятся не только вместе со сменой первой цифры в названии (например, PHP 5 и 7): изменения происходят и в менее крупных спецификациях языка программирования.
Названия констант
Интерпретатор кода не даст использовать некоторые зарезервированные наименования для ручного объявления констант. Кроме того, составители официальной документации не рекомендуют добавлять по два знака подчёркивания в начало и конец имён, поскольку такие константы могут быть «взяты» разработчиками языка в будущем. Если это произойдёт, конфликтующие наименования понадобится заменять, что увеличит время на обновление кода.
Заключение
Поскольку классы и объекты могут показаться сложной темой для новичков, примеры использования даны по ходу этой статьи – так понять назначение этих единиц языка будет проще.Не советуется использовать двойные нижние подчёркивания в начале и конце названий констант, чтобы не рисковать столкнуться с проблемами при обновлении PHP.
Итог статьи прост и понятен: рассмотренные особенности позволяют сохранить «красоту» кода, делая его изменение удобным.