почему разработка расширений php так сильно отличается от разработки на c ++? - PullRequest
4 голосов
/ 27 марта 2012

Я довольно долгое время работал над PHP-разработчиком, и я начинаю сталкиваться с некоторыми ограничениями языка. Итак, учитывая сказанное, я решил, что следующим шагом в моем цикле разработки будет переход на C ++ и создание некоторых расширений!

По мере того, как я проходил некоторые стандартные уроки «Hello World», вроде бы, все, по-видимому, имеет смысл по большей части. Я построил довольно приличное приложение в крестики-нолики, поэтому решил, что пришло время погрузиться в PECL и посмотреть, как все работает. Однако то, что я нашел, поражает меня.

Может ли кто-нибудь объяснить, как цель и обоснование, почему что-то вроде этого:

PHP_FUNCTION(helloWorld)
{
    RETURN_STRING("Hello World");
}

не более того:

string helloWorld()
{
    return "Hello World"
}

PHP_REGISTER_METHOD("helloWorld");

Я не делаю вид, что знаю больше, чем люди, которые создали язык, и я не пытаюсь вызвать какие-либо проблемы. Просто кажется (по крайней мере, с точки зрения начинающих), что создание расширения PHP совсем не похоже на написание программы на C ++. Это почти другой язык, за исключением некоторых основных правил синтаксиса.

Любая помощь будет оценена. Просто новичок пытается вырасти:)

1 Ответ

6 голосов
/ 27 марта 2012

Разработка расширений PHP не сильно отличается от других разработок на C / C ++. Единственное, что является особенным, - это то, что вы должны связать мир сценариев PHP с вашими функциями C / C ++. Эта задача не тривиальна, и здесь нужны странные макросы, такие как PHP_FUNCTION.

Например, если вы хотите вызвать функцию «helloWorld» из PHP, интерпретатору необходимо найти «helloWorld» и сопоставить ее с функцией C. Эта функция должна иметь определенную подпись, это означает, что она должна принимать определенный набор параметров и должна возвращать определенное значение. Это не произвольно, и интерпретатор не может просто вызвать любую функцию C / C ++.

Именно так работают языки низкого уровня, такие как C, вы не можете «проверить», какие аргументы принимает функция.

В частности, все значения в интерпретаторе PHP являются специальными структурами, которые не могут быть преобразованы в типы C ++. Строка PHP - это нечто иное, чем строка C ++ std :: string. PHP API предоставляет все виды инструментов для преобразования значений, но вы должны знать, как их использовать.

Когда вы знаете, как написать функцию C, которую можно вызывать из PHP, вы попадаете в «мир C / C ++», где вы можете вызвать другую функцию C / C ++ и использовать типы C / C ++. С этого момента это так же, как написание приложений на чистом C / C ++. Ну, пока вам не придется возвращать значения обратно в мир PHP, где вам придется снова использовать инструменты PHP API.

Существуют инструменты, которые могут упростить вашу жизнь, помогая в создании необходимого «связующего кода» для взаимодействия с языками сценариев, такими как PHP и «чистые» проекты C ++. Взгляните на SWIG , который, вероятно, является наиболее ярким примером.

...