This article has been localized into Russian by the community.
Статические классы
Поскольку для одного класса можно создать несколько экземпляров, это означает, что содержащиеся в нем значения уникальны для каждого экземпляра/объекта, а не для класса в целом. Кроме того, вы не можете использовать методы или переменные класса без создания объекта, но есть одно исключение из этого правила. Как переменные, так и методы класса могут быть объявлены статическими (static, в некоторых языках программирования их называют "shared" - "общими"), что означает, что их можно использовать без создания экземпляра. Так как это означает, что переменная класса становится доступной без конкретного объекта, будет создана единственная версия этой переменной. Еще одно следствие - статические методы не имеют доступа к нестатическим переменным и методам, которые привязаны к экземплярам.
В предыдущем параграфе мы написали класс User. Давайте расширим его с помощью статического функционала, чтобы понять, о чем речь:
<?php
class User
{
public $name;
public $age;
public static $minimumPasswordLength = 6;
public function Describe()
{
return $this->name . " is " . $this->age . " years old";
}
public static function ValidatePassword($password)
{
if(strlen($password) >= self::$minimumPasswordLength)
return true;
else
return false;
}
}
$password = "test";
if(User::ValidatePassword($password))
echo "Password is valid!";
else
echo "Password is NOT valid!";
?>
Мы добавили одну статическую переменную $minimumPasswordLength, заданную равной 6, а также статическую функцию, которая проверяет валидность переданного в нее пароля. Я признаю, что валидация здесь крайне ограничена, и очевидно, ее можно расширить. Так, а можно ли использовать обычную переменную и функцию класса? Конечно да, но сделать их статическими логичнее, ведь проверка не привязана к одному конкретному пользователю - это общая функциональность, нам не нужен экземпляр класса, чтобы ее использовать.
Как вы можете видеть, чтобы получить доступ к нашей статической переменной из статического метода, мы используем перед ней ключевое слово self (сам) - аналог this для статических членов и констант. Очевидно, self доступен только внутри класса. Вы также заметите, что для доступа к статическим членам используется двойное двоеточие, а не оператор ->, но в остальном они почти не отличаются.