Модуль числа php


Недавно мы опубликовали визард для VisualStudio, с помощью которого можно создать экстеншн в пару кликов мыши. Теперь с помощью него мы напишем наши два первых расширения: «Привет, мир» и «вытащим иконку из exe».
Сразу прошу прощение, что очень сильно задержал статью, но жизненные обстоятельства вынудили это сделать, но они исключительно уважительные.

Модуль числа phpМодуль числа php

Итак, начнем.
1. Качаем «волшебника» для VS 2008.
По ссылке из темы VS wizard: PHP extension
Устанавливаем его, это произойдет автоматически.

2. Скачиваем необходимые для сборки файлы.
Нужны лишь исходники PHP и бинарники. Скачиваем 5.2.11 версию обоих файлов
Разархивируем php-5.2.11-Win32.zip в C:PHPDEVphp-5.2.11-Win32 и php-5.2.11.tar.bz2 в C:PHPDEVphp-5.2.11.

3. Запускаем VS, создаем новый проект.


Модуль числа php
И вводим его название. Пути настраивать не придется 😉
Модуль числа php
После этого видим главное окно студии, смотрим, что же там в файлах.
Модуль числа php

4. Создаем функции.
Как уже замечено, то скелет полностью создан, осталось лишь написать функции и прописать их.
В проекте есть тестовая функция, раскоментируем ее.
Для справки:
1) Заголовок функции должен быть в h файле. В виде PHP_FUNCTION(имя_функции).
2) Определение — в c файле.
3) Функция должна быть прописана в function_entry test_functions в c файле. В виде PHP_FE(имя_функции, NULL).
Как написать саму функцию, я расскажу позднее. А пока ограничимся этой:

PHP_FUNCTION(hello_world) {   RETURN_STRING("Hello World", 1);  }

5. Сборка и запуск.
Собираем в релизе. Собралось.
Создаем каталог C:PHPDEVtest
Копируем туда php.exe и php5ts.dll из каталога.
Копируем собранный dll под именем test.dll.
Создаем php.ini:
extension_dir = .
extension = test.dll

Создаем test.php со строкой <?=hello_world()?> и запускаем его в консоли.
Модуль числа php

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


PHP_FUNCTION(foo) {   char* input;   int inputLength;   long multy;   char* result;   if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sl", &input, &inputLength, &multy)) {   return;   }   result = (char*) emalloc(strlen(input) + sizeof(long) + 3);   sprintf(result, "%s, %ld", input, multy);   RETURN_STRING(result, 1);  }

Как можно увидеть, здесь использованы следующие конструкции:
zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, строка_формата, адреса_дляполучаемых_значений)
RETURN_*;
Рассмотрим 2 таблицы, в первой указаны принимаемые PHP-типы и соответствующие им форматы и типы C.
Во второй возвращаемые значения с соответствующими конструкциями.
Дабы не утруждать себя, я прилагаю фотографии таблиц из книги, которую я всем советую прочитать.
Модуль числа php
Модуль числа php
Еще раз смотрим на примеры выше и понимаем, как все просто.
Кстати хочу обратитьт внимание, что выделение памяти ведется через e-аналоги функций c(emalloc, efree, erealloc), это нужно для того, чтобы GC PHP сам смог «прибраться».


7. Полезный пример. Вытащим иконку из exe.
Конечно можно написать это и на PHP, но работы будет больше. А тут уже есть необходимые заголовки.
Напишем код на C(писал одепт bl4de):
В файле pe.h мы видим использование кусков кода из библиотек windows: они нам помогут, а прямое их подключение невозможно, мы ведь пишем кроссплатформенное расширение, не так ли? 😉
В pe.c же пишем код. Как и понятно, мы будем оборачивать функцию void _extract_ico(char *filename, char *filenameOut).

