Что такое ресурс php

Типы данных в PHP

Что такое типы данных

Каждая переменная и каждое значение в PHP имеет свой тип данных:

Типы данных в PHP

В PHP существуют следующие основные типы данных:

Строка

Строки в PHP размещаются в одинарных или двойных кавычках. Главное различие в том, что в двойные кавычки можно подставить значение переменной, например:

Другие различия будут рассмотрены в отдельном уроке.

Для PHP 7+ 64-битных сборок нет ограничений на максимальную длину строки, для остальных она составляет 2Гб.

Булев тип

Значение булева типа может содержать в себе только true или false (истина или ложь).

Булев тип удобно использовать для всяких флажков и статусов вроде отправлено/не отправлено, просмотрено/не просмотрено и т.д.

Целое число

Целые числа имеют следующие минимальные и максимальные значения:

Помимо десятичной системы счисления, PHP также поддерживает двоичную, восьмеричную и шестнадцатеричную:

Дробное число

Разделителем дробной части в PHP является точка:

С дробными числами существует проблема, характерная не только для PHP, но и для любых других языков, где используется двоичное представление чисел с плавающей точкой.

Проблема в том, что дробные числа имеют ограниченную точность, что в некоторых ситуациях может приводить к неожиданным результатам:

Оператор сравнения == возвращает true или false если два значения соответственно равны или не равны.

Поэтому когда нужно производить какие-то вычисления, где важна абсолютная точность, нужно использовать специальные функции произвольной точности:

Массив

Массивы будут подробно рассмотрены в уроке Массивы в PHP.

Объект

Объекты будут подробно рассмотрены в будущем.

Ресурс

В примере выше функция fopen возвращает ссылку на файл, которую затем можно использовать вместе с другими функциями для управления файлом.

NULL означает отсутствие значения:

Как определить тип переменной

Получить тип переменной можно с помощью функции gettype() :

Источник

Разработка расширений для PHP. Ресурсы

Ресурсы автоматически уничтожаются, когда счетчик ссылок достигает 0 (см. главу «Данные и переменные»), при уничтожении вызывается функция-деструктор, если она была указана.

Регистрация ресурса

Регистрацию ресурса можно разделить на несколько простых действий:

Помимо идентификатора типа, ресурс также может иметь человекопонятное название типа, которое является константным значением. Название типа ресурса можно определить в заголовочном файле (или в файле с кодом) расширения следующим образом:

Данное имя является не обязательным и используется для того, чтобы сделать пользовательские вывод информации/сообщений об ошибках более понятными.

Первым делом необходимо зарегистрировать свой тип ресурса с помощью одной из из следующих функций:

int zend_register_list_destructors(void (*ld)(void*), void (*pld)(void*), int module_number)

int zend_register_list_destructors_ex(rsrc_dtor_func_t ld, rsrc_dtor_func_t pld, char* res_name, int module_number)

Вторая функция, в качестве третьего аргумента, принимает человекопонятное название ресурса.

Необходимо обратить внимание, на то, что функции принимают указатели на функции-деструкторы разного типа. Первая функция принимает указатель на void функцию-деструктор, которая не принимает никаких аргументов. Вторая функция принимает на функцию функцию-деструктор со следующим прототипом:

При вызове функции в качестве единственного аргумента в нее будет передан указатель на структуру zend_rsrc_list_entry :

Функции возвращают идентификатор типа ресурса, который необходимо присвоить глобальной переменной, объявленной в самом начале. В дальнейшем этот идентификатор будет использоваться при непосредственной регистрации ресурса, а также поиске/получении ресурса по его идентификатору.

Примеры регистрации типа ресурса:

После того как зарегистрирован тип ресурса и получен его уникальный идентификатор, пришло самое время зарегистрировать ресурс. Регистрация ресурса осуществляется с помощью макроса

По сути данный макрос является синонимом к функции zend_register_resource(zval *rsrc_result, void *rsrc_pointer, int rsrc_type) :

Примеры регистрации ресурса:

Выполнение следующего кода:

Получение ресурса

Аргументы функции:

АргументОписание
rsrc_zvalконтейнер, в котором содержится идентификатор ресурса
rsrc_idидентификатор ресурса
rsrc_nameчеловекопонятное название ресурса, используется только в сообщениях об ошибках
found_rsrc_typeуказатель на переменную, в которую будет записан идентификатор типа найденного ресурса
num_rsrcкол-во идентификаторов типа ресурса
идентификаторы типа ресурса

Если в функцию в качестве аргумента found_rsrc_type передан указатель на переменную, то в эту переменную будет записан идентификатор типа найденного ресурса.

