Получение ресурса есть инициализация (англ. Resource Acquisition Is Initialization (RAII)) — программнаяидиома объектно-ориентированного программирования, смысл которой заключается в том, что получение некоторогоресурса совмещается с инициализацией, а освобождение — с уничтожением объекта.
Получение доступа к ресурсу происходит в конструкторе, а освобождение в деструкторе. Поскольку деструкторавтоматической переменной вызывается при выходе её из области видимости, то ресурс гарантированноосвобождается при уничтожении переменной. Это справедливо и в ситуациях, в которых возникают исключения. Этоделает RAII ключевой концепцией для написания безопасного при исключениях кода.
Применение
Эта концепция может использоваться для любых разделяемых объектов или ресурсов:
- для выделения памяти,
- для открытия файлов или устройств,
- для мьютексов или критических секций и т. д.
1: <?php
2:
3: class Guard
4: {
5: private $_callback;
6:
7: public function __construct(Closure $callback)
8: {
9: $this->_callback = $callback;
10: }
11:
12: public function __destruct()
13: {
14: call_user_func($this->_callback);
15: }
16: }
17:
18: $guard = newGuard(
19: function () {
20: echo 'destructor';
21: }
22: );
23: unset($guard);//destructor