#7. 7 php ООП Статические свойства и методы. Константы класса

Статические свойства и методы

Свойства и методы называют статическими, если для обращения к ним не требуется создавать экземпляр класса (объект), т.е. не требуется вызывать конструктор через new():

<?php
class Example
{
    public static $property = 2;
}

echo Example::$property;

Статический член класса объявляется с помощью ключевого слова static после модификатора доступа. Обращение к статическому свойству $property класса Example за пределами класса осуществляется при помощи конструкции Example::$property. Внутри класса для этого используется ключевое слово self:

<?php
class Example
{
    public static $property= 2;
    public static function get_property() 
    {
        return self::$property;
    }

    public static function set_property($value) 
    {
        self::$property = $value;
    }
}

echo Example::get_property();

В отличие от обращения к обычному свойству, при обращении к статической переменной перед именем этой переменной ставится знак $.

Также о статических элементах можно сказать, что:

  • Статические свойства и методы определяются не на уровне объекта, а на уровне класса.
  • Статические свойства являются общими для всех объектов данного класса:
    <?php
    class Example
    {
        public static $property= 2;
    
        public static function get_property() 
        {
            return self::$property;
        }
    
        public static function set_property($value) 
        {
            self::$property = $value;
        } 
    }
    $obj1 = new Example;
    $obj2 = new Example;
    
    $obj1->set_property(0);
    $obj2->set_property(11);
    
    echo $obj1->get_property();
    

    В результате на экран будет выведено число 11.

  • Статический метод может работать только со статическими членами (свойствами и другими методами) этого же класса:
    <?php
    class Example
    {
        public $a;
        public static $b;
    
        public static function f() 
        {
            self::b = 0; //всё нормально
            $this->a = 2; //ошибка. Статический метод может обращаться только к статическим элементам
        }
    }
    

В примере 1 добавлен счетчик зверей в описание класса Animal — статическая переменная $count. Каджый раз при создании объекта класса Animal значение счетчика $count увеличивается на единицу в конструкторе этого объекта, а при удалении объекта и вызове деструктора — уменьшается на единицу. Текущее значение счетчика можем получить при помощи статического метода get_count.

Пример 1. Статические члены класса

<?php
class Animal
{
    private $name;
    private static $count;
 
    public function __construct($text)
    {
        $this->name = $text;
         self::$count++;
    }
 
    public function set_name($text)
    {
        $this->name = $text;
    }
 
    public function get_name()
    { 
        return $this->name;
    }
 
    public static function get_count() 
    {
        return self::$count;
    }
 
    public function __destruct()
    {
        self::$count--;
    }
}

$lion = new Animal("Бонифаций");
$elephant = new Animal("Джамбо");
echo "В нашей программе ", Animal::get_count(), " животных.<BR>";
$lion = null;
echo "Осталось ", Animal::get_count(), "животное.<BR>";

В этом примере мы создали два объекта класса Animal, а затем удалили один из объектов путем перезаписи соответствующей переменной. Результатом выполнения примера будут строки

В нашей программе 2 животных.
Осталось 1 животное.

Константы

Помимо обыкновенных и статических свойств, класс в PHP может содержать неизменяемые значения — константы, которые определяются с помощью ключевого слова const:

<?php
class Animal
{
    const NAME = "Animal";
}
echo Animal::NAME, "<BR>";

Обратиться к константе, как и к статическому элементу, можно при помощи оператора разрешения области видимости ::, который предваряется либо именем класса (вне класса), либо ключевым словом self (внутри класса).

Существование константы можно проверить с помощью функции defined, которая возвращает true, если константа существует, и false в противном случае:

if (defined("Animal::NAME")) {
    echo "Константа определена<BR>";
} else {
    echo "Константа не определена<BR>";
}
mariyas's picture

добавлено: константы