- •Пособие по работе в среде программирования php 4
- •1.Установка php
- •Настройка Apache для работы с php
- •Тестирование php
- •Установка дополнительных модулей
- •2. Характеристика языка php
- •Интерпретатор или компилятор?
- •Достоинства и недостатки интерпретатора
- •Использование php в Web
- •3. Переменные, константы, выражения
- •Переменные
- •Integer
- •Действия с переменными
- •1.Присвоение значения.
- •2.Проверка существования.
- •3.Уничтожение.
- •4.Определение типа переменной.
- •Константы
- •Выражения
- •Операции
- •4. Работа с данными формы
- •5. Конструкции языка
- •6. Ассоциативные массивы
- •Операции над массивами
- •1.Одинаковые ключи
- •2.Нулевой ключ
- •7. Функции и области видимости
- •8. Строковые функции
- •9. Работа с массивами
- •10. Математические функции
- •11. Работа с файлами
- •12. Работа с каталогами
- •13. Каналы и символические ссылки
10. Математические функции
В PHP представлен полный набор математических функций, которые присутствуют в большинстве других языков программирования. Правда, здесь они используются несколько реже, потому что в сценаиях вообще редко приходится иметь дело со сложными вычислениями.
Встроенные константы
PHP версии 4 предлагает нам несколько предопределенных констант, которые обозначают различные математические постоянные с максимальной машинной точностью. Соответствующие этим константам ключевые слова и значения приводятся в табл. .2.
Таблица 2. Математические константы.
Константа |
Величина |
Пояснение |
M_PI |
3,14159265358979323846 |
Число π |
M_E |
2,7182818284590452354 |
Е |
M_LOG2E |
1,4426950408889634074 |
Log2(e) |
M_LOG10E |
0,43429448190325182765 |
Lg(e) |
M_LN2 |
0,69314718055994530942 |
Ln(2) |
M_LN10 |
2,30258509299404568402 |
Ln(10) |
M_PI_2 |
1,57079632679489661923 |
π /2 |
M_PI_4 |
0,78539816339744830962 |
π /4 |
M_1_PI |
0,31830988618379067154 |
1/π |
M_2_PI |
0,63661977236758134308 |
2/π |
M_SQRTPI |
1,77245385090551602729 |
sqrt(π) |
M_2_SQRTPI |
1,12837916709551257390 |
2/sqrt(π) |
M_SQRT2 |
1,41421356237309504880 |
sqrt(2) |
M_SQRT3 |
1,73205080756887729352 |
sqrt(3) |
M_SQRT1_2 |
0,70710678118654752440 |
1/sqrt(2) |
M_LNPI |
1,14472988584940017414 |
Ln(π) |
M_EULER |
0,57721566490153286061 |
Постоянная Эйлера |
Надо заметить, разработчики PHP что-то слишком разошлись, когда вводили стандартные константы. Например, я не могу даже и представить, зачем в Web-программировании может потребоваться, например, константа Эйлера. Что же, это их право….
Функции округления
mixed abs(mixed $number)
Возвращает модуль числа. Тип параметра $number может быть float или int, а тип возвращаемого значения всегда совпадает с типом этого параметра.
double round(double $val)
Округляет $val до ближайшего целого и возвращает результат, например:
$foo = round(3.4); // $foo == 3.0
$foo = round(3.5); // $foo == 4.0
$foo = round(3.6); // $foo == 4.0
int ceil(float $number)
Возвращает наименьшее целое число, не меньшее $number. Разумеется, передавать в $number целое число бессмысленно.
int floor(float $number)
Возвращает максимальное целое число, не превосходящее $number.
Случайные числа
Следующие три функции предназначены для генерации случайных чисел. Пожалуй, в Web-программировании самое распространенное применение они находят в сценариях показа баннеров.
Я намеренно не рассматриваю функции rand() и srand(), потому что качество случайных чисел, которые они выдают, никуда не годится. Настоятельно рекомендую вместо них использовать описанные ниже функции, а про rand() вообще забыть.
int mt_rand(int $min=0, int $max=RAND_MAX)
Функция возвращает случайное число, достаточно равномерно даже для того, чтобы использовать ее в криптографии. Если вы хотите генерировать числа не от 0 до RAND_MAX (эта константа задает максимально допустимое случайное число, и ее можно получить при помощи вызова mt_getrandmax()), задайте соответствующий интервал в параметрах $min и $max. Не забудьте только перед первым вызовом этой функции запустить mt_srand(). Давайте теперь рассмотрим один из случаев применения функции mt_rand(). Речь пойдет об извлечении строки со случайным номером из текстового файла (работу с файлами мы рассмотрим чуть позже, а пока скажу лишь, что функция fget() читает очередную строку из файла, дескриптор которого указан ей в первом параметре, а второй параметр задает максимально возможную длину этой строки, для нас это – очень большое число). Поступим так:
for($i=0; mt_rand(0,$i)<1; $i++)
$s=fgets($OurFile,10000);
echo "Случайная строка: $s";
Этот способ работает в строгом соответствии с теорией вероятностей: для первой строки вероятность ее извлечения будет 100%, для второй – 50% (она перепишется поверх первой), для третьей – 33%, и т. д. Например, если файл состоит всего из трех строк, то вероятность извлечения третьей строки, как мы уже заметили, будет равна 33%, а значит, первой или второй – соответственно, 66%. Но вероятность извлечения второй строки после первой равна 50%, а 50% от 66% будет также 33%, т. е. вероятность извлечения каждой строки одинакова. Мы видим, что для файла из трех строк алгоритм работает правильно. Не вдаваясь в математические подробности, скажу, что он работает верно и для любого количества строк. Безусловно, мы могли бы загрузить весь файл в память и выбрать из него нужную строку и при помощи одного-единственного вызова mt_rand(), но если файл содержит очень много данных, это может быть довольно не экономично с точки зрения расхода памяти. Наоборот, для случая коротких файлов способ единовременной загрузки предпочтительнее. Насколько коротких? Думаю, это легче всего определить опытным путем. Рассмотренный нами способ решает проблему с большими файлами.
Отмечу, что использование обычной функции rand() в этом примере просто невозможно – сказывается слишком плохое качество генерируемых ей случайных чисел, и строки вряд ли будут равновероятны.
Voidmt_srand(int$seed) – Настраивает генератор случайных чисел на новую последовательность. Дело в том, что хотя числа, генерируемые mt_rand(), достаточно равновероятны, но у них есть один недостаток (который, как это обычно бывает, иногда перерастает в достоинство): последовательность сгенерированных чисел будет одинакова, если сценарий вызвать несколько раз подряд. Функция mt_srand() как раз решает данную проблему: она выбирает новую последовательность на основе параметра $seed, причем практически непредсказуемым образом. Чаще всего ее инициализируют так:
mt_srand(time()+(double)microtime()*1000000);
$randval = mt_rand();
В этом случае последовательность устанавливается на основе времени запуска сценария (в секундах), поэтому она достаточно непредсказуема. Для еще более надежного результата рекомендуется приплюсовать сюда также микросекунды (что и было сделано), а также идентификатор процесса, вызвавшего сценарий.
int mt_getrandmax() – Возвращает максимальное число, которое может быть сгенерировано функцией mt_rand() – иными словами, константу RAND_MAX.
Перевод в различные системы счисления
stringbase_convert(string$number,int$frombase,int$tobase) – Переводит число $number (заданное как строка в системе счисления по основанию $frombase) в систему по основанию $tobase. Параметры $frombase и $tobase могут принимать значения только от 2 до 36 включительно. В строке $number цифры обозначают сами себя, буква a соответствует 11, b – 12, и т. д. до z, которая обозначает 36. Например, следующие команды выведут 11111111 (8 единичек), потому что это не что иное, как представление шестнадцатеричного числа FF в двоичной системе счисления:
echo base_convert("FF",16,2);
intbindec(string$binary_string) – Преобразует двоичное число, заданное в строке $binary_stringв десятичное число.
stringdecbin(int$number) –Возвращает строку, представляющую собой двоичное представление целого числа $number. Максимальное число, которое еще может быть преобразовано, равно 2 147 483 647, которое выглядит как 31 единичка в двоичной системе.
Существуют аналогичные функции для восьмеричной и шестнадцатеричной систем. Называются они так же, только вместо "bin" подставляется соответственно "oct" и "hex".
Минимум и максимум mixed min(mixed $arg1 [int $arg2, ..., int $argn])
Эта функция возвращает наименьшее из чисел, заданных в ее аргументах. Различают два способа вызова этой функции: с одним параметром или с несколькими. Если указан лишь один параметр (первый), то он обязательно должен быть массивом и возвращается минимальный элемент этого массива. В противном случае первый (и остальные) аргументы трактуются как числа с плавающей точкой, они сравниваются, и возвращается наименьшее. Тип возвращаемого значения выбирается так: если хотя бы одно из чисел, переданных на вход, задано в формате с плавающей точкой, то и результат будет с плавающей точкой, в противном случае результат будет целым числом. Обратите внимание на то, что с помощью этой функции нельзя лексикографически сравнивать строки – только числа.
mixedmax(mixed$arg1 [int$arg2, ...,int$argn]) – Функция работает аналогично min(), только ищет максимальное значение.
Степенные функции float sqrt(float $arg)
Возвращает квадратный корень из аргумента. Если аргумент отрицателен, то генерируется предупреждение, но работа программы не прекращается! Это выглядит довольно странно: интересно, что в этом случае возвращается функцией?..
float log(float $arg) – Возвращает натуральный логарифм аргумента. В случае недопустимого числа печатает предупреждение, но, как и sqrt(), не завершает программу.
float exp(float $arg) – Возвращает e (2,718281828…) в степени $arg.
float pow(float $base, float $exp) – Возвращает $base в степени $exp.
Тригонометрия
Далее рассмотрим тригонометрические функции. Правда, они редко применяются при программировании сценариев, но все же...
float acos(float $arg) – Возвращает арккосинус аргумента.
float asin(float $arg) – Возвращает арксинус.
float atan(float $arg) – Возвращает арктангенс аргумента.
floatatan2(float$y,float$x) – Возвращает арктангенс величины $y/$x, но с учетом той четверти, в которой лежит точка ($x, $y). Эта функция возвращает результат в радианах, принадлежащий отрезку от ? до ?. Вот пара примеров:
$alpha=atan2(1,1); // $alpha==pi/4
$alpha=atan2(-1,-1); // $alpha==-3*pi/4
float sin(float arg) – Возвращает синус аргумента. Аргумент задается в радианах.
float cos(float $arg) – Возвращает косинус аргумента.
float tan(float arg) – Возвращает тангенс аргумента, заданного в радианах.
double pi() Возвращает число π. Эту функцию в PHP версии 4 обязательно нужно вызывать с парой пустых скобок (в отличие от PHP 3):
echo pi()*10;
Впрочем, наверное, лучше будет воспользоваться константой M_PI.