diff --git a/appendices/filters.xml b/appendices/filters.xml index f4abc40da..b5ace115c 100644 --- a/appendices/filters.xml +++ b/appendices/filters.xml @@ -1,55 +1,50 @@ - + Список доступных фильтров - Следующий список перечисляет несколько встроенных фильтров для использования - с stream_filter_append. - Ваша версия PHP может включать больше (или меньше) фильтров, чем перечислено - здесь. + Раздел описывает ряд встроенных фильтров, которые функцией stream_filter_append + добавляют в цепочку обработки потока данных. + На количество доступных фильтров влияют конкретная версия и сборка PHP. - Следует акцентировать внимание на определённой асимметричности функций - stream_filter_append и - stream_filter_prepend. - Каждый поток в PHP имеет небольшой буфер чтения, - в котором он хранит блоки данных, полученные из файловой системы или - другого ресурса, для того чтобы обрабатывать данные наиболее эффективным - образом. Как только данные переносятся из ресурса во внутренний буфер - потока, они сразу же обрабатываются закреплёнными за потоком фильтрами, - независимо от того, готово ли приложение PHP принимать данные или нет. - Если данные находятся в буфере чтения в момент, когда в фильтр - что-то дописывают в конец, данные будут немедленно - обработаны этим фильтром, таким образом их нахождение в буфере - будет прозрачным. В то же время, если данные находятся в буфере в - момент, когда в фильтр что-то дописывают в начало, - данные НЕ будут обработаны этим фильтром. - Вместо этого, они будут ждать момента, когда следующий блок данных будет - получен из ресурса. + Функции stream_filter_append + и stream_filter_prepend работают асимметрично. + Каждый поток данных в PHP содержит буфер чтения. + В буфере хранятся блоки данных, которые поток получил из файловой системы + или другого источника. Буферизация оптимизирует операции ввода и вывода + при обработке данных. Сразу после извлечения из ресурса данные обрабатываются фильтрами, + которые добавили в цепочку обработки потока данных, + и записываются во внутренний буфер потока, независимо от готовности PHP-приложения принимать данные. + Данные в буфере чтения немедленно обрабатываются новым фильтром при добавлении фильтра + в конец цепочки, хотя данные и содержались в буфере на момент добавления фильтра. + При этом данные буфера чтения НЕ обрабатываются фильтром, + который добавляют в начало цепочки. + Такой фильтр ожидает считывания из источника нового блока данных. - Для получения списка фильтров, установленных в вашу версию PHP, - используйте функцию stream_get_filters. + Список установленных в конкретной версии PHP фильтров + возвращает функция stream_get_filters.
Строковые фильтры - Все эти фильтры служат для того самого, что подразумевают их - имена в соответствии с поведением встроенных в PHP функций для - работы со строками. - Для получения дополнительной информации о конкретном фильтре, - обратитесь к странице руководства соответствующей функции. + Каждый фильтр выполняет подразумеваемую + названием работу, которая соответствует поведению встроенных в PHP функций + для работы со строками. + Страницы руководства с описанием функций дают дополнительную информацию + о конкретном фильтре.
string.rot13 - Использование этого фильтра эквивалентно обработке всех данных потока + Работа фильтра эквивалентна обработке всех данных потока функцией str_rot13. @@ -57,11 +52,11 @@ ]]> @@ -70,7 +65,7 @@ fwrite($fp, "This is a test.\n");
string.toupper - Использование этого фильтра эквивалентно обработке всех данных потока + Работа фильтра эквивалентна обработке всех данных потока функцией strtoupper. @@ -78,11 +73,11 @@ fwrite($fp, "This is a test.\n"); ]]> @@ -91,7 +86,7 @@ fwrite($fp, "This is a test.\n");
string.tolower - Использование этого фильтра эквивалентно обработке всех данных потока + Работа фильтра эквивалентна обработке всех данных потока функцией strtolower. @@ -103,7 +98,6 @@ $fp = fopen('php://output', 'w'); stream_filter_append($fp, 'string.tolower'); fwrite($fp, "This is a test.\n"); /* Выведет: this is a test. */ -?> ]]> @@ -112,20 +106,19 @@ fwrite($fp, "This is a test.\n");
string.strip_tags - Использование этого фильтра эквивалентно обработке всех данных потока + Работа фильтра эквивалентна обработке всех данных потока функцией strip_tags. - Он принимает аргументы в одной из двух форм: - Либо в виде строки со списком тегов, как и второй аргумент функции + Фильтр принимает аргументы в одной из двух форм: + либо в виде строки со списком тегов, как и второй аргумент функции strip_tags, либо массив названий тегов. - - &warn.deprecated.feature-7-3-0; - + &warn.deprecated.feature-7-3-0; string.strip_tags "); fwrite($fp, "bolded text enlarged to a

