информационных технологий» 5 глава
Пример условно определяемой функции: if($OS_TYPE=="win") { // Функция-заглушка function MyChOwn($fname,$attr) { // ничего не делает return 1; } } else { // Передаем вызов настоящей chown() function MyChOwn($fname,$attr) { return chown($fname,$attr); } } Если работаем под Windows, функция MyChOwn() ничего не делает и возвращает 1 как индикатор успеха, в то время как для Unix она просто вызывает оригинальную chown(). 7.4 Передача функций по ссылке и возврат функцией ссылки Передача функций «по ссылке». Как таковая, передача функции по ссылке в PHP не поддерживается. Однако, т. к. это слишком часто может быть полезным, в PHP есть понятие «функциональной переменной». Пример: function A($i) { echo "a $i\n"; } function B($i) { echo "b $i\n"; } function C($i) { echo "c $i\n"; } $F="A"; // или $F="B" или $F="C" $F(10); // вызов функции, имя которой хранится в $F В PHP есть такая стандартная функция – uasort(), которая сортирует ассоциативный массив, заданный ее первым параметром, причем критерием сравнения для элементов этого массива служит функция, имя которой передано вторым параметром. Пример: // Сравнение без учета регистра символов строк function FCmp($a,$b) { return strcmp(tolower($a),tolower($b)) } $a=array("b"=>"bbb", "a"=>"Aaa", "d"=>"ddd); uasort($a,"FCmp"); // Сортировка без учета регистра символов Здесь функция, имя которой получено со вторым параметром uasort(), должна иметь два аргумента, которые являются сравниваемыми значениями в массиве. В общем случае, функциональная переменная – это всего лишь переменная-строка, содержащая имя функции. Поскольку в PHP нет такого понятия, как области видимости для функций (есть только области видимости для локальных переменных), то конфликтов это не порождает – одному имени может соответствовать не более одной функции. Такой подход не очень хорош, но он действительно работает.
Возврат функцией ссылки. До сих пор рассматривались функции, которые возвращают определенные значения – а именно, копии величин, использованных в инструкции return (это были именно копии, а не сами объекты). Пример: $a=100; function R() { global $a; // объявляет $a глобальной return $a; // возвращает значение, а не ссылку! } $b=R(); $b=0; // присваивает $b, а не $a! echo $a; // выводит 100 Пусть необходимо, чтобы функция R() возвращала не величину, а ссылку на переменную $a, чтобы в дальнейшем с этой ссылкой можно было работать точно так же, как и с $a. Использование оператора $b=&R() не подходит, т. к. при этом мы получим в $b ссылку не на $a, а на ее копию. Если задействовать return &$a, то появится сообщение о синтаксической ошибке (PHP воспринимает & только в правой части оператора присваивания сразу после знака =). Специальный синтаксис описания функции, возвращающей ссылку: $a=100; function &R() // & — возвращает ссылку { global $a; // объявляет $a глобальной return $a; // возвращает значение, а не ссылку! } $b=&R(); // не забудьте &!!! $b=0; // присваивает переменной $a! echo $a; // выводит 0. Это значит, что теперь $b — синоним $a Нужно поставить & в двух местах: перед определением имени функции, а также в правой части оператора присваивания при вызове функции. Использовать амперсанд в инструкции return не нужно.
Тема 8 Строковые функции
8.1 Функции работы со строками 8.2 Работа с блоками текста
8.1 Функции работы со строками Строки в PHP – одни из самых универсальных объектов. Любой объект можно упаковать в строку. Строка может содержать любые символы с кодами от 0 до 255 включительно. Нет специального маркера «конца строки», длина строки во внутреннем представлении PHP хранится отдельно. Для формирования и вставки непечатаемого символа в строку используется функция chr(). Из-за слабого контроля типов в PHP строка может содержать число, причем с ней можно работать, как с числом: прибавлять другие числа, умножать и т. д. При этом все преобразования (в десятичной системе) производятся автоматически. Существуют функции, преобразующие число, записанное в различных системах счисления в обычное представление, и наоборот.
Конкатенация строк. Конкатенация – это присоединение к одной строке другой. Оператор + следует применять только для сложения чисел. Для конкатенации строк используется специальный оператор «.» (точка). Оператор «.» всегда воспринимает свои операнды как строки и возвращает строку. В случае, если один из операндов не может быть переведен в строковое представление, т. е. если это массив или объект, то он воспринимается как строки array и object соответственно. Это правило применимо и не только при сцеплении строк, но и при передаче такого операнда в какую-нибудь стандартную функцию, которой требуется строка. Пример: $a=array(10,20,30); echo $a // Неожиданный результат «array»! Есть и другой, более специализированный, способ конкатенации строк. Он обычно используется, когда значения строковых или числовых переменных перемежаются с обычными словами. Если, к примеру, в $day хранится текущее число, в $month – название месяца и в $year – год, то вывести строку вида «Сегодня 8 мая 2000 года» можно так: echo "Сегодня $day $month $year года"; При этом в строку, вырабатываемую инструкцией echo, автоматически в нужных местах вставятся значения переменных. Сравнение строк и инструкции if-else. Рассмотрим одно тонкое место в интерпретаторе PHP, касающееся немного неправильной работы со строками. Заключается оно в следующем: если используются операторы сравнения == и!= (или любые другие, которые могут потребовать перевода строки в число) с операндами-строками, то результат, не всегда оказывается верным. Примеры: $one=1 // число один $zero=0 // присваиваем число ноль if($one=="") echo 1 // очевидно, не равно – не выводит 1 if($zero=="") echo 3 // Вопреки ожиданиям печатает 3! if(""==$zero) echo 4 // И это тоже не поможет!.. if("$zero"=="") echo 5 // Не работает в некоторых версиях PHP 3 if(strval($zero)=="") echo 6; // Теперь правильно – не выводит 6 if($zero==="") echo 7 // Самый лучший способ, но не действует в PHP 3 В операциях сравнения пустая строка "" прежде всего трактуется как 0 (ноль) и уж затем – как «пусто»! Операнды сравниваются как строки только в том случае, если они оба – строки, в противном случае идет числовое сравнение. При этом пустая строка воспринимается как 0, как и любая другая, которую интерпретатору не уда лось перевести в число.
При сравнении двух переменных-строк, нужно быть абсолютно уверенными, что их типы именно строковые, а не числовые. Это не распространяется на оператор === (оператор эквивалентности). Его использование заставляет интерпретатор всегда сравнивать величины и по значению, и по их типу. С точки зрения PHP 0=="", но 0!==="". Нужно всегда использовать === вместо strval()! Существует одна стандартная ошибка, которая состоит в использовании функция strpos($str,$what), которая возвращает позицию подстроки $what в строке $str или false, если подстрока не найдена. Пусть нужно проверить, встречается ли в строке $str подстрока <? (и напечатать «это PHP-программа», если встречается). Вариант if(strpos($str,"<?")!=false) echo "это PHP-программа"; не годится, если <? находится в самом начале строки (в этом случае не будет выдано сообщение, хотя подстрока в найдена, и функция возвратила 0, а не false). Вместо проверки на неравенство, нужно проверять на неэквивалентность: if(strpos($str,"<?")!===false) echo "это PHP-программа"; Оператор!=== используется с константой false, а не с пустой строкой "". Для оператора false!==="", в то время как, false=="". Функции для работы с одиночными символами: · string chr(int $code) Возвращает строку из одного символа с кодом $code. Эта функция используется для вставки непечатаемых символов в строку – например, кода нуля или символа прогона страницы, а также при работе с бинарными файлами. · int ord(char $ch) Функция возвращает код символа $ch. · int strrpos(string $where, char $what) Функция ищет в строке $where последнюю позицию, в которой встречается символ $what (если $what – строка из нескольких символов, то выявляется только первый из них, остальные не играют никакой роли!). В случае, если искомый символ не найден, возвращается false
Функции отрезания пробелов: · string trim(string $st) Функция возвращает копию $st, только с удаленными ведущими и концевыми пробельными символами. Под пробельными символами здесь и далее подразумеваются: пробел " ", символ перевода строки \n, символ возврата каретки \r и символ табуляции \t. Например, вызов trim(" test\n ") вернет строку "test". · string ltrim(string $st) Аналогична функции trim(), только удаляет исключительно ведущие пробелы, а концевые не трогает. · string chop(string $st) Удаляет только концевые пробелы, ведущие не трогает. Базовые функции: · int strlen(string $st) Возвращает длину строки $st. · int strpos(string $where, string $what, int $fromwhere=0) Пытается найти в строке $where подстроку (то есть последовательность символов) $what и в случае успеха возвращает позицию (индекс) этой подстроки в строке. Первый символ строки имеет индекс 0. Необязательный параметр $fromwhere можно задавать, если поиск нужно вести не с начала строки $from, а с какой-то другой позиции. В этом случае следует эту позицию передать в $fromwhere. Если подстроку найти не удалось, функция возвращает false. Проверяя результат вызова strpos() на false нужно использовать только оператор ===. · string substr(string $str, int $from [,int $length]) Функция возвращает участок строки $str, начиная с позиции $start и длиной $length. Если $length не задана, то подразумевается подстрока от $start до конца строки $str. Если $start больше, чем длина строки, или же значение $length равно нулю, то возвращается пустая подстрока. Если передать в $start отрицательное число, то будет считаться, что это число является индексом подстроки, но только отсчитываемым от конца $str (например, -1 означает «начиная с последнего символа строки»). Параметр $length, если он задан, тоже может быть отрицательным. В этом случае последним символом возвращенной подстроки будет символ из $str с индексом $length, определяемым от конца строки. · int strcmp(string $str1, string $str2) Сравнивает две строки посимвольно (точнее, побайтово) и возвращает: 0, если строки полностью совпадают; -1, если строка $str1 лексикографически меньше $str2; и 1, если, наоборот, $str1 «больше» $str2. Так как сравнение идет побайтово, то регистр символов влияет на результаты сравнений. · int strcasecmp(string $str1, string $str2) Аналогична strcmp(), только при работе не учитывается регистр букв. С точки зрения этой функции "ab" и "AB" равны. 8.2 Работа с блоками текста · string str_replace(string $from, string $to, string $str) Заменяет в строке $str все вхождения подстроки $from (с учетом регистра) на $to и возвращает результат. Исходная строка, переданная третьим параметром, при этом не меняется. Пример замены всех символов перевода строки на их HTML- эквивалент – тэг <br>: $st=str_replace("\n","<br>\n",$st)
То, что в строке <br>\n тоже есть символ перевода строки, никак не влияет на работу функции, т. е. функция производит лишь однократный проход по строке. · string nl2br(string $string) Заменяет в строке все символы новой строки \n на <br>\n и возвращает результат. Исходная строка не изменяется. Символы \r, которые присутствуют в конце строки текстовых файлов Windows, этой функцией никак не учитываются, а потому остаются на старом месте. · string WordWrap(string $st, int $width=75, string $break="\n") Функция разбивает блок текста $st на несколько строк, завершаемых символами $break, так, чтобы на одной строке было не более $width букв. Разбиение происходит по границе слова, так что текст остается читаемым. Возвращается получившаяся строка с символами перевода строки, заданными в $break. Пример форматирования текста по ширине поля 60 символов, предварив каждую строку префиксом ">": function Cite($OurText, $prefix="> ") { $st=WordWrap($OurText, 60-strlen($prefix), "\n"); $st=$prefix.str_replace("\n","\n$prefix",$st); return $st; } · string strip_tags (string $str [, string $allowable_tags]) Функция удаляет из строки все тэги и возвращает результат. В параметре $allowable_tags можно передать тэги, которые не следует удалять из строки. Они должны перечисляться вплотную друг к другу. Пример: $st=" <b>Жирный текст</b> <tt>Моноширинный текст</tt> <a href=http://www.dklab.ru>Ссылка</a>"; echo "Исходный текст: $st"; echo "<hr>После удаления тэгов: ".strip_tags($st,"<a><b>")."<hr>"; Тэги <a> и <b> не были удалены (ровно как и их парные закрывающие), в то время как <tt> исчез. · string str_repeat(string $st, string $number) Функция «повторяет» строку $st $number раз и возвращает объединенный результат. Пример: echo str_repeat("test!",3); // выводит test!test!test! Функции для преобразований символов: · string strtr(string $str, string $from, string $to) Функция в строке $str заменяет все символы, встречающиеся в $from, на их «парные» (то есть расположенные в тех же позициях, что и во $from) из $to. · string UrlEncode(string $st) Функция URL-кодирует строку $st и возвращает результат. Эту функцию удобно применять, если нужно динамически сформировать ссылку <a href=...> на какой-то сценарий, но не уверены, что его параметры содержат только алфавитно-цифровые символы. Пример: echo "<a href=/script.php?param=".UrlEncode($UserData); Если переменная $UserData включает символы =, & или даже пробелы, все равно сценарию будут переданы корректные данные. · string UrlDecode(string $st) Производит URL-декодирование строки. Используется редко, т.к. PHP и так умеет перекодировать входные данные автоматически. · string RawUrlEncode(string $st) Почти полностью аналогична UrlEncode(), но только пробелы не преобразуются в +, как это делается при передаче данных из формы, а воспринимаются как обычные неалфавитно-цифровые символы. · string RawUrlDecode(string $st) Аналогична UrlDecode(), но не воспринимает + как пробел. · string HtmlSpecialChars(string $str) Заменяет в строке символы: &, <, >, кавычки на их HTML-эквиваленты, так, чтобы они выглядели на странице «самими собой». Пример применения этой функции – формирование параметра value в элементах формы, чтобы не было проблем с кавычками, или вывод сообщения в гостевой книге, если вставлять тэги пользователю запрещено. Пусть содержимое книги хранится в массиве $Book. Пример печати содержимого гостевой книги, чтобы тэги не воспринимались браузером как описания форматирования: <?foreach($Book as $k=>$v) {?> Имя: <?=$v['name']?><br> Текст: <?=HtmlSpecialChars($v['text'])?> <hr> <?}?> · string StripSlashes(string $st) Заменяет в строке $st некоторые предваренные слэшем символы на их однокодовые эквиваленты. Это относится к символам: ", ', \. · string AddSlashes(string $st) Вставляет слэши только перед символами: ', " и \. Функции изменения регистра: · string strtolower(string $str) Преобразует строку в нижний регистр. · string strtoupper(string $str) Переводит строку в верхний регистр. Функции форматных преобразований. Переменные в строках PHP интерполируются, поэтому практически всегда задача «смешивания» текста со значениями переменных не является проблемой: echo "Привет, $name! Вам $age лет."; Язык PHP поддерживает ряд функций, использующих такой же синтаксис, как и их Си-эквиваленты. · string sprintf(string $format [, mixed args,...]) Функция возвращает строку, составленную на основе строки форматирования, содержащей некоторые специальные символы, которые будут впоследствии заменены на значения соответствующих переменных из списка аргументов. Строка форматирования $format может включать в себя команды форматирования, предваренные символом %. Все остальные символы копируются в выходную строку как есть. Каждый спецификатор формата (то есть, символ % и следующие за ним ко- манды) соответствует одному параметру, указанному после параметра $format. Если нужно поместить в текст % как обычный символ, необходимо его удвоить: echo sprintf("Значение %d%%",$d); Каждый спецификатор формата включает максимум пять элементов (в порядке их следования после символа %): · Необязательный спецификатор размера поля, который указывает, сколько символов будет отведено под выводимую величину. В качестве символов-заполнителей (если значение имеет меньший размер, чем размер поля для его вывода) может использоваться пробел или 0, по умолчанию подставляется пробел. Можно задать любой другой символ-наполнитель, если указать его в строке форматирования, предварив апострофом '. · Опциональный спецификатор выравнивания, определяющий, будет результат выровнен по правому или по левому краю поля. По умолчанию производится выравнивание по правому краю, однако можно указать и левое выравнивание, задав символ - (минус). · Необязательное число, определяющее размер поля для вывода величины. Если результат не будет в поле помещаться, то он «вылезет» за края этого поля, но не будет усечен. · Необязательное число, предваренное точкой ".", предписывающее, сколько знаков после запятой будет в результирующей строке. Этот спецификатор учитывается только в том случае, если происходит вывод числа с плавающей точкой, в противном случае он игнорируется. · Обязательный спецификатор типа величины, которая будет помещена в выходную строку: b – очередной аргумент из списка выводится как двоичное целое число; c – выводится символ с указанным в аргументе кодом; d – целое число; f – число с плавающей точкой; o – восьмеричное целое число; s – строка символов; x – шестнадцатеричное целое число с маленькими буквами a–z; X – шестнадцатеричное число с большими буквами A–Z. Примеры: $money1 = 68.75; $money2 = 54.35; $money = $money1 + $money2; // echo $money выведет "123.1"... $formatted = sprintf ("%01.2f", $money); // echo $formatted выведет "123.10"! // вывода целого числа, предваренного нужным количеством нулей: $isodate=sprintf("%04d-%02d-%02d", $year, $month, $day); · void printf(string $format [, mixed args,...]) Делает то же, что и sprintf(), только результирующая строка не возвращается, а направляется в браузер пользователя. · string number_format(float $number, int $decimals, string $dec_point=".", string $thousands_sep=","); Функция форматирует число с плавающей точкой с разделением его на триады с указанной точностью. Она может быть вызвана с двумя или четырьмя аргументами, но не с тремя! Параметр $decimals задает, сколько цифр после запятой должно быть у числа в выходной строке. Параметр $dec_point представляет собой разделитель целой и дробной частей, а параметр $thousands_sep – разделитель триад в числе (если указать на его месте пустую строку, то триады не отделяются друг от друга). В PHP существует еще несколько функций для выполнения форматных преобразований, среди них – sscanf() и fscanf(), которые часто применяются в Си. Работа с бинарными данными. Строки могут содержать любые, в том числе и бинарные, данные (то есть, символы с кодами, меньшими 32). Для работы с такими строками иногда удобно использовать функции pack() и unpack(). · string pack(string $format [,mixed $args,...]) Функция pack() упаковывает заданные аргументы в бинарную строку. Формат параметров, а также их количество, задается при помощи строки $format, которая представляет собой набор однобуквенных спецификаторов форматирования – наподобие тех, которые указываются в sprintf(), но только без знака %. После каждого спецификатора может стоять число, которое отмечает, сколько информации будет обработано данным спецификатором. А именно, для форматов a, A, h и H число задает, какое количество символов будет помещено в бинарную строку из тех, что находятся в очередном параметре-строке при вызове функции (то есть, определяется размер поля для вывода строки). В случае @ оно определяет абсолютную позицию, в которую будут помещены следующие данные. Для всех остальных спецификаторов следующие за ними числа задают количество аргументов, на которые распространяется действие данного формата. Вместо числа можно указать *, в этом случае подразумевается, что спецификатор действует на все оставшиеся данные. Список спецификаторов формата: a – строка, свободные места в поле заполняются символом с кодом 0; A – строка, свободные места заполняются пробелами; h – шестнадцатеричная строка, младшие разряды в начале; H – шестнадцатеричная строка, старшие разряды в начале; c – знаковый байт (символ); C – беззнаковый байт; s – знаковое короткое целое (16 бит); S – беззнаковое короткое целое; n – беззнаковое целое (16 битов, старшие разряды в конце); v – беззнаковое целое (16 битов, младшие разряды в конце); i – знаковое целое; I – беззнаковое целое; l – знаковое длинное целое; L – беззнаковое длинное целое; N – беззнаковое длинное целое; V – беззнаковое целое (32 бита, младшие разряды в конце); f – число с плавающей точкой; d – число с плавающей точкой двойной точности; x – символ с нулевым кодом; X – возврат назад на 1 байт; @ –заполнение нулевым кодом до заданной абсолютной позиции. Пример: // Целое, целое, все остальное – символы $bindata = pack("nvc*", 0x1234, 0x5678, 65, 66); В строке $bindata будет содержаться 6 байтов в такой последовательности: 0x12, 0x34, 0x78, 0x56, 0x41, 0x42 (в шестнадцатеричной системе счисления). · array unpack(string $format, string $data) Функция распаковывает строку $data, пользуясь информацией о формате $format. Возвращает она ассоциативный массив, содержащий элементы распакованных данных. В строке $format после каждого спецификатора (или после завершающего его числа) должно «впритык» следовать имя ключа в ассоциативном массиве. Разделяются параметры при помощи символа /. Пример: $array=unpack("c2chars/nint", $bindata); В результирующий массив будут записаны элементы с ключами: chars1, chars2 и int. Если после спецификатора задано число, то к имени ключа будут добавлены номера 1, 2 и т. д., т. е. в массиве появятся несколько ключей, отличающихся суффиксами. Хэш-функции · string md5(string $st) Возвращает хэш-код строки $st, основанный на алгоритме корпорации RSA Data Security под названием «MD5 Message-Digest Algorithm». Хэш-код – это строка, практически уникальная для каждой из строк $st. То есть вероятность того, что две разные строки, переданные в $st, дадут нам одинаковый хэш-код, стремится к нулю. Если длина строки $st может достигать нескольких тысяч символов, то ее MD5-код занимает максимум 32 символа. Хэш-код и алгоритм MD5 используется для проверки паролей на истинность. Пусть, например, есть система со многими пользователями, каждый из которых имеет свой пароль. Можно хранить все пароли в обычном виде, или зашифровать их каким-нибудь способом, но тогда велика вероятность того, что этот файл с паролями украдут. Если пароли были зашифрованы, то, зная метод шифрования, не составит особого труда их раскодировать. Однако можно поступить другим способом, при использовании которого даже если файл с паролями украдут, расшифровать его будет математически невозможно. Сделаем так: в файле паролей будем хранить не сами пароли, а их (MD5) хэш-коды. При попытке какого-либо пользователя войти в систему мы вычислим хэш-код только что введенного им пароля и сравним его с тем, который записан у нас в базе данных. Если коды совпадут, значит, все в порядке, а если нет – что ж, извините... При вычислении хэш-кода какая-то часть информации о строке $st безвозвратно теряется. И именно это позволяет не опасаться, что файл паролей можно расшифровать. Ведь в нем нет самих паролей, нет даже их каких-то связных частей! Алгоритм MD5 специально был изобретен для того, чтобы обеспечить описанную выше схему. Так как все же есть вероятность того, что у разных строк MD5-коды совпадут, то, чтобы не дать возможность войти в систему, перебирая пароли с бешеной скоростью, алгоритм MD5 работает довольно медленно. И его нельзя никак убыстрить, потому что это будет уже не MD5. Так что даже на самых мощных компьютерах вряд ли получится перебирать более нескольких тысяч паролей в секунду, а это совсем маленькая скорость. · int crc32(string $str) Функция вычисляет 32-битную контрольную сумму строки $str. То есть, результат ее работы – 32-битное (4-байтовое) целое число. Эта функция работает гораздо быстрее md5(), но в то же время выдает гораздо менее надежные «хэш-коды» для строки. Алгоритм crc32 имеет неизмеримо большую предсказуемость, чем MD5. · string crypt(string $str [,string $salt]) Алгоритм шифрования DES до недавнего времени был стандартным для всех версий Unix и использовался для кодирования паролей пользователей (тем же самым способом, о котором мы говорили при рассмотрении функции md5()). Но в последнее время MD5 постепенно начал его вытеснять. Хэш-код для одной и той же строки, но с различными значениями $salt (это должна быть обязательно двухсимвольная строка) дает разные результаты. Если параметр $salt пропущен, PHP сгенерирует его случайным образом: $st="This is the test"; echo crypt($st)."<br>"; // можем получить, например, 7N8JKLKbBWEhg echo crypt($st)."<br>"; // а здесь появится, например, Jsk746pawBOA2 Два одинаковых вызова crypt() без второго параметра выдают совершенно разные хэш-коды. Сброс буфера вывода · void flush() Функция отправляет содержимое буфера echo в браузер пользователя. Обычно при использовании echo данные не прямо сразу отправляются клиенту, а накапливаются в специальном буфере, чтобы потом транспортироваться большой «пачкой». Так получается быстрее. Однако, иногда бывает нужно досрочно отправить все данные из буфера пользователю, например, если что-то выводится в реальном времени. Тема 9 Математические функции
9.1 Встроенные константы 9.2 Встроенные функции
9.1 Встроенные константы В PHP представлен полный набор математических функций. Встроенные констнты приведены в таблице 9.1. Таблица 9.1 – Встроенные константы
Воспользуйтесь поиском по сайту: ©2015 - 2025 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|