Ключевое слово static
Эта страница описывает использование ключевого слова
static
для определения статических методов и свойств. static
также
может использоваться для определения
статических переменных
и
позднего статического связывания. Для получения информации о таком применении
ключевого слова static
обратитесь по вышеуказанным страницам.
Объявление свойств и методов класса статическими позволяет обращаться к ним без создания экземпляра класса. Свойство класса, объявленное как статическое, не может быть доступно посредством экземпляра класса (но статический метод может быть вызван).
В целях совместимости с PHP 4, если определение
области видимости не используется,
то свойство или метод
будут обрабатываться так, как если бы он был объявлен как public
.
Статические методы
Так как статические методы вызываются без создания экземпляра класса, то псевдопеременная $this недоступна внутри метода, объявленного как статический.
В PHP 5 вызов нестатических методов статически вызовет ошибку уровня
E_STRICT
.
В PHP 7 вызов нестатических методов статически объявлен устаревшим
и вызовет ошибку уровня E_DEPRECATED
. Поддержка вызова
нестатических методов статически может быть удалена в будущем.
Пример #1 Пример статического метода
<?php
class Foo {
public static function aStaticMethod() {
// ...
}
}
Foo::aStaticMethod();
$classname = 'Foo';
$classname::aStaticMethod(); // Начиная с PHP 5.3.0
?>
Статические свойства
Статические свойства не могут быть доступны через объект с помощью оператора "->".
Как и любая другая статическая переменная PHP, статические свойства
могут инициализироваться только используя литерал или константу до PHP 5.6;
выражения не допускается. В PHP 5.6 и более новых версиях применяются те же правила,
что и для выражений const
: возможны некоторые выражения, если они могут быть вычислены
во время компиляциии.
Начиная с PHP 5.3.0, существует возможность ссылаться на класс используя
переменную. Значение переменной в таком случае не может быть ключевым
словом (например, self
, parent
и
static
).
Пример #2 Пример статического свойства
<?php
class Foo
{
public static $my_static = 'foo';
public function staticValue() {
return self::$my_static;
}
}
class Bar extends Foo
{
public function fooStatic() {
return parent::$my_static;
}
}
print Foo::$my_static . "\n";
$foo = new Foo();
print $foo->staticValue() . "\n";
print $foo->my_static . "\n"; // Не определено свойство my_static
print $foo::$my_static . "\n"; // Начиная с PHP 5.3.0
$classname = 'Foo';
print $classname::$my_static . "\n"; // Начиная с PHP 5.3.0
print Bar::$my_static . "\n";
$bar = new Bar();
print $bar->fooStatic() . "\n";
?>