2012-03-27 1 views
4

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

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

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

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

не больше вдоль линий этого:

string helloWorld() 
{ 
    return "Hello World" 
} 

PHP_REGISTER_METHOD("helloWorld"); 

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

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

+3

Угадайте, PHP_FUNCTION и RETURN_STRING являются макросами, которые делают «под капотом». – Konrad

+4

php обертывает каждый бит данных во всей стопке метаданных. его собственные функции, такие как register_string(), обрабатывают все это для вас. –

+3

Я не хочу звучать снисходительно, но сколько у вас опыта написания реальных программ на C++ или для работы с реальными программами на C++ с большой существующей кодовой базой? – NullUserException

ответ

6

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

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

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

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

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

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

+0

Большое спасибо за ответ: У меня был небольшой щелчок мышления, когда я читал, и я уверен, Теперь я понимаю. – syntaqx