Имеются некоторые условия, которые надо иметь в виду при использовании eval(). Не забудьте, что переданная строка должна иметь допустимый PHP код, при включении чего-нибудь подобного завершению кода с точкой с запятой дальнейшее выполнение не прервется на строке после eval(), поэтому пропускайте это в code_str.
Также не забудьте, что при изменении переменных значений в eval()
эти переменные будут изменены и в основных данных.
Пример 1. eval() - простое объединение
текста
<?php $string = 'cup'; $name = 'coffee'; $str = 'This is a $string with my $name in it.<br>'; echo $str; eval( "\$str = \"$str\";" ); echo $str; ?> |
При выполнении вышеприведенного примера будет выведено следующее:
This is a $string with my $name in it. This is a cup with my coffee in it.
Пример 1. die
<?php $filename = '/path/to/data-file'; $file = fopen($filename, 'r') or die "unable to open file ($filename)"; ?> |
Это полезно при отладке диспетчера памяти, который автоматически очищает "отсеченную" память при выполнении запроса.
Идея на эту функцию принималась из Perl и всей работы кодов форматирования
также как там. Строка формата состоит из кодов формата, сопровождаемые
факультативным параметром ретранслятора. Параметр ретранслятора может быть
или целочисленное значение или * для повторение до конца входных данных.
Для a, A, h, H количество повторов определяет, сколько принимается символов
одного параметра данных, для @ это безусловная позиция, где поместить следующие
данные, для всего остального количество повторов определяет сколько данных
будет использовано и упаковано в возникающую в результате двоичную строку.
В настоящее время выполнено:
A строка SPACE-заполнений
h Hex строка, младший полубайт вначале
H Hex строка, старший полубайт вначале
c signed char
C unsigned char
s signed short (всегда 16 бит, machine byte order)
S unsigned short (всегда 16 бит, machine byte order)
n unsigned short (всегда 16 бит, big endian byte order)
v unsigned short (всегда 16 бит, little endian byte order)
i signed integer (machine dependant размер и byte order)
I unsigned integer (machine dependant размер и byte order)
l signed long (всегда 32 бит, machine byte order)
L unsigned long (всегда 32 бит, machine byte order)
N unsigned long (всегда 32 бит, big endian byte order)
V unsigned long (всегда 32 бит, little endian byte order)
f float (machine dependent размер и representation)
d double (machine dependent размер и representation)
x NUL байт
X Копирует один байт
@ NUL-Заполнение до конкретной позиции
Пример 1. pack форматируем строку
$binarydata = pack(" nvc* ", 0x1234, 0x5678, 65, 66);Возникающая в результате двоичная строка будет длиной 6 байтов и содержать последовательность байтов 0x12, 0x34, 0x78, 0x56, 0x41, 0x42. |
Обратите внимание, что различие между знаковыми и без знаковыми значениями эффективно только для функции unpack(), так как функция pack() дает тот же самый результат для знаковых и без знаковых кодов форматирования.
Также обратите внимание, что PHP хранит интегральные значения как значения со знаком и имеет machine dependant размер. Если вы делаете без знака, то интегральное значение будет сохранено и сконвертировано, при этом конечный результат будет неизвестен.
Это полезно для сохранения или передачи значений PHP без потери их типа и структуры..
Чтобы преобразовать строку обратно в PHP значение, используйте unserialize().
serialize()
обрабатывает следующие типы: integer, double, string, array
(многомерный) и object (объект будет
преобразован в последовательную форму, но методы при этом будут утеряны).
Пример 1. serialize
// $session_data содержит многомерный массив с информацией о сессии // текущего пользователя. Мы используем serialize() для сохранения // этого в базе данных в конце запроса. $conn = odbc_connect("webdb", "php", "chicken"); $stmt = odbc_prepare($conn, "UPDATE sessions SET data = ? WHERE id = ?"); $sqldata = array(serialize($session_data), $PHP_AUTH_USER); if (!odbc_execute($stmt, &$sqldata)) { $stmt = odbc_prepare($conn, "INSERT INTO sessions (id, data) VALUES(?, ?)"); if (!odbc_execute($stmt, &$sqldata)) { /* Что-то сделано неправильно. */ } } |
См. также usleep().
Unpack работает не так как в Perl поскольку распакованные данные сохранены
в ассоциативном массиве. Чтобы сделать это, Вы должны установить различные
коды формата, и отделить их наклонной чертой вправо /.
Пример 1. Распаковываем строку
$array = unpack("c2chars/nint", $binarydata);Возникающий в результате массив будет содержать "chars1", "chars2" и "int". |
Для объяснения кодов формата см. также: pack()
Помните, что PHP хранит интегральные значения со знаком. Даже если вы сохраните с указанием что это без знака, и будете извлекать, то все равно непредсказуем результат и может возникнуть ошибка.
Пример 1. unserialize
// Здесь мы используем unserialize() для загрузки данных о сессии из базы данных // в $session_data. Этот пример дополняет описанный в месте // с serialize(). $conn = odbc_connect("webdb", "php", "chicken"); $stmt = odbc_prepare($conn, "SELECT data FROM sessions WHERE id = ?"); $sqldata = array($PHP_AUTH_USER); if (!odbc_execute($stmt, &$sqldata) || !odbc_fetch_into($stmt, &$tmp)) { // Если сбой запуска или выборки , то инициализируем массив $session_data = array(); } else { // Мы должны иметь представление в $tmp[0]. $session_data = unserialize($tmp[0]); if (!is_array($session_data)) { // Что-то неправильно, инициализируем массив $session_data = array(); } } |
Если Вы нуждаетесь в уникальном идентификаторе или лексеме(маркере), и Вы предполагаете раздавать эту лексему(маркер) пользователю через сеть (то есть сеанс cookies), то рекомендуется, чтобы Вы использовали что - нибудь со строками
$token = md5(uniqid("")); // Не произвольно $better_token = md5(uniqid(random())); // Намного лучше, труднее подобрать
См. также sleep().