Константы класса. Статические свойства и методы. Static и self, оператор ::

Константы класса
Статические свойства и методы
Ключевые слова static и self



Статические методы и свойства: php.net

Константы классов: php.net


Создание статического свойства

Обращение к статическому свойству внутри класса

Ключевое слово self

Оператор ::

Обращение к статическому свойству вне класса

Создание статического метода

Обращение к статическому методу вне класса

Константы класса

Обращение к константе вне класса

Отличие статических свойств и методов от обычных



Мы можем оперировать свойствами и методами не только в контексте объекта, но и в контексте класса. Это специальные свойства и методы и называются они - статическими . Объявляются они с помощью ключевого слова "static", которое добавляется перед модификатором:
- public static $countCar - статическое свойство,
- public static function getCount() - статический метод.
Тем самым мы указываем, что данное свойство или метод являются статическим и использовать их теперь можно не в контексте объекта, а в контексте класса.

Они могут быть нам полезны если по каким-то причинам нам не нужно создавать объект, но нужно работать с методами, свойствами класса.

Классический пример - создание калькулятора. Для того, чтобы производить математические операции, методы которых будут описанны в классе, нерационально создавать объект, проще для выполнения какой-нибудь операции обратиться к методу класса (как в процедурном программировании - вызывая функцию). В это случае, как раз и создают класс полностью статический - все методы и свойства в нем - статические (классо - ориентированное программирование).



Создание статического свойства


Обращение к статическому свойству внутри класса




Создадим счетчик автомобилей (файл Car.php из урока "Конструктор и деструктор").

Для этого создадим статическое свойство public static $countCar=0 и присвоим начальное значение равное нулю.

Объявим статический метод public static function getCount() - данный метод будет получать значение счетчика.

Операция увеличения счетчика будет происходить в конструкторе.

Так как свойство $countCar - статическое оно принадлежит классу и обращаться к нему надо из контекста класса, а не объекта.


Ключевое слово self




Чтобы обратиться к свойству из класса используетя специальное ключевое свойство - self.

Ключевое слово self- указывает на текущий класс.


Оператор ::




Далее идет оператор двойное двоеточие "::"

- это оператор разрешения области видимости , он служит для обращению к статическому свойству или статическому методу класса.


Далее: ++ - операция инкрементации.


В конструкторе обратимся к статическому свойству $countCar: self :: $countCar ++


Файл Car.php


-- файл Car.php --

<?php
class Car
{
public $color;
public $wheels ;
public $speed ;
public $brand;

// статическое свойство $countCar (счетчик автомобилей) с начальным значением 0
public static $countCar = 0;

public function __construct($color, $wheels = 4, $speed, $brand)
{
// обращения из контекста объекта:
$this -> color = $color ;
$this -> wheels = $wheels ;
$this -> speed = $speed ;
$this -> brand = $brand ;

// статическое свойство $countCar -
// - счетчик объектов - это свойство принадлежит классу, а не объекту
// обращаться к нему надо из контекста класса, а не объекта
// ключевое слово self - указывает на текущий класс
// :: - оператор разрешения области видимости
self::$countCar ++ ;
}

public function getCarInfo()
{
return "<h3>О моем авто:</h3>
Марка: {$this->brand}<br>
Цвет: {$this->color}<br>
Кол-во колес: {$this->wheels}<br>
Скорость: {$this->speed}<br> ";
}
}
?>





Обращение к статическому свойству вне класса




Чтобы обратиться к статическому свойству из вне класса необходимо:
- обратиться к классу: Car,
- далее поставить оператор двойное двоеточие: "::",
- далее идет само статическое свойство: $countCar.


Выведем его три раза - до создания первого объекта, после создания первого объекта, после создания второго объекта. (файл index.php из урока "Конструктор и деструктор").


Файл index.php


-- файл index.php --

<?php
error_reporting(-1);
require_once 'classes/Car.php';
function debug($data)
{
echo '<pre>' . print_r($data, 1 ) . '</pre>';
}