После аргумента num_rsrc_types в функцию передаются идентификаторы типов, с которыми будет сравниваться идентификатор типа найденного ресурса. Как только будет найдено совпадение, функция завершит свою работу, переменной found_rsrc_type будет присвоен идентификатор найденного типа.

Внутри функции zend_fetch_resource() сравнение происходит след. образом:

Изменим пример, который был приведен при рассмотрении функции zend_list_find() :

Результат работы скрипта:

Ниже представлены макросы, обертки над функцией zend_fetch_resource() :

Аргументы макросов:

АргументОписание
rsrcпеременная-указатель, которой будет присвоен результат поиска
resrc_typeтип к которому будет приведен найденный ресурс
passed_idzval-контейнер, в котором содержится идентификатор ресурса
default_idидентификатор ресурса
resource_type_nameчеловекопонятное название ресурса, используется только в сообщениях об ошибках
resource_typeидентификатор типа искомого ресурса

ZEND_FETCH_RESOURCE2(rsrc, resrc_type, passed_id, default_id, resource_type_name, resource_type1, resource_type2)

ZEND_FETCH_RESOURCE2_NO_RETURN(rsrc, resrc_type, passed_id, default_id, resource_type_name, resource_type1, resource_type2)

Аргументы макросов:

АргументОписание
rsrcпеременная-указатель, которой будет присвоен результат поиска
resrc_typeтип к которому будет приведен найденный ресурс
passed_id_zval_-контейнер, в котором содержится идентификатор ресурса
default_idидентификатор ресурса
resource_type_nameчеловекопонятное название ресурса, используется только в сообщениях об ошибках
resource_type1идентификатор типа искомого ресурса
resource_type2идентификатор типа искомого ресурса

Уничтожение ресурса

Для уничтожения ресурса вызывается функция-деструктор, если она была зарегистрирована.

Для немедленного удаления ресурса его необходимо из хэш-таблицы EG**(regular_list) :

Другие макросы и функции

Источник

Ресурсы

Например, ресурсы используются для хранения ссылок БД и дескрипторов файлов. Стандартная реализация de facto находится в модуле MySQL, но другие модули, такие как Oracle, также используют ресурсы.

Примечание: фактически ресурсом может быть указатель на что-либо, что вам необходимо обработать в функции (например, указатель на структуру), и пользователь должен лишь передать единственную переменную ресурса в вашу функцию.

Чтобы создать новый ресурс, вам необходимо зарегистрировать обработчик уничтожения ресурса. Поскольку вы можете хранить как ресурс любой вид данных, Zend должна знать, как освободить этот ресурс, когда он больше не нужен. Это делается путём регистрации в Zend вашего собственного обработчика уничтожения ресурса/destruction, который, в свою очередь, вызывается Zend-машиной, когда ваш ресурс должен быть освобождён (вручную или автоматически). Регистрация вашего обработчика ресурса в Zend возвращает вам resource type handle\дескриптор типа (этого) ресурса. Этот дескриптор нужен в дальнейшем для обеспечения вашего доступа к ресурсу этого типа и хранится в большинстве случаев в глобальной статической переменной в вашем расширении. Нет необходимости беспокоиться здесь о безопасности потока, поскольку вы регистрируете ваш обработчик ресурса только один раз при инициализации модуля.

Zend-функция для регистрации вашего обработчика ресурса определяется так:

Есть две разновидности обработчиков уничтожения ресурса, которые вы можете передавать этой функции: обработчик нормальных ресурсов и обработчик постоянных ресурсов. Постоянные ресурсы используются, например, для соединений с базами данных (БД). При регистрации ресурса обязан иметься один из этих обработчиков. Для другого обработчика просто передайте NULL.

zend_register_list_destructors_ex() принимает следующие параметры:

ldВызов обработчика уничтожения нормального ресурса
pldВызов обработчика уничтожения постоянного ресурса
type_nameСтрока, специфицирующая имя вашего ресурса. Хорошо бы всегда специфицировать уникальное имя типа ресурса РНР, чтобы, если пользователь, например, вызовет var_dump($resource);, он получил также имя ресурса.
module_numbermodule_number является доступным автоматически в вашей функции PHP_MINIT_FUNCTION, и, следовательно, вы просто передаёте его.

return-значение это уникальный целочисленный ID (идентификатор) вашего типа ресурса.

Обработчик уничтожения ресурса (нормального или постоянного) имеет следующий прототип:

Передаваемый rsrc это указатель но следующую структуру:

