ООП PHP
Константы класса
Статические свойства и методы
Ключевые слова static и self
Статические методы и свойства: php.net
Константы классов: php.net
Создание статического свойства
Обращение к статическому свойству внутри класса
Обращение к статическому свойству вне класса
Обращение к статическому методу вне класса
Обращение к константе вне класса
Отличие статических свойств и методов от обычных
Мы можем оперировать свойствами и методами не только в контексте объекта, но и в контексте
класса. Это специальные свойства и методы и называются они - статическими . Объявляются они
с помощью ключевого слова "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
{
public $color;
public $wheels ;
public $speed ;
public $brand;
// статическое свойство $countCar (счетчик автомобилей) с начальным значением 0
public static $countCar = 0;
public function ($color, $wheels = 4, $speed, $brand)
{
// обращения из контекста объекта:
$this -> color = $color ;
$this -> wheels = $wheels ;
$this -> speed = $speed ;
$this -> brand = $brand ;
// статическое свойство $countCar -
// - счетчик объектов - это свойство принадлежит классу, а не объекту
// обращаться к нему надо из контекста класса, а не объекта
// ключевое слово self - указывает на текущий класс
// :: - оператор разрешения области видимости
self::$countCar ++ ;
}
public function ()
{
return "<h3>О моем авто:</h3>
Марка: {$this->brand}<br>
Цвет: {$this->color}<br>
Кол-во колес: {$this->wheels}<br>
Скорость: {$this->speed}<br> ";
}
}
?>
Обращение к статическому свойству вне класса
Чтобы обратиться к статическому свойству из вне класса необходимо:
- обратиться к классу: Car,
- далее поставить оператор двойное двоеточие: "::",
- далее идет само статическое свойство: $countCar.
Выведем его три раза - до создания первого объекта, после создания первого объекта, после создания второго объекта. (файл index.php из урока "Конструктор и деструктор").
Файл index.php
-- файл index.php --
<?php
(-1);
require_once 'classes/Car.php';
function ($data)
{
echo '<pre>' . ($data, 1 ) . '</pre>';
}
// первый вывод статического свойства $countCar (до создания первого объекта)
// обращение к свойству или методу через имя класса и оператора ::
echo ::$countCar;
echo '<br>';
$car1 = new ('черный', 4, 180, 'volvo');
// второй вывод статического свойства $countCar (после создания первого объекта)
echo ::$countCar;
echo '<br>';
$car2 = new ('белый', 4, 220, 'bmv');
// третий вывод статического свойства $countCar (после создания второго объекта)
echo ::$countCar;
echo '<br>';
// обращение к методу getCarInfo()(вывод информации о созданном объекте (автомобиле))
echo $car1-> ();
echo $car2-> ();
?>
После обновления страницы получим:
0 - значение счетчика до создания первого объекта (значение, которое установили по умолчанию)
1 - значение счетчика после создания первого объекта
2 - значение счетчика после создания второго объекта
О моем авто:
Марка: volvo
Цвет: черный
Кол-во колес: 4
Скорость: 180
О моем авто:
Марка: bmv
Цвет: белый
Кол-во колес: 4
Скорость: 220
Создание статического метода
Объявим статический метод public static function getCount() - данный метод будет получать значение счетчика.
Он должен обратиться к статическому свойству $countCar: self::$countCar.
Файл Car.php
-- файл Car.php --
<?php
class
{
public $color;
public $wheels ;
public $speed ;
public $brand;
// статическое свойство $countCar (счетчик автомобилей) с начальным значением 0
public static $countCar = 0;
public function ($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 ()
{
// возвращает количество автомобилей
return self::$countCar;
// return Car::$countCar; - так тоже можно записать
}
public function ()
{
return "<h3>О моем авто:</h3>
Марка: {$this->brand}<br>
Цвет: {$this->color}<br>
Кол-во колес: {$this->wheels}<br>
Скорость: {$this->speed}<br> ";
}
}
?>
Обращение к статическому методу вне класса
В индексном файле обратимся к методу getCount():
Файл index.php
-- файл index.php --
<?php
(-1);
require_once 'classes/Car.php';
function ($data)
{
echo '<pre>' . ($data, 1 ) . '</pre>';
}
echo ::$countCar;
echo '<br>';
$car1 = new ('черный', 4, 180, 'volvo');
echo ::$countCar;
echo '<br>';
$car2 = new ('белый', 4, 220, 'bmv');
echo ::$countCar;
echo '<br>';
// обращение к статическому методу getCount()
/* ------- */
// выводим результат работы статического метода getCount()
// обращение к свойству или методу через имя класса и оператора ::
echo :: ();
echo '<br>';
echo 'Количество созданных автомобилей:' . :: ();
echo '<br>';
/* ------- */
echo $car1-> ();
echo $car2-> ();
?>
После обновления страницы получим:
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
{
public $color;
public $wheels ;
public $speed ;
public $brand;
public static $countCar = 0;
// создание константы - прототип (ключевое слово - const)
const TEST_CAR = 'Прототип';
// создание константы - скорость прототипа
const TEST_CAR_SPEED = 300 ;
public function ($color, $wheels = 4, $speed, $brand)
{
$this -> color = $color ;
$this -> wheels = $wheels ;
$this -> speed = $speed ;
$this -> brand = $brand ;
self :: $countCar ++ ;
}
public static function ()
{
return self::$countCar;
}
public function ()
{
return "<h3>О моем авто:</h3>
Марка: {$this->brand}<br>
Цвет: {$this->color}<br>
Кол-во колес: {$this->wheels}<br>
Скорость: {$this->speed}<br> ";
}
// определяем метод (getPrototypeInfo), который будет выводить данные прототипа
// (работаем с константами в контексте класса - обращение с помощью - self::)
public function ()
{
return "<h3>Данные тестового авто:</h3>
Наименование: " . self::TEST_CAR . "<br>
Скорость: " . self::TEST_CAR_SPEED . "<br>" ;
}
}
?>
Обращение к константе вне класса
Вызовем в индексном файле метод getPrototypeInfo() и обратимся к константе через имя класса:
Файл index.php
-- файл index.php --
<?php
(-1);
require_once 'classes/Car.php';
function ($data)
{
echo '<pre>' . ($data, 1 ) . '</pre>';
}
echo ::$countCar;
echo '<br>';
$car1 = new ('черный', 4, 180, 'volvo');
echo ::$countCar;
echo '<br>';
$car2 = new ('белый', 4, 220, 'bmv');
echo ::$countCar;
echo '<br>';
echo :: ();
echo '<br>';
echo 'Количество созданных автомобилей:' . :: ();
echo '<br>';
echo $car1-> ();
echo $car2-> ();
// вызываем метод getPrototypeInfo() для первого автомобиля
echo $car1 -> ();
echo '<br>';
// обращение к константе вне класса через имя класса
echo ::TEST_CAR_SPEED;
?>
После обновления страницы получим:
0
1
2
О моем авто:
Марка: volvo
Цвет: черный
Кол-во колес: 4
Скорость: 180
О моем авто:
Марка: bmv
Цвет: белый
Кол-во колес: 4
Скорость: 220
2
Количество созданных автомобилей: 2
- результат работы метода getPrototypeInfo()
Данные тестового авто:
Наименование: Прототип
Скорость: 300
300 - результат обращение к константе вне класса через имя класса
Отличие статических свойств и методов от обычных
Обычные свойства и методы описаны в классе и принадлежат они объекту.
Вызывать их можно в контексте объекта:
- если мы работаем в классе, то - this
- если мы работаем вне класса, то через созданный экземпляр класса, то есть объект.
Статические свойства и методы и константы также описаны в классе, но принадлежат они
не объекту, а классу.
Обращатся к ним нужно в контексте класса:
- внутри класса - через ключевое слово self и двойное двоеточие "::" ,
- вне класса - через наименование класса и двойное двоеточие "::" .
Содержание папки 6 ("Константы класса. Статические свойства и методы"):
Наверх Наверх