// первый вывод статического свойства $countCar (до создания первого объекта)
// обращение к свойству или методу через имя класса и оператора ::
echo Car::$countCar;
echo '<br>';
$car1 = new Car('черный', 4, 180, 'volvo');

// второй вывод статического свойства $countCar (после создания первого объекта)
echo Car::$countCar;
echo '<br>';
$car2 = new Car('белый', 4, 220, 'bmv');

// третий вывод статического свойства $countCar (после создания второго объекта)
echo Car::$countCar;
echo '<br>';

// обращение к методу getCarInfo()(вывод информации о созданном объекте (автомобиле))
echo $car1->getCarInfo();
echo $car2->getCarInfo();
?>
После обновления страницы получим:
0 - значение счетчика до создания первого объекта (значение, которое установили по умолчанию)
1 - значение счетчика после создания первого объекта
2 - значение счетчика после создания второго объекта
О моем авто:
Марка: volvo
Цвет: черный
Кол-во колес: 4
Скорость: 180
О моем авто:
Марка: bmv
Цвет: белый
Кол-во колес: 4
Скорость: 220





Создание статического метода




Объявим статический метод public static function getCount() - данный метод будет получать значение счетчика.

Он должен обратиться к статическому свойству $countCar: self::$countCar.


Файл Car.php


-- файл Car.php --

<?php
class Car
{
public $color;
public $wheels ;
public $speed ;
public $brand;

// статическое свойство $countCar (счетчик автомобилей) с начальным значением 0
public static $countCar = 0;

public function __construct($color, $wheels = 4, $speed, $brand)
{
// обращения из контекста объекта:
$this -> color = $color ;
$this -> wheels = $wheels ;
$this -> speed = $speed ;
$this -> brand = $brand ;

// статическое свойство $countCar -
self::$countCar ++ ;
// Car::$countCar++; - так тоже можно записать
}

// объявляем статический метод getCount(), данный метод будет получать значение счетчика
public static function getCount()
{
// возвращает количество автомобилей
return self::$countCar;
// return Car::$countCar; - так тоже можно записать
}

public function getCarInfo()
{
return "<h3>О моем авто:</h3>
Марка: {$this->brand}<br>
Цвет: {$this->color}<br>
Кол-во колес: {$this->wheels}<br>
Скорость: {$this->speed}<br> ";
}
}
?>





Обращение к статическому методу вне класса




В индексном файле обратимся к методу getCount():


Файл index.php


-- файл index.php --

<?php
error_reporting(-1);
require_once 'classes/Car.php';
function debug($data)
{
echo '<pre>' . print_r($data, 1 ) . '</pre>';
}

echo Car::$countCar;
echo '<br>';
$car1 = new Car('черный', 4, 180, 'volvo');

echo Car::$countCar;
echo '<br>';
$car2 = new Car('белый', 4, 220, 'bmv');

echo Car::$countCar;
echo '<br>';

// обращение к статическому методу getCount()
/* ------- */
// выводим результат работы статического метода getCount()
// обращение к свойству или методу через имя класса и оператора ::
echo Car :: getCount();
echo '<br>';
echo 'Количество созданных автомобилей:' . Car :: getCount();
echo '<br>';
/* ------- */

echo $car1->getCarInfo();
echo $car2->getCarInfo();
?>
После обновления страницы получим:
0 - значение счетчика до создания первого объекта (значение, которое установили по умолчанию)
1 - значение счетчика после создания первого объекта
2 - значение счетчика после создания второго объекта
О моем авто:
Марка: volvo
Цвет: черный
Кол-во колес: 4
Скорость: 180
О моем авто:
Марка: bmv
Цвет: белый
Кол-во колес: 4
Скорость: 220

2 - результат обращение к методу getCount()
Количество созданных автомобилей: 2 - результат обращение к методу getCount()





Константы класса