level 1 heading

\n"); @@ -133,11 +126,10 @@ fclose($fp); /* Выведет: bolded text enlarged to a level 1 heading */ $fp = fopen('php://output', 'w'); -stream_filter_append($fp, 'string.strip_tags', STREAM_FILTER_WRITE, array('b','i','u')); +stream_filter_append($fp, 'string.strip_tags', STREAM_FILTER_WRITE, array('b', 'i', 'u')); fwrite($fp, "bolded text enlarged to a

level 1 heading

\n"); fclose($fp); /* Выведет: bolded text enlarged to a level 1 heading */ -?> ]]>
@@ -145,7 +137,7 @@ fclose($fp);
- Преобразовывающие фильтры + Преобразующие фильтры Как и фильтры string.*, фильтры convert.* совершают действия, @@ -157,26 +149,26 @@ fclose($fp);
convert.base64-encode и convert.base64-decode - Использование этих фильтров эквивалентно обработке всех данных потока - функциями base64_encode и - base64_decode соответственно. - convert.base64-encode поддерживает аргументы, переданные - в виде ассоциативного массива. Если указан аргумент - line-length, результат base64 будет разделён на - куски длинной line-length символов каждый. - Если указан аргумент line-break-chars, - каждый кусок будет разделён указанными символами. Эти параметры дают - такой же эффект, как и использование base64_encode - в паре с chunk_split. + Работа фильтров эквивалентна обработке всех данных потока + функциями base64_encode + и base64_decode соответственно. + Фильтр convert.base64-encode поддерживает аргументы, + которые передали как ассоциативный массив. С аргументом + line-length результат base64 разделится + на куски длинной line-length символов каждый. + С аргументом line-break-chars + каждый кусок разделяется заданными символами. Эффект этих параметров + аналогичен работе функции base64_encode + в паре с функцией chunk_split. - convert.base64-encode и - convert.base64-decode + Пример работы фильтров convert.base64-encode и convert.base64-decode ]]> @@ -206,33 +197,33 @@ fclose($fp);
convert.quoted-printable-encode и convert.quoted-printable-decode - Использование decode-версии этого фильтра эквивалентно обработке всех + Работа decode-версии этого фильтра эквивалентна обработке всех данных потока функцией quoted_printable_decode. У фильтра convert.quoted-printable-encode нет эквивалентной функции. - convert.quoted-printable-encode поддерживает аргументы, - переданные в виде ассоциативного массива. В дополнение к аргументам, - поддерживаемыми convert.base64-encode, - convert.quoted-printable-encode также поддерживает - boolean-аргументы binary и - force-encode-first. - convert.base64-decode поддерживает лишь аргумент - line-break-chars в качестве подсказки для - чистки закодированных данных. + Фильтр convert.quoted-printable-encode поддерживает аргументы, + которые передали как ассоциативный массив. В дополнение к аргументам, + которые поддерживает фильтр convert.base64-encode, + фильтр convert.quoted-printable-encode также поддерживает + boolean-аргументы binary + и force-encode-first. + Фильтр convert.base64-decode поддерживает только аргумент + line-break-chars как подсказку + для чистки закодированных данных. - convert.quoted-printable-encode & + Пример работы фильтров convert.quoted-printable-encode & convert.quoted-printable-decode ]]> @@ -246,8 +237,8 @@ fwrite($fp, "This is a test.\n"); аналогично обработке потоковых данных с помощью iconv. Эти фильтры не поддерживают параметров. Вместо этого ожидается, что исходная и целевая кодировки были заданы в имени фильтра таким образом: - convert.iconv.<input-encoding>.<output-encoding> или - convert.iconv.<input-encoding>/<output-encoding> + convert.iconv.<input-encoding>.<output-encoding> + или convert.iconv.<input-encoding>/<output-encoding> (оба варианта семантически эквивалентны). @@ -256,12 +247,12 @@ fwrite($fp, "This is a test.\n"); ]]> @@ -269,37 +260,36 @@ fclose($fp);
- Компрессионные фильтры + Фильтры сжатия - В то время, как Компрессионные - обёртки обеспечивают способ создания gzip- и bz2-совместимых - файлов в локальной файловой системе, они не предоставляют общих средств + Хотя обёртки сжатия + и создают gzip- и bz2-совместимые + файлы в локальной файловой системе, они не предоставляют общих средств для компрессии в сетевых потоках, как и не предоставляют средств - для создания потока без компрессии с последующим превращением в - компрессируемый. Для этих целей к любым потоковым ресурсам в любое время - могут применяться компрессионные фильтры. + для создания потока без компрессии с последующим превращением + в компрессируемый. Для этих целей к любым потоковым ресурсам в любое время + применяют фильтры сжатия. - Компрессионные фильтры не генерируют заголовков и - окончаний, которые используют утилиты командной строки, такие как - gzip. Они просто компрессируют (сжимают) и - декомпрессируют (разжимают) порции данных в компрессируемом потоке - данных. + Фильтры сжатия не генерируют заголовочных + и хвостовых блоков архива, которые создают утилиты командной строки наподобие + gzip. Фильтры сжатия только сжимают + и распаковывают порции данных в компрессируемом потоке данных.
zlib.deflate и zlib.inflate - zlib.deflate (компрессия) и - zlib.inflate (декомпрессия) являются реализациями + zlib.deflate (компрессия) + и zlib.inflate (декомпрессия) являются реализациями методов сжатия, описанных в RFC 1951. - Фильтр deflate принимает три аргумента, переданных в - виде ассоциативного массива. + Фильтр deflate принимает три аргумента, переданных + в виде ассоциативного массива. level определяет, какой уровень компрессии использовать (1-9). Повышение этого значения приведёт к уменьшению @@ -334,12 +324,13 @@ fclose($fp); - <literal>zlib.deflate</literal> и - <literal>zlib.inflate</literal> + <literal>zlib.deflate</literal> + и <literal>zlib.inflate</literal> 6, 'window' => 15, 'memory' => 9); $original_text = "This is a test.\nThis is only a test.\nThis is not an important string.\n"; @@ -365,23 +356,23 @@ This is only a test. This is not an important string. */ -?> ]]> - Упрощённое использование <literal>zlib.deflate</literal> + Упрощённая работа фильтра <literal>zlib.deflate</literal> ]]> @@ -403,15 +393,15 @@ echo "Сжатый файл размером " . filesize('test.deflated') . "
bzip2.compress и bzip2.decompress - bzip2.compress и - bzip2.decompress - работают точно так же, как и фильтры zlib, описанные выше. + Фильтры bzip2.compress + и bzip2.decompress + работают аналогично zlib-фильтрам, которые уже описывались. Фильтр bzip2.compress принимает два аргумента в виде элементов ассоциативного массива: blocks является целочисленным (integer) значением - в диапазоне от 1 до 9 и указывает на количество 100-килобайтовых блоков + в диапазоне от 1 до 9 и указывает на количество 100-килобайтных блоков памяти для резервирования в качестве рабочего пространства. work - это так же целочисленное (integer) значение @@ -438,12 +428,13 @@ echo "Сжатый файл размером " . filesize('test.deflated') . " - <literal>bzip2.compress</literal> и - <literal>bzip2.decompress</literal> + <literal>bzip2.compress</literal> + и <literal>bzip2.decompress</literal> 9, 'work' => 0); echo "Оригинальный файл размером " . filesize('LICENSE') . " байт.\n"; @@ -461,7 +452,6 @@ echo "Сжатый файл размером " . filesize('LICENSE.compressed') Сжатый файл размером 1488 байт. */ -?> ]]> @@ -477,16 +467,14 @@ echo "Сжатый файл размером " . filesize('LICENSE.compressed')
mcrypt.* и mdecrypt.* - - &warn.deprecated.feature-7-1-0; - + &warn.deprecated.feature-7-1-0; mcrypt.* и mdecrypt.* - обеспечивают симметричное шифрование и дешифрование при помощи - libmcrypt. Оба набора фильтров поддерживают те же алгоритмы, что и - модуль mcrypt в виде - mcrypt.ciphername, где - ciphername - это название шифра, как если + обеспечивают симметричное шифрование и дешифровку через библиотеку + libmcrypt. Оба набора фильтров поддерживают те же алгоритмы, + что и модуль mcrypt в виде + фильтра mcrypt.ciphername, + где ciphername — название шифра, как если бы оно передавалось функции mcrypt_module_open. Также доступны следующие пять параметров: @@ -539,142 +527,186 @@ echo "Сжатый файл размером " . filesize('LICENSE.compressed') - Шифрование/расшифровка используя Blowfish + Шифрование алгоритмом Blowfish и расшифровка 'cbc','iv'=>$iv, 'key'=>$key); +$opts = array('mode' => 'cbc', 'iv' => $iv, 'key' => $key); stream_filter_append($fp, 'mcrypt.blowfish', STREAM_FILTER_WRITE, $opts); fwrite($fp, 'message to encrypt'); fclose($fp); -//расшифровка... +// Расшифровка... $fp = fopen('encrypted-file.enc', 'rb'); $iv = fread($fp, $iv_size = mcrypt_get_iv_size(MCRYPT_BLOWFISH, MCRYPT_MODE_CBC)); -$opts = array('mode'=>'cbc','iv'=>$iv, 'key'=>$key); +$opts = array('mode' => 'cbc', 'iv' => $iv, 'key' => $key); stream_filter_append($fp, 'mdecrypt.blowfish', STREAM_FILTER_READ, $opts); -$data = rtrim(stream_get_contents($fp));//trims off null padding +$data = rtrim(stream_get_contents($fp)); //trims off null padding fclose($fp); echo $data; -?> ]]> - Шифрование файла с помощью AES-128 CBC с SHA256 HMAC + Шифрование файла алгоритмом SHA256 HMAC в режиме AES-128 CBC 16,'AES-192'=>24,'AES-256'=>32); - protected static function key_size() { return self::$KEY_SIZES['AES-128']; } //default AES-128 - public static function encryptFile($password, $input_stream, $aes_filename){ - $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC); - $fin = fopen($input_stream, "rb"); - $fc = fopen($aes_filename, "wb+"); - if (!empty($fin) && !empty($fc)) { - fwrite($fc, str_repeat("_", 32) );//placeholder, SHA256 HMAC will go here later - fwrite($fc, $hmac_salt = mcrypt_create_iv($iv_size, MCRYPT_DEV_URANDOM)); - fwrite($fc, $esalt = mcrypt_create_iv($iv_size, MCRYPT_DEV_URANDOM)); - fwrite($fc, $iv = mcrypt_create_iv($iv_size, MCRYPT_DEV_URANDOM)); - $ekey = hash_pbkdf2("sha256", $password, $esalt, $it=1000, self::key_size(), $raw=true); - $opts = array('mode'=>'cbc', 'iv'=>$iv, 'key'=>$ekey); - stream_filter_append($fc, 'mcrypt.rijndael-128', STREAM_FILTER_WRITE, $opts); - $infilesize = 0; - while (!feof($fin)) { - $block = fread($fin, 8192); - $infilesize+=strlen($block); - fwrite($fc, $block); - } - $block_size = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC); - $padding = $block_size - ($infilesize % $block_size);//$padding is a number from 1-16 - fwrite($fc, str_repeat(chr($padding), $padding) );//perform PKCS7 padding - fclose($fin); - fclose($fc); - $hmac_raw = self::calculate_hmac_after_32bytes($password, $hmac_salt, $aes_filename); - $fc = fopen($aes_filename, "rb+"); - fwrite($fc, $hmac_raw);//overwrite placeholder - fclose($fc); - } - } - public static function decryptFile($password, $aes_filename, $out_stream) { - $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC); - $hmac_raw = file_get_contents($aes_filename, false, NULL, 0, 32); - $hmac_salt = file_get_contents($aes_filename, false, NULL, 32, $iv_size); - $hmac_calc = self::calculate_hmac_after_32bytes($password, $hmac_salt, $aes_filename); - $fc = fopen($aes_filename, "rb"); - $fout = fopen($out_stream, 'wb'); - if (!empty($fout) && !empty($fc) && self::hash_equals($hmac_raw,$hmac_calc)) { - fread($fc, 32+$iv_size);//skip sha256 hmac and salt - $esalt = fread($fc, $iv_size); - $iv = fread($fc, $iv_size); - $ekey = hash_pbkdf2("sha256", $password, $esalt, $it=1000, self::key_size(), $raw=true); - $opts = array('mode'=>'cbc', 'iv'=>$iv, 'key'=>$ekey); - stream_filter_append($fc, 'mdecrypt.rijndael-128', STREAM_FILTER_READ, $opts); - while (!feof($fc)) { - $block = fread($fc, 8192); - if (feof($fc)) { - $padding = ord($block[strlen($block) - 1]);//assume PKCS7 padding - $block = substr($block, 0, 0-$padding); + protected static $KEY_SIZES = array('AES-128' => 16, 'AES-192' => 24, 'AES-256' => 32); + + protected static function key_size() + { + return self::$KEY_SIZES['AES-128']; + } // default AES-128 + + public static function encryptFile($password, $input_stream, $aes_filename) + { + $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC); + $fin = fopen($input_stream, "rb"); + $fc = fopen($aes_filename, "wb+"); + + if (!empty($fin) && !empty($fc)) { + fwrite($fc, str_repeat("_", 32)); //placeholder, SHA256 HMAC will go here later + fwrite($fc, $hmac_salt = mcrypt_create_iv($iv_size, MCRYPT_DEV_URANDOM)); + fwrite($fc, $esalt = mcrypt_create_iv($iv_size, MCRYPT_DEV_URANDOM)); + fwrite($fc, $iv = mcrypt_create_iv($iv_size, MCRYPT_DEV_URANDOM)); + $ekey = hash_pbkdf2("sha256", $password, $esalt, $it = 1000, self::key_size(), $raw = true); + $opts = array('mode' => 'cbc', 'iv' => $iv, 'key' => $ekey); + stream_filter_append($fc, 'mcrypt.rijndael-128', STREAM_FILTER_WRITE, $opts); + + $infilesize = 0; + while (!feof($fin)) { + $block = fread($fin, 8192); + $infilesize += strlen($block); + fwrite($fc, $block); + } + + $block_size = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC); + $padding = $block_size - ($infilesize % $block_size); //$padding is a number from 1-16 + fwrite($fc, str_repeat(chr($padding), $padding)); //perform PKCS7 padding + fclose($fin); + fclose($fc); + $hmac_raw = self::calculate_hmac_after_32bytes($password, $hmac_salt, $aes_filename); + $fc = fopen($aes_filename, "rb+"); + fwrite($fc, $hmac_raw); //overwrite placeholder + fclose($fc); + } + } + + public static function decryptFile($password, $aes_filename, $out_stream) + { + $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC); + $hmac_raw = file_get_contents($aes_filename, false, NULL, 0, 32); + $hmac_salt = file_get_contents($aes_filename, false, NULL, 32, $iv_size); + $hmac_calc = self::calculate_hmac_after_32bytes($password, $hmac_salt, $aes_filename); + $fc = fopen($aes_filename, "rb"); + $fout = fopen($out_stream, 'wb'); + + if (!empty($fout) && !empty($fc) && self::hash_equals($hmac_raw, $hmac_calc)) { + fread($fc, 32 + $iv_size); //skip sha256 hmac and salt + $esalt = fread($fc, $iv_size); + $iv = fread($fc, $iv_size); + $ekey = hash_pbkdf2("sha256", $password, $esalt, $it = 1000, self::key_size(), $raw = true); + $opts = array('mode' => 'cbc', 'iv' => $iv, 'key' => $ekey); + stream_filter_append($fc, 'mdecrypt.rijndael-128', STREAM_FILTER_READ, $opts); + + while (!feof($fc)) { + $block = fread($fc, 8192); + + if (feof($fc)) { + $padding = ord($block[strlen($block) - 1]); //assume PKCS7 padding + $block = substr($block, 0, 0 - $padding); + } + + fwrite($fout, $block); } - fwrite($fout, $block); - } - fclose($fout); - fclose($fc); - } - } - private static function hash_equals($str1, $str2) { - if(strlen($str1) == strlen($str2)) { - $res = $str1 ^ $str2; - for($ret=0,$i = strlen($res) - 1; $i >= 0; $i--) $ret |= ord($res[$i]); - return !$ret; - } - return false; - } - private static function calculate_hmac_after_32bytes($password, $hsalt, $filename) { - static $init=0; - $init or $init = stream_filter_register("user-filter.skipfirst32bytes", "FileSkip32Bytes"); - $stream = 'php://filter/read=user-filter.skipfirst32bytes/resource=' . $filename; - $hkey = hash_pbkdf2("sha256", $password, $hsalt, $iterations=1000, 24, $raw=true); - return hash_hmac_file('sha256', $stream, $hkey, $raw=true); - } + + fclose($fout); + fclose($fc); + } + } + + private static function hash_equals($str1, $str2) + { + if (strlen($str1) == strlen($str2)) { + $res = $str1 ^ $str2; + for ($ret = 0, $i = strlen($res) - 1; $i >= 0; $i--) $ret |= ord($res[$i]); + return !$ret; + } + + return false; + } + + private static function calculate_hmac_after_32bytes($password, $hsalt, $filename) + { + static $init = 0; + $init or $init = stream_filter_register("user-filter.skipfirst32bytes", "FileSkip32Bytes"); + $stream = 'php://filter/read=user-filter.skipfirst32bytes/resource=' . $filename; + $hkey = hash_pbkdf2("sha256", $password, $hsalt, $iterations = 1000, 24, $raw = true); + + return hash_hmac_file('sha256', $stream, $hkey, $raw = true); + } } + class FileSkip32Bytes extends php_user_filter { - private $skipped=0; - function filter($in, $out, &$consumed, $closing) { - while ($bucket = stream_bucket_make_writeable($in)) { - $outlen = $bucket->datalen; - if ($this->skipped<32){ - $outlen = min($bucket->datalen,32-$this->skipped); - $bucket->data = substr($bucket->data, $outlen); - $bucket->datalen = $bucket->datalen-$outlen; - $this->skipped+=$outlen; - } - $consumed += $outlen; - stream_bucket_append($out, $bucket); - } - return PSFS_PASS_ON; - } + private $skipped = 0; + + function filter($in, $out, &$consumed, $closing) + { + while ($bucket = stream_bucket_make_writeable($in)) { + $outlen = $bucket->datalen; + + if ($this->skipped < 32) { + $outlen = min($bucket->datalen, 32 - $this->skipped); + $bucket->data = substr($bucket->data, $outlen); + $bucket->datalen = $bucket->datalen - $outlen; + $this->skipped += $outlen; + } + + $consumed += $outlen; + stream_bucket_append($out, $bucket); + } + + return PSFS_PASS_ON; + } } -class AES_128_CBC extends AES_CBC { - protected static function key_size() { return self::$KEY_SIZES['AES-128']; } + +class AES_128_CBC extends AES_CBC +{ + protected static function key_size() + { + return self::$KEY_SIZES['AES-128']; + } } -class AES_192_CBC extends AES_CBC { - protected static function key_size() { return self::$KEY_SIZES['AES-192']; } + +class AES_192_CBC extends AES_CBC +{ + protected static function key_size() + { + return self::$KEY_SIZES['AES-192']; + } } -class AES_256_CBC extends AES_CBC { - protected static function key_size() { return self::$KEY_SIZES['AES-256']; } + +class AES_256_CBC extends AES_CBC +{ + protected static function key_size() + { + return self::$KEY_SIZES['AES-256']; + } } ]]> diff --git a/language/types/null.xml b/language/types/null.xml index fc203373c..8d5a72c1a 100644 --- a/language/types/null.xml +++ b/language/types/null.xml @@ -1,5 +1,5 @@ - + NULL @@ -37,9 +37,7 @@ $var = NULL; Приведение к &null; - - &warn.deprecated.feature-7-2-0.removed-8-0-0; - + &warn.deprecated.feature-7-2-0.removed-8-0-0; Приведение переменной к null через выражение (unset) $var diff --git a/reference/info/constants.xml b/reference/info/constants.xml index f9d2e4ccd..0801d23c5 100644 --- a/reference/info/constants.xml +++ b/reference/info/constants.xml @@ -1,5 +1,5 @@ - + &reftitle.constants; @@ -269,8 +269,8 @@ Включает оценку утверждения, которую выполняет функция assert. - &warn.deprecated.feature-8-3-0; + &warn.deprecated.feature-8-3-0; @@ -281,8 +281,8 @@ Callback-функция, которая вызывается, если утверждение не прошло проверку. - &warn.deprecated.feature-8-3-0; + &warn.deprecated.feature-8-3-0; @@ -293,8 +293,8 @@ Прерывает выполнение, если утверждение не прошло проверку. - &warn.deprecated.feature-8-3-0; + &warn.deprecated.feature-8-3-0; @@ -306,8 +306,8 @@ Указывает, выбрасывать ли исключение AssertionError для каждого утверждения, которое не прошло проверку. - &warn.deprecated.feature-8-3-0; + &warn.deprecated.feature-8-3-0; @@ -318,8 +318,8 @@ Указывает, выдавать ли PHP-предупреждение для каждого утверждения, которое не прошло проверку. - &warn.deprecated.feature-8-3-0; + &warn.deprecated.feature-8-3-0; diff --git a/reference/mbstring/overloading.xml b/reference/mbstring/overloading.xml index b37af7927..5c679cb4f 100644 --- a/reference/mbstring/overloading.xml +++ b/reference/mbstring/overloading.xml @@ -1,42 +1,41 @@ - + Механизм перегрузки функций - &warn.deprecated.feature-7-2-0.removed-8-0-0; - Зачастую заставить работать существующее PHP-приложение в многобайтовом - окружении оказывается довольно трудной задачей. Это происходит, потому что - большинство PHP-приложений написано с использованием стандартных функций - обработки строк, таких как substr, которые не умеют + окружении становится трудоёмкой задачей. Причина состоит в том, + что большую часть PHP-приложений написали со стандартными функциями + обработки строк наподобие substr, которые не умеют работать со строками в многобайтовых кодировках. - mbstring поддерживает механизм 'перегрузки функций', который позволяет - сообщить приложению о том, что используется многобайтовая кодировка, без - модификации кода, отвечающего за работу со строками. Например, если включена - перегрузка функций, то функция mb_substr будет вызываться - вместо substr. Этот механизм во многих случаях позволяет - портировать приложения, поддерживающие только однобайтовые кодировки, в - многобайтное окружение. + Модуль mbstring поддерживает механизм «перегрузки функций», + который сообщает приложению о работе с многобайтовой кодировкой, + без модификации кода, который отвечает за работу со строками. Например, при включении + перегрузки функций вместо функции substr + вызывается функция mb_substr. + Этот механизм часто помогает + переносить в многобайтовое окружение приложения, + которые поддерживают только однобайтовые кодировки. - Для использования механизма перегрузки функций нужно задать настройке + Для активации механизма перегрузки функций потребуется задать настройке mbstring.func_overload в &php.ini; положительное значение, - которое представляет собой комбинацию битовых масок, определяющих категории - функций, которые нужно перегружать. Это будет число 1 для перегрузки функции - mail. 2 для строковых функций, 4 для функций регулярных - выражений. Например, если значение настройки равно 7, то почтовые, строковые и - функции регулярных выражений будут перегружаться. Список перегружаемых функций + которое представляет собой комбинацию битовых масок для определения категорий + функций, которые требуется перегружать. Число 1 перегружает функции + mail, 2 — строковые функции, 4 — функций регулярных + выражений. Например, если значение настройки равно 7, то почтовые, строковые + и функции регулярных выражений станут перегружаться. Список перегружаемых функций приведён ниже. - Функции, которые будут перегружены + Функции, которые перегрузятся @@ -117,9 +116,9 @@ - Не рекомендуется использовать перегрузку функций в контексте - каждой директории, так как добиться стабильной работы в этом случае пока - не удалось, и это может привести к неожидаемому поведению приложения. + Не рекомендуется включать перегрузку функций в контексте + каждой директории, так как добиться стабильной работы в такой конфигурации пока + не получилось, а поведение приложения становится неожиданным.