Ресурс (resource) - это переменная, которая хранит ссылку на внешний ресурс. Многие модули содержат некоторые функций для взаимодействия с внешним миром. Например, у каждого расширения базы данных есть как минимум функция для подключения к базе данных, функция для отправки запроса к базе данных и функция закрытия соединения с базой данных. Поскольку у вас может быть несколько одновременных соединений с базой данных, функция подключения возвращает вам ресурс (или дескриптор) - некий уникальный идентификатор (дескриптор), позволяющий вам отличить одно соединение от другого.
У каждого активного ресурса есть свой уникальный идентификатор (дескриптор). Каждый идентификатор - это индекс во внутренней таблице РНР, где хранятся данные обо всех активных ресурсах. В этой таблице РНР хранит сведения о каждом ресурсе, включая данные о количестве ссылок на ресурс в коде приложения.
Тип resource содержит специальные указатели на открытые файлы, соединения с базой данных, области изображения и тому подобное. Когда последняя ссылка на ресурс исчезает, обычно вызывается расширение, создавшее ресурс, чтобы освободить память, закрыть соединения и т.д. для этого ресурса.
Когда больше нет ссылок на ресурс (нет переменных типа resource, ссылающихся на ресурс), он автоматически закрывается. Сборщик мусора автоматически обнаруживает и освобождает ресурсы, на которые не осталось ссылок, за счёт системы подсчёта ссылок, которая составляет часть движка Zend Engine. Поэтому необходимость освобождать память вручную бывает редко. За исключением постоянных подключений к базам данных - сборщик мусора не уничтожает такие ссылки.
Большинство расширений предлагают отдельные функции закрытия ресурса. Желательно использовать эти функции и вручную закрывать ресурс, не надеясь на то, что он будет закрыт автоматически. Это считается хорошим стилем программирования. Да и вообще в этой жизни нельзя рассчитывать ни на что и ни на кого, кроме себя. Это будет хорошим стилем жизни )))
В этом примере мы открываем каталог на диске и получаем его дескриптор, который можем дальше использовать в работе (например, перебрать все файлы в каталоге). В примере мы ничего с каталогом не делаем. Мы просто хотим проверить, что результат работы функции opendir() имеет тип resource. Проверить это можно с помощью функции is_resource() , которая возвращает true, если передаваемый в неё параметр является ресурсом.
Поскольку ресурсы бывают разных типов, то иногда надо знать, какой именно тип имеет ресурс. В примере для этого мы использовали функцию get_resource_type().
Чтобы не загромождать пример, я не стал делать какие-либо проверки на ошибки. Поэтому, например, если каталог не существует, то в браузере будет сообщение об ошибке. Как подавить такие сообщения, см. здесь.
А вот что выведет на экран наш пример, если каталог открыт успешно:
В случае с каталогом закрыть ресурс можно функцией closedir(). В случае с другими ресурсами функция будет, разумеется, другой. После закрытия ресурса память, выделенная ресурсу, освобождается, однако сама переменная остаётся, правда, тип ресурса будет уже не resource, а resource (closed), поскольку ресурс закрыт.
Также если вы просто переопределите переменную, связанную с ресурсом, например, присвоив ей какое-то строковое или числовое значение, то ресурс закроется автоматически.
На этом всё. Подписывайтесь на канал, чтобы ничего не пропустить.