Константы - постоянные свойства.
- Константы нужны для того, чтобы хранить неизменную, постоянную информацию, например, настройки соединения с базой данных (имя пользователя, пароль, хост и т. д.).
- Определяются они с помощью ключевого слова - const.
- По умолчанию константы являются публичными.

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


Для неизменяемого прототипа автомобиля в классе Car создадим две константы:
- const TEST_CAR = 'Прототип'; - создание константы TEST_CAR (ключевое слово - const),
- const TEST_CAR_SPEED = 300 ; - скорость прототипа TEST_CAR_SPEED.
Определим метод getPrototypeInfo(), который будет выводить данные прототипа:


Файл Car.php


-- файл Car.php --

<?php
class Car
{
public $color;
public $wheels ;
public $speed ;
public $brand;

public static $countCar = 0;

// создание константы - прототип (ключевое слово - const)
const TEST_CAR = 'Прототип';
// создание константы - скорость прототипа
const TEST_CAR_SPEED = 300 ;

public function __construct($color, $wheels = 4, $speed, $brand)
{
$this -> color = $color ;
$this -> wheels = $wheels ;
$this -> speed = $speed ;
$this -> brand = $brand ;

self :: $countCar ++ ;
}

public static function getCount()
{
return self::$countCar;
}

public function getCarInfo()
{
return "<h3>О моем авто:</h3>
Марка: {$this->brand}<br>
Цвет: {$this->color}<br>
Кол-во колес: {$this->wheels}<br>
Скорость: {$this->speed}<br> ";
}

// определяем метод (getPrototypeInfo), который будет выводить данные прототипа
// (работаем с константами в контексте класса - обращение с помощью - self::)
public function getPrototypeInfo()
{
return "<h3>Данные тестового авто:</h3>
Наименование: " . self::TEST_CAR . "<br>
Скорость: " . self::TEST_CAR_SPEED . "<br>" ;
}
}
?>





Обращение к константе вне класса




Вызовем в индексном файле метод getPrototypeInfo() и обратимся к константе через имя класса:


Файл index.php


-- файл index.php --

<?php
error_reporting(-1);
require_once 'classes/Car.php';
function debug($data)
{
echo '<pre>' . print_r($data, 1 ) . '</pre>';
}

echo Car::$countCar;
echo '<br>';
$car1 = new Car('черный', 4, 180, 'volvo');

echo Car::$countCar;
echo '<br>';
$car2 = new Car('белый', 4, 220, 'bmv');

echo Car::$countCar;
echo '<br>';

echo Car :: getCount();
echo '<br>';
echo 'Количество созданных автомобилей:' . Car :: getCount();
echo '<br>';

echo $car1->getCarInfo();
echo $car2->getCarInfo();

// вызываем метод getPrototypeInfo() для первого автомобиля
echo $car1 -> getPrototypeInfo();
echo '<br>';
// обращение к константе вне класса через имя класса
echo Car::TEST_CAR_SPEED;
?>
После обновления страницы получим:
0
1
2
О моем авто:
Марка: volvo
Цвет: черный
Кол-во колес: 4
Скорость: 180
О моем авто:
Марка: bmv
Цвет: белый
Кол-во колес: 4
Скорость: 220
2
Количество созданных автомобилей: 2

- результат работы метода getPrototypeInfo()
Данные тестового авто:
Наименование: Прототип
Скорость: 300
300 - результат обращение к константе вне класса через имя класса





Отличие статических свойств и методов от обычных




Обычные свойства и методы описаны в классе и принадлежат они объекту.
Вызывать их можно в контексте объекта:
- если мы работаем в классе, то - this
- если мы работаем вне класса, то через созданный экземпляр класса, то есть объект.


Статические свойства и методы и константы также описаны в классе, но принадлежат они
не объекту, а классу
.
Обращатся к ним нужно в контексте класса:
- внутри класса - через ключевое слово self и двойное двоеточие "::" ,
- вне класса - через наименование класса и двойное двоеточие "::" .


Содержание папки 6 ("Константы класса. Статические свойства и методы"):


06-1






Наверх Наверх