Член void *ptr это фактический указатель на ваш ресурс.

Теперь мы знаем, как начать: мы определяем наш собственный ресурс, который хотим зарегистрировать в Zend. Это простая структура с двумя целочисленными членами:

Наш обработчик уничтожения ресурса будет, вероятно, выглядеть так:

Примечание: важно подчеркнуть: Если ваш ресурс это более сложная структура, которая к тому же содержит указатели на память, выделенную в процессе работы, вы должны освободить их перед освобождением самого ресурса!

Теперь, когда мы определили

что такое наш ресурс и

обработчик уничтожения ресурса,

создать глобальную переменную с расширение, содержащую ID ресурса, чтобы можно было получить к нему доступ из любой функции

определить имя ресурса

написать обработчик уничтожения ресурса

и, наконец, зарегистрировать обработчик

Для регистрации нового ресурса вы можете использовать либо функцию zend_register_resource(), либо макрос ZEND_REGISTER_RESOURE(), определённые в zend_list.h. хотя аргументы для них обоих соответствуют 1:1, лучше всегда использовать макросы для обеспечения совместимости в будущем:

return-значение это уникальный целочисленный идентификатор данного ресурса.

Возвращаемый rsrc_id уникально идентифицирует вновь зарегистрированный ресурс. Вы можете использовать макрос RETURN_RESOURE для возвращения его пользователю:

Получив тот ресурс в некоторой точке, пользователь передаёт его обратно в одну из ваших функций. Контейнер value.lval внутри контейнера zval * содержит ключ/key к вашему ресурсу и, таким образом, может быть использован для получения этого ресурса с помощью макроса ZEND_FETCH_RESOURCE:

Этот макрос не имеет return-значения. Это сделано для удобства разработчиков. Он заботится о передаче TSRMLS-аргументов, а также проверяет, может ли ресурс быть получен. Он вызывает появление сообщения-предупреждения и возвращает текущую PHP-функцию с NULL, если была проблема с получением ресурса.

Источник

is_resource

(PHP 4, PHP 5, PHP 7, PHP 8)

is_resource — Проверяет, является ли переменная ресурсом

Описание

Проверяет, является ли данная переменная ресурсом ( resource ).

Список параметров

Возвращаемые значения

Примеры

Пример #1 Пример использования is_resource()

Примечания

Смотрите также

User Contributed Notes 3 notes

I was recently trying to loop through some objects and convert them to arrays so that I could encode them to json strings.

I was running into issues when an element of one of my objects was a SoapClient. As it turns out, json_encode() doesn’t like any resources to be passed to it. My simple fix was to use is_resource() to determine whether or not the variable I was looking at was a resource.

I quickly realized that is_resource() returns false for two out of the 3 resources that are typically in a SoapClient object. If the resource type is ‘Unknown’ according to var_dump() and get_resource_type(), is_resource() doesn’t think that the variable is a resource!

My work around for this was to use get_resource_type() instead of is_resource(), but that function throws an error if the variable you’re checking isn’t a resource.

So how are you supposed to know when a variable is a resource if is_resource() is unreliable, and get_resource_type() gives errors if you don’t pass it a resource?

I ended up doing something like this:

I spent way too long trying to figure this stuff out, so I hope this comment helps someone out if they run into the same problem I did.

Try this to know behavior:

[Check Valid Resource]
(bool)$resource => TRUE
get_resource_type($resource) => stream
is_resource($resource) => TRUE

[Check Released Resource]
(bool)$resource => TRUE
get_resource_type($resource) => Unknown
is_resource($resource) => FALSE

Note that is_resource() is unreliable. It considers closed resources as false:

?>

That’s the reason why some other people here have been confused and devised some complex (bad) «solutions» to detect resources.

There’s a much better solution. In fact, I just showed it above, but here it is again with a more complete example:

?>

So how do you check if something is a resource?

— An active resource is a resource, so check that first for efficiency.
— Then branch to check what the variable is NOT:
— A resource is never NULL. (We do that check via `!== null` for efficiency).
— A resource is never Scalar (int, float, string, bool).
— A resource is never an array.
— A resource is never an object.
— Only one variable type remains if all of the above checks succeeded: IF it’s NOT any of the above, then it’s a closed resource!

Just surfed by and saw the bad and hacky methods other people had left, and wanted to help out with this proper technique. Good luck, everyone!

Источник

Типы данных

