ООП PHP
Конструктор и деструктор
Конструкторы и деструкторы: php.net
Конструктор ( __construct )
- этот метод (экземпляр класса) вызывается всегда при создании объектов, если он был объявлен в классе.
В конструкторе мы инициализируем какие-то либо свойства.
Содержание папки 4 ("Конструктор и деструктор"):
В классе Car объявим конструктор и что-нибудь запишем в нем, например, выведем константу "__METHOD__", которая выводит информацию о методе класса.
Файл Car.php
-- файл Car.php --
<?php
class
{
public $color;
public $wheels = 4;
public $speed = 180;
public $brand;
// объявляем конструктор
public function ()
{
// проверка, что данный метод вызывается автоматически
// __METHOD__ - выводит информацию о методе класса
echo . '<br>';
}
public function
{
return "<h3>О моем авто:</h3>
Марка: {$this->brand}<br>
Цвет: {$this->color}<br>
Кол-во колес: {$this->wheels}<br>
Скорость: {$this->speed}<br> ";
}
}
?>
Файл index.php:
-- файл index.php --
<?php
// включаем показ ошибок
(-1);
// подключение файла Car.php
require_once 'classes/Car.php';
// функция для удобной распечатки
function ($data)
{
echo '<pre>' . ($data, 1 ) . '</pre>';
}
// создаем объект (экземпляр класса) - (1-й автомобиль)
$car1 = new ();
// обращение к свойству объекта вне класса (определяем цвет)
// оператор "->" позволяет получить доступ к свойству или методу класса
$car1 -> color = 'черный';
$car1 -> brand = 'volvo';
// создаем объект (2-й автомобиль)
$car2 = new ();
$car2 -> color = 'белый';
$car2 -> brand = 'bmv';
// обращение к методу getCarInfo()(вывод информации о созданном объекте (автомобиле))
echo $car1-> ();
echo $car2-> ();
?>
выведет:
Car::__construct
Car::__construct
О моем авто:
Марка: volvo
Цвет: черный
Кол-во колес: 4
Скорость: 180
О моем авто:
Марка: bmv
Цвет: белый
Кол-во колес: 4
Скорость: 220
- строка Car::__construct - вывелась дважды, так как у нас создано два объекта: $car1 и $car2 и каждый раз при создании объекта вызывается метод __construct.
(Car - это класс, в котором описан метод, а __construct - наименование метода).
Этот метод удобен тем, что в конструкторе мы можем заполнить недостающие свойства или что-то с ними проделать. Для этого в конструктор нужно передать аргументы (в круглых скобках).
$color, $wheels, $speed, $brand - это не свойства, а аргументы, которые передаются при создании объекта.
То есть, нам передаются некие параметры и мы хотим эти параметры записать в свойства объекта. Получаем доступ к свойству объекта через псевдопеременную $this, которая указывает на текущий объект, и далее мы берем нужное нам свойство color и заполняем его значением, которое мы получили в качестве аргумента $color. (В конструкторе мы инициализируем какие-то свойства)
Файл Car.php
-- файл Car.php --
<?php
class
{
public $color;
public $wheels ;
public $speed = 180;
public $brand;
// объявляем конструктор
// передаём аргументы в конструктор
public function ($color, $wheels = 4, $speed, $brand)
{
// Записываем параметры в свойства объекта:
// получаем досту к свойству объекта с помощью $this
// которая указывает (->) на текущий объект,
// берем нужное нам свойство color и заполняем его
// значением $color, которые мы получили
// в качестве аргумента
$this -> color = $color ;
$this -> wheels = $wheels ;
$this -> speed = $speed ;
$this -> brand = $brand ;
echo . '<br>'; // для проверки вызова конструктора вручную
}
// вывод информации о созданом объекте (автомобиле)
public function
{
return "<h3>О моем авто:</h3>
Марка: {$this->brand}<br>
Цвет: {$this->color}<br>
Кол-во колес: {$this->wheels}<br>
Скорость: {$this->speed}<br> ";
}
}
?>
В индексном файле переносим значения свойств (цвет, количество колес, скорость , марка) в скобки (передаем аргументы):
$car1 = new Car('черный', 4, 180, 'volvo').
Файл index.php:
-- файл index.php --
<?php
(-1);
require_once 'classes/Car.php';
function ($data)
{
echo '<pre>' . ($data, 1 ) . '</pre>';
}
// создаем объект (экземпляр класса) и передаем какие либо аргументы (1-й автомобиль)
// переносим значения свойств в скобки (передаем аргументы)
$car1 = new ('черный', 4, 180, 'volvo');
// $car1 -> color = 'черный';
// $car1 -> brand = 'volvo';
// создаем объект (2-й автомобиль)
$car2 = new ('белый', 4, 220, 'bmv');
// $car2 -> color = 'белый';
// $car2 -> brand = 'bmv';
// вызов метода __construct вручную (применим теоретически)
$car1 -> ('черный', 4, 180, 'volvo');
// - выведет Car::__construct в третий раз
// обращение к методу getCarInfo()(вывод информации о созданном объекте (автомобиле))
echo $car1-> ();
echo $car2-> ();
?>
выведет:
Car::__construct
Car::__construct
Car::__construct
О моем авто:
Марка: volvo
Цвет: черный
Кол-во колес: 4
Скорость: 180
О моем авто:
Марка: bmv
Цвет: белый
Кол-во колес: 4
Скорость: 220
После обновления страницы, мы видим , что ничего не поменялось, все по прежнему работает, но кода стало меньше.
Теперь мы просто создаем экземпляр класса, передаем какие-то аргументы и все по прежнему работает.
При неоходимости можно вызвать конструктор вручную (так как конструктор - это обычный метод, просто он срабатывает автоматически): $car1 -> __construct('черный', 4, 180, 'volvo').
Разрываем тело класса
В классе Car создадим (для примера) метод getLorem(), в котором будет html-код, который будет выводить "Hello, world!":
Файл Car.php
-- файл Car.php --
<?php
class
{
public $color;
public $wheels ;
public $speed = 180;
public $brand;
// объявляем конструктор
// передаём аргументы в конструктор
public function ($color, $wheels = 4, $speed, $brand)
{
// Записываем параметры в свойства объекта:
// получаем досту к свойству объекта с помощью $this
// которая указывает (->) на текущий объект,
// берем нужное нам свойство color и заполняем его
// значением $color, которые мы получили
// в качестве аргумента
$this -> color = $color ;
$this -> wheels = $wheels ;
$this -> speed = $speed ;
$this -> brand = $brand ;
echo . '<br>'; // для проверки вызова конструктора вручную
}
// Разрываем тело класса
public function (){
?>
<!-- здесь мы можем писать любой html-код -->
<div>Hello, world!</div>
<?php
}
// вывод информации о созданом объекте (автомобиле)
public function
{
return "<h3>О моем авто:</h3>
Марка: {$this->brand}<br>
Цвет: {$this->color}<br>
Кол-во колес: {$this->wheels}<br>
Скорость: {$this->speed}<br> ";
}
}
?>
В индексном файле вызовем метод getLorem():
Файл index.php:
-- файл index.php --
<?php
(-1);
require_once 'classes/Car.php';
function ($data)
{
echo '<pre>' . ($data, 1 ) . '</pre>';
}
// создаем объект (экземпляр класса) и передаем какие либо аргументы (1-й автомобиль)
// переносим значения свойств в скобки (передаем аргументы)
$car1 = new ('черный', 4, 180, 'volvo');
// создаем объект (2-й автомобиль)
$car2 = new ('белый', 4, 220, 'bmv');
// вызов метода __construct вручную (применим теоретически)
$car1 -> ('черный', 4, 180, 'volvo'); // выведет Car::__construct в третий раз
// вызываем метод getLorem (Разрываем тело класса)
echo '<br>';
$car1 -> ;
// обращение к методу getCarInfo()(вывод информации о созданном объекте (автомобиле))
echo $car1-> ();
echo $car2-> ();
?>
- "Hello, world!" - выводится, никаких ошибок нет - так тоже можно делать.
Деструктор ( __destruct )
Метод __destruct срабатывает перед удалением объекта из памяти. Порядок удаления объектов не определен.
На практике метод __destruct используется редко. Может использоваться если в конструкторе открыто соединение с базой данных.
Файл Car.php
-- файл Car.php --
<?php
class
{
public $color;
public $wheels ;
public $speed ;
public $brand;
// объявляем конструктор
// передаём аргументы в конструктор
public function ($color, $wheels = 4, $speed, $brand)
{
// Записываем параметры в свойства объекта:
// получаем досту к свойству объекта с помощью $this
// которая указывает (->) на текущий объект,
// берем нужное нам свойство color и заполняем его
// значением $color, которые мы получили
// в качестве аргумента
$this -> color = $color ;
$this -> wheels = $wheels ;
$this -> speed = $speed ;
$this -> brand = $brand ;
echo . '<br>'; // для проверки вызова конструктора вручную
}
// Разрываем тело класса
public function (){
?>
<!-- здесь мы можем писать любой html-код -->
<div>Hello, world!</div>
<?php
}
// вывод информации о созданом объекте (автомобиле)
public function
{
return "<h3>О моем авто:</h3>
Марка: {$this->brand}<br>
Цвет: {$this->color}<br>
Кол-во колес: {$this->wheels}<br>
Скорость: {$this->speed}<br> ";
}
// Метод __destruct (используется редко)
public function ()
{
// распечатываем псевдопеременную $this
($this);
}
}
?>
После обновления страницы выведет:
...
...
...
object(Car)[2]
public 'color' => string 'белый' (length=10)
public 'wheels' => int 4
public 'speed' => int 220
public 'brand' => string 'bmv' (length=3)
object(Car)[1]
public 'color' => string 'черный' (length=12)
public 'wheels' => int 4
public 'speed' => int 180
public 'brand' => string 'volvo' (length=5)
Наверх Наверх