PHP_FUNCTION(extract_ico) {   char *filename;   char *filenameOut;   int len1, len2;   if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss", &filename, &len1, &filenameOut, &len2)) {   return;   }   _extract_ico(filename, filenameOut);   RETURN_NULL();  }

Ничего сложного, как мы видим. Просто и понятно. Вот такие вот файлы получились в итоге: php_ico.c и php_ico.h.

8. Бонус: сборка под *nix
Бонус заключается в наличии config.m4 файла, так что для сборки надо лишь выполнить серию команд:
phpize
./configure
make
Естественно в системе должны стоять соответствующие пакеты.
Для ubuntu 9.10 server это делается так:
sudo apt-get install build-essential php5 php5-dev
Берем собранную so-библиотеку и прописываем в расширения. Готово.
Да, *nix гораздо удобнее для веб-программиста, среди моих знакомых на винде сидит мешишинство. Многие предпочитают убунту или мак =)


9. Литература и полезные ссылки.
1) Джордж Шлосснейгл. Профессиональное программирование на PHP. Купить можно на books.ru, там дешевле всего из популярных магазинов имхо. Если хотите меня поддержать, то жмите эту ссылку =)
2) Extension Writing Part I: Introduction to PHP and Zend
3) PHP: internals:windows [PHP Wiki]

P.S. А в следующий раз я расскажу, как встроить PHP в свое приложение на С/C++. Но не буду обещать, что это будет «на днях».

habr.com

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

В первую очередь рассмотрим основные математические константы, которые разработчики встроили в язык php.

  <?php  echo M_PI;  echo "
"; echo M_E;

Это число PI и число Е;

  3.14159265359  2.71828182846  

Теперь перейдём к изучению самих функций.

Модуль числа

Модуль числа в php находится через функцию abs.

  $x:= -5;  echo abs($x);  

Получим:

  5  

Округление числа

Для округления чисел в php, есть функция round

  	$x = 43.5676;  	$y = 43.4954;  	echo round($x);  	echo "
"; echo round($y);

В данном случае мы округляем до целого числа в сторону большего остатка. Полученный результат:


  44  43  

Также можно задать параметр для округления остатка

  	$x = 43.5676;  	$y = 43.4875;  	echo round($x,2);  	echo "
"; echo round($y,2);

Указав число, вы показываете, до какого числа после запятой будет округляться число:

  43.57  43.49  

Также есть функции, которые округляют до большего целого ceil или до меньшего floor

  	$x = 43.5676;  	$y = 43.4875;  	echo ceil($x);  	echo "
"; echo ceil($y); echo "
"; echo floor($x); echo "
"; echo floor($y);

Тут всё просто. К примеру эти функции могут понадобится при создании навигации для сайта.

  44  44  43  43  

Генерация случайного числа

Для генерации случайного числа в php есть функция mt_rand, которая генерирует случайное число в нужном диапазоне.

  echo mt_rand();  echo mt_rand();  echo mt_rand(0,10);  echo mt_rand(-5,5);  

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

  880261905  100916511  10  -2  

Поиск максимального и минимального числа


Есть функция, которая из заданных чисел или переменных найдёт нам максимальное или минимальное значение, за это в php отвечают функции min и max.

  	echo min(5,3,0,-5,3,2,42,30,421,0.4,-34)."
"; echo max(5,3,0,-5,3,2,42,30,421,0.4,-34)."
";

Функция выведет нам нужное значение.

  -34  421  

Тригонометрические функции

Нахождения синуса:

  $x=1;  echo sin($x);  //Получим 0.841470984808  

Нахождение косинуса:

  $x=1;  echo cos($x);  //Получим 0.540302305868  

И тангенс

  $x=1;  echo tan($x);  //Получим 1.55740772465  

Для нахождения котангенса применим математическую формулу.

  $x=1;  echo 1/tan($x);  //Получим 0.642092615934  

Арксинус:

  $x=1;  echo asin($x);  //Получим 1.57079632679  

Арккосинус:

  $x=1;  echo acos($x);  //Получим 0  

Арктангенс:

  $x=1;  echo atan($x);  //Получим 0.785398163397  

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

  $x = 1; // в радианах  $y = ($x * 180)/ M_PI; // в градусах  

daruse.ru


You May Also Like

About the Author: admind

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

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

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.