Во всех языках программирования предусмотрена та или иная система типов, которая регламентирует все возможные разновидности значений, применяемых в программах. Разнообразие типов часто отражает наличие разных форматов представления данных в памяти компьютера на уровне битов, хотя во многих случаях программисты избавлены от необходимости учитывать, какое битовое представление имеют данные (или даже лишены возможности обращаться к таким битовым представлениям).

Система типов языка PHP является простой, изящной и гибкой; к тому же она избавляет программиста от необходимости учитывать подробности реализации средств хранения данных на низком уровне. Язык PHP позволяет программисту снять с себя основную часть забот, связанных с определением типов переменных и значений, во-первых, потому, что не требует типизации переменных, а во-вторых, в связи с тем, что выполняет значительную часть преобразований типов автоматически, от имени программиста.

Общие сведения о типах

В языке PHP предусмотрено всего восемь типов: целые числа, числа с плавающей точкой двойной точности, логические значения, строковые значения, массивы, объекты, значения NULL и ресурсы.

Целочисленные значения представляют собой целые числа без десятичной точки, такие как 495.

Числа с плавающей точкой двойной точности — это числа с плавающей точкой наподобие 3.14159 или 49.0, имеющие наибольший возможный формат представления.

Логические значения принимают только два возможных значения: TRUE и FALSE.

Значение NULL — это специальный тип, который имеет только одно значение: NULL.

Строки — это последовательности символов, например ‘PHP поддерживает работу со строками’.

Массивы представляют собой именованные и индексированные коллекции других значений.

Объекты — это экземпляры определяемых программистом классов, которые могут включать не только значения других типов, но и функции, относящиеся к соответствующему классу.

Ресурсами называют специальные переменные, которые хранят ссылки на ресурсы, внешние по отношению к интерпретатору PHP (такие как соединения с базой данных).

Первые пять из этих типов являются простыми типами, а следующие два типа (массивы и объекты) — составными. Различия между простыми и составными типами заключаются в том, что составные типы могут применяться для представления произвольных значений произвольных типов, а простые типы этого не позволяют. В этой статье кратко рассматриваются только простые типы.

Отсутствие объявлений типов переменных

Тип переменной не требуется объявлять заранее. Вместо этого программист может перейти непосредственно к выполнению операции присваивания и дать возможность интерпретатору PHP заняться определением типа присваиваемого значения выражения, как показано в следующем примере:

Автоматическое преобразование типов

В языке PHP предусмотрены удобные способы автоматического преобразования типов в случае необходимости. Как и в большинстве других современных языков программирования, в языке PHP выполняются правильные действия, например, при вычислении математических выражений со смешанными числовыми типами. В частности, результатом выполнения выражения:

является число с плавающей точкой (двойной точности), причем целое число 3 неявно преобразуется в число с плавающей точкой перед выполнением операции сложения.

Типизация с учетом контекста

В языке PHP предусмотрены средства автоматического преобразования типов, намного более удобные по сравнению с большинством других языков. Рассмотрим такой пример:

Функция substr предназначена для выделения подстроки из строки символов. В качестве первого параметра эта функция принимает строку символов и возвращает подстроку этой строки, начальная позиция которой и длина определяются следующими двумя входными параметрами функции. Но в данном случае функции substr вместо символьной строки передано целое число 12345. Что при этом происходит? Как оказалось, ошибка не возникает, а в окне браузера появляются следующие выходные данные:

Что такое ресурс php. Смотреть фото Что такое ресурс php. Смотреть картинку Что такое ресурс php. Картинка про Что такое ресурс php. Фото Что такое ресурс phpАвтоматическая типизация с учетом контекста

Поскольку для функции substr требуется символьная строка, а не целое число, интерпретатор PHP преобразует число 12345 в символьную строку «12345» которая затем поступает на обработку в функцию substr.

Поскольку в языке PHP предусмотрено такое автоматическое преобразование типов, ошибки из-за несовместимости типов активизируются интерпретатором PHP очень редко. В действительности иногда программисту, работающему на языке PHP, приходится проявлять некоторую осмотрительность, для того чтобы путаница с типами не приводила к получению вырабатываемых без ошибок, но и не предусмотренных программистом результатов.

Простые типы

Простые типы, применяемые в языке PHP (целые числа, числа с плавающей точкой двойной точности, логические значения, значения NULL и строковые значения), должны быть в основном знакомы тем, кто имеет опыт в программировании (но мы не предполагаем наличие у читателя такого опыта, поэтому дадим подробное описание простых типов). Единственным, что может удивить программистов, работающих на языке C, является то, насколько мало количество типов в языке PHP.

Во многих языках программирования применяются числовые типы с несколькими форматами представления, с учетом того, что числовые типы, имеющие более крупные форматы, обеспечивают представление более широкого диапазона значений, но требуют также больше места в памяти.

Например, в языке C предусмотрены тип short (для относительно небольших целых чисел), тип long (для чисел, которые могут оказаться весьма большими) и тип int (который может быть промежуточным между этими двумя типами, но на практике иногда рассматривается как идентичный либо типу short, либо long). Имеются также разные типы данных с плавающей точкой, которые отличаются по своей точности. Такого рода разнообразие типов имело смысл в то время, когда приходилось часто принимать очень жесткие компромиссные решения, выбирая между требованиями уменьшения объема используемой памяти и сохранения функциональных возможностей. По нашему мнению, проектировщики языка PHP приняли разумное решение по упрощению системы типов, предусмотрев только два числовых типа, соответствующих одному целочисленному типу и одному типу с плавающей точкой языка C (с наибольшими форматами представления).

Целые числа

Целочисленные значения относятся к самому простому типу — соответствуют простым целым числам, как положительным, так и отрицательным. Целочисленные значения могут присваиваться переменным или использоваться в выражениях, как показано в следующем примере:

Форматы чтения

Целые числа фактически могут считываться в трех форматах, которые соответствуют основаниям систем счисления: десятичной (с основанием 10), восьмеричной (с основанием 8) и шестнадцатеричной (с основанием 16). Десятичный формат применяется по умолчанию, восьмеричные целые числа задаются с помощью ведущей цифры 0, а шестнадцатеричные — с помощью префикса 0x. Любой из этих форматов предусматривает возможность применения в качестве префикса знака минуса (-), который позволяет указать, что целое число является отрицательным. Рассмотрим следующий пример:

Выполнение этого кода приводит к выводу в окне браузера такого текста:

Что такое ресурс php. Смотреть фото Что такое ресурс php. Смотреть картинку Что такое ресурс php. Картинка про Что такое ресурс php. Фото Что такое ресурс php8-ричное, 10-ричное и 16-ричное представление целых чисел в PHP

Диапазон представления

Чтобы узнать, каковым является наибольшее целое число для конкретной реализации, можно воспользоваться константой PHP_INT_MAX языка PHP. Если в программе действительно требуются целые числа, которые больше или меньше тех значений, которые приведены выше, то в языке PHP предусмотрены некоторые функции для работы с числами произвольной точности (подробнее об этом речь пойдет в одной из следующих статей).

Числа с плавающей точкой двойной точности

Примеры чисел с плавающей точкой двойной точности приведены ниже:

Но почти в любых ситуациях пользователь может применять в математических выражениях произвольные сочетания чисел с плавающей точкой двойной точности и целых чисел и предоставлять возможность решать проблемы, связанные с определением типов для соответствующих значений, интерпретатору PHP.

Форматы чтения

Кроме того, числа с плавающей точкой двойной точности можно задавать в экспоненциальном формате, добавляя в конце приведенного выше формата с плавающей точкой (который рассматривается в экспоненциальном формате как мантисса) букву «e» и требуемое целочисленное значение степени 10 (показатель степени). Например, обозначение 2.2e-3 в экспоненциальном формате соответствует значению 0.0022.

Логические значения

Логическими называют истинностные значения, которые используются в таких конструкциях, позволяющих управлять ходом выполнения программы, как часть оператора if, в которой происходит проверка условия. Логические значения могут комбинироваться с применением логических операций для получения более сложных логических выражений.

Логические константы

В языке PHP предусмотрена пара констант, специально предназначенных для использования в качестве логических констант. Это — константы TRUE и FALSE, которые могут применяться примерно следующим образом:

Интерпретация значений других типов как логических значений

Ниже приведены правила определения истинности любого значения, которое еще не является логическим:

Если значение является числовым и точно равно нулю, то рассматривается как ложное, все прочие числовые значения считаются истинными.

Если значение является строковым, то рассматривается как ложное, если строка пуста (имеет длину, равную нулю) или представляет собой строку «0», и как истинное в противном случае.

Значения NULL всегда являются ложными.

Если значение имеет составной тип (представляет собой массив или объект), то рассматривается как ложное, если не содержит других значений, и как истинное в противном случае. Объект считается содержащим значение, если в его состав входит переменная экземпляра, которой было присвоено значение.

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

Ниже приведены переменные, в именах которых указано истинностное значение (true — истина, false — ложь), принимаемое этими переменными при использовании в логическом контексте:

Безусловно, из первого приведенного выше правила следует, что число с плавающей точкой двойной точности (0.0) преобразуется в ложное логическое значение. Но необходимо учитывать, что выражения с плавающей точкой опасно использовать в качестве логических выражений из-за возможных ошибок округления. Рассмотрим следующий пример:

Что такое ресурс php. Смотреть фото Что такое ресурс php. Смотреть картинку Что такое ресурс php. Картинка про Что такое ресурс php. Фото Что такое ресурс phpОшибки округления дробных чисел в PHP

Значение null

На первый взгляд мир логических значений может показаться малым, поскольку для переменных логического типа предусмотрены только два возможных значения. А тип NULL сужает пространство значений до крайнего предела: данные типа NULL могут иметь только одно возможное значение, которым является значение NULL. Чтобы присвоить переменной значение NULL, достаточно применить к переменной примерно такую операцию присваивания:

Специальная константа NULL записывается прописными буквами в соответствии с общепринятым соглашением, но фактически имя этой константы не чувствительно к регистру, приведенный выше оператор вполне можно было бы записать следующим образом:

Так чем же отличаются значения NULL? Значение NULL представляет отсутствие значения (значение NULL можно рассматривать как недостающее или незаданное значение). Переменная, которой присвоено значение NULL, почти неотличима от переменной, которой вообще не было присвоено значение. В частности, переменная, которой присвоено значение NULL, обладает описанными ниже свойствами:

В логическом контексте вычисления, проведенные с этой переменной, приводят к получению значения FALSE.

Применение к этой переменной проверки с помощью функции IsSet() приводит к получению значения FALSE. (Таким свойством не обладают переменные каких-либо других типов.)

Интерпретатор PHP не выводит предупреждающее сообщение при передаче такой переменной в функцию и возврате из функции, тогда как передача переменной, значение которой еще не было присвоено, иногда приводит к активизации предупреждающих сообщений.

Переменные со значением NULL в основном предназначены для использования в таких ситуациях, когда требуется преднамеренно применить переменную, не имеющую значения, и разработчик хочет, чтобы об этом узнал и читатель созданного им кода, и интерпретатор PHP. Последнее соображение становится особенно важным, если приходится передавать значения переменных в функции.

Строки

Как показано ниже, строки представляют собой символьные последовательности:

Строки могут быть заключены в одинарные или двойные кавычки. От применяемых ограничительных символов зависит то, как будут обрабатываться строки во время чтения интерпретатором. Строки в одинарных кавычках остаются почти неизменными. С другой стороны, строки в двойных кавычках подвергаются более интенсивной обработке: переменные, заданные в таких строках, заменяются своими значениями, а некоторые символьные последовательности интерпретируются особым образом.

Строки в одинарных кавычках

Если не учитывать, что происходит интерпретация особым образом нескольких символьных последовательностей, чтение и сохранение в памяти строк в одинарных кавычках осуществляется без каких-либо изменений. Например, обработка интерпретатором следующего кода:

приводит к получению в окне браузера следующего вывода:

Что такое ресурс php. Смотреть фото Что такое ресурс php. Смотреть картинку Что такое ресурс php. Картинка про Что такое ресурс php. Фото Что такое ресурс phpОбработка строки с одинарными кавычками

Строки в одинарных кавычках подчиняются также такому общему правилу, что кавычки другого типа не приводят к разрыву строки, заключенной в кавычки. Например, следующий оператор является допустимым:

Чтобы ввести одинарную кавычку (применяемую в качестве апострофа) в строку, заключенную в одинарные кавычки, необходимо обозначить одинарную кавычку с помощью знака переключения (на другой режим обработки символов) в виде обратной косой черты, как показано ниже:

Хотя в большинстве контекстов символы обратной косой черты в строках с одинарными кавычками интерпретируются буквально, можно также использовать два символа обратной косой черты (в качестве управляющей последовательности для обозначения одного символа обратной косой черты, не применяемого в составе управляющей последовательности). Это удобно, если символ обратной косой черты должен быть задан в качестве последнего символа в строке, как в следующем примере:

Подводя итог, отметим, что строки в одинарных кавычках сохраняются в памяти в неизменном виде и единственными исключениями являются две указанные управляющие последовательности (\\ и \’).

Строки в двойных кавычках

Строки, заключенные в двойные кавычки (например, «this»), подвергаются предварительной обработке интерпретатором PHP двумя приведенными ниже способами:

Некоторые символьные последовательности, начинающиеся с обратной косой черты (\), заменяются специальными символами.

Ниже описано, какие замены происходят при обработке некоторых управляющих последовательностей:

Последовательность \n заменяется символом обозначения конца строки.

Последовательность \r заменяется символом возврата каретки (переноса).

Последовательность \t заменяется символом табуляции.

Последовательность \$ заменяется самим знаком доллара ($).

Последовательность \» заменяется одной двойной кавычкой («).

Последовательность \\ заменяется одной наклонной чертой влево (\).

Как и в случае строк в одинарных кавычках, в строки в двойных кавычках можно свободно включать кавычки другого типа, без символа управляющей последовательности:

Подстановка значений переменных

Если переменной в настоящее время присвоено строковое значение, то оно заменяет в строке с двойными кавычками имя соответствующей переменной (иными словами, выполняется подстановка значения переменной вместо имени переменной).

Если переменной в настоящее время присвоено значение, отличное от строкового, то данное значение преобразуется в строковое, а затем осуществляется замена имени переменной строковым значением.

Если переменной в настоящее время не присвоено значение, то интерпретатор PHP заменяет имя переменной пустым значением (или, если применить эквивалентную формулировку, интерпретатор PHP подставляет вместо имени переменной пустую строку).

Ресурсы

представляют собой специальные значения, которые ссылаются на информацию об адресах памяти или о состояниях, внешнюю по отношению к самой системе PHP. Тем читателям, которые не занимаются программированием на языке PHP на постоянной основе, не нужны слишком подробные сведения о ресурсах. В следующем подразделе кратко описано общее назначение ресурсов.

Общее определение понятия ресурса

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

Но может оказаться, что во внешних программах, с которыми взаимодействует интерпретатор PHP (в системах управления базами данных и т.д.), такая отмена распределения памяти не предусмотрена. Это означает, что в памяти программы, которая управляет базой данных, будет долго оставаться место, зарезервированное для сценария, даже после завершения этого сценария.

В интерпретаторе PHP для решения такой проблемы используется подход, предусматривающий вызов специальных функций, которые запрашивают память из подобных внешних программ и возвращают ресурсы, после чего интерпретатор PHP следит за тем, чтобы не возникала такая ситуация, что эти ресурсы больше не применяются в сценарии. Если к ресурсам никто не обращается, то интерпретатор PHP обеспечивает выполнение внешней программой требуемой операции очистки памяти. Такая задача решается интерпретатором PHP путем подсчета ссылок на ресурс. Если количество ссылок достигает нуля, то ресурс может быть освобожден.

Способы обработки ресурсов

Как правило, программисты, работающие на языке PHP, не создают ресурсы самостоятельно, а вызывают специальные функции, которые возвращают значения типа resource, а затем передают эти значения в другие функции, для которых требуются ресурсы. Например, в программе можно вызвать функцию mysql_connect() (которая возвращает значение ресурса, ссылающееся на соединение с базой данных MySQL), сохранить полученный результат в переменной, а затем передать значение ресурса в функцию mysql_query() (которая использует ресурс соединения для передачи запроса в базу данных).

По сути, все, что должен сделать программист с таким ресурсом соединения — это сохранить его в переменной, чтобы в дальнейшем иметь возможность передавать значение переменной в функции, для которых требуется этот ресурс. Задача по очистке занимаемой ресурсом памяти после окончания работы сценария может быть возложена на интерпретатор PHP. Но если по каким-то признакам пользователь обнаружит, что для хранения ресурса в ходе выполнения сценария расходуется большой объем памяти, то может быть принято решение освободить эту память еще до окончания выполнения сценария. Такая операция обычно выполняется примерно таким образом:

Проверка типа

Во время выполнения программы иногда возникает необходимость узнать, к какому типу относится то или иное значение. Такая задача становится особенно важной в связи с тем, что тип переменной может быть изменен в результате присваивания этой переменной другого значения. В языке PHP, во-первых, предусмотрена общая функция проверки типа gettype(), а во-вторых, имеются отдельные булевы функции для каждого из пяти основных типов. Итоговые сведения об этих функциях приведены в таблице ниже. Следует учитывать, что некоторые из этих функций имеют альтернативные имена:

Присваивание и приведение типа

Как уже было сказано, интерпретатор PHP часто автоматически преобразует данные из одного типа в другой, если этого требует контекст. Кроме того, в случае необходимости такие преобразования могут быть выполнены принудительно, по указанию программиста, разрабатывающего программу на языке PHP. Но программист должен знать, какие действия происходят в той и другой ситуации.

Правила преобразования типов

Ниже приведены некоторые общие правила, по которым выполняется преобразование данных из одного типа в другой интерпретатором PHP.

Целое число — в число с плавающей точкой: создается число с плавающей точкой, полностью соответствующее исходному (например, int 4 становится равным float 4.0).

Число с плавающей точкой — в целое число: дробная часть отбрасывается, т.е. число округляется в сторону нуля.

Число — в булево значение: FALSE, если число точно равно 0, в противном случае TRUE.

Число — в строку: создается строка, которая выглядит точно так же, как выглядело бы число после вывода его значения. Вывод целых чисел осуществляется в виде последовательности цифр, а числа с плавающей точкой выводятся с минимально необходимой точностью. Достаточно высокие или низкие значения с плавающей точкой преобразуются в экспоненциальный формат.

Булево значение — в число: 1, если TRUE; 0, если FALSE.

Булево значение — в строку: ‘1’, если TRUE, пустая строка, если FALSE.

Значение NULL — в число: 0.

Значение NULL — в булево значение: FALSE.

Строка — в число: преобразование эквивалентно чтению числа из строки с последующим преобразованием в требуемый тип. Если число не может быть считано успешно, то полученное значение является нулевым. Для того чтобы операция чтения считалась выполненной успешно, не обязательно требуется считывать всю строку.

Строка — в булево значение: FALSE, если это — пустая строка или строка, равная ‘0’, TRUE в противном случае.

Простой тип (число или строка) — в массив: преобразование эквивалентно созданию нового массива с одним элементом, имеющим индекс нуль.

Массив — в число: преобразование не определено.

Массив — в булево значение: FALSE, если массив не имеет элементов, TRUE в противном случае.

Массив — в строку: ‘Array’.

Объект — в число: преобразование не определено.

Объект — в булево значение: TRUE, если объект содержит любые переменные экземпляра, имеющие ненулевое значение, и FALSE в противном случае.

Объект — в строку: ‘Object’.

Ресурс — в булево значение: FALSE.

Ресурс — в число: преобразование не определено.

Ресурс — в строку: строка, которая обычно принимает вид ‘Resource id #1’ (но этого нельзя гарантировать).

В приведенном выше списке было отмечено, что значения некоторых типов после преобразования в числовые значения имеют неопределенный результат. В данном контексте под словом «неопределенный» подразумевается, что разработчики PHP еще не пришли к согласию в отношении того, по каким правилам должно осуществляться такое преобразование в текущей и будущих версиях PHP, поэтому в коде не следует осуществлять преобразование подобного рода. Может оказаться, что в какой-то конкретной версии PHP подобные преобразования значений указанных типов в числовые значения осуществляются в программе успешно, но не следует рассчитывать на то, что в следующей версии соответствующее преобразование приведет к получению полезного результата.

Явные преобразования

В языке PHP предусмотрены три способа, с помощью которых программист может манипулировать данными, имеющими разные типы: применение функций преобразования, операторов приведения типа (подобные используемым в языке C) и вызов функции settype() с параметрами в виде переменных. Эти способы кратко описаны ниже:

Функции intval(), floatval () и strval() преобразуют свои параметры соответственно в целые числа, числа с плавающей точкой или строковые значения.

Любому выражению может предшествовать оператор приведения типа (имя типа в круглых скобках), который преобразует результат выражения в значение требуемого типа.

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

В следующем примере продемонстрированы все 3 версии приведения типов:

Ключевые слова с именами шести основных типов (integer, float, boolean, string, array и object) являются допустимыми компонентами в операторах приведения типа, а также допустимыми строковыми параметрами функции settype(). Кроме того, в операторах приведения типа допускается использование некоторых альтернативных ключевых слов, обозначающих имена типов: (int) вместо (integer), (double) или (real) вместо (float) и (bool) вместо (boolean). Приведение типа resource не допускается, а приведение к типу NULL является бессмысленным (дело в том, что результатом такого приведения может быть только значение NULL, поэтому можно вместо этого присвоить переменной такое значение.)

Целочисленное переполнение

Относительно недавно в языке PHP был реализован еще один остроумный способ автоматического преобразования типа. Он состоит в том, что при переполнении целочисленных значений (в случае присваивания целочисленной переменной значения, формат представления которого больше по сравнению с тем, который допускает эта переменная) последние присваиваются переменным с плавающей точкой. Такой подход не лишен смысла, поскольку числа с плавающей точкой позволяют представить более широкий диапазон значений по сравнению с целыми числами. Рассмотрим пример:

Код PHP Что такое ресурс php. Смотреть фото Что такое ресурс php. Смотреть картинку Что такое ресурс php. Картинка про Что такое ресурс php. Фото Что такое ресурс phpЦелочисленное переполнение

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *