Возвращение "родных" объектов PHP из расширения

Я занимаюсь созданием расширения PHP для личного проекта. Помимо того, что связано в этой статье, я не знаю zend_engine, и мои навыки C на 10 лет устарели и были только академическими. Все это означает: "Если мне кажется, что я задаю глупый вопрос, я, вероятно, есть".

Можно ли вызывать функции из других расширений PHP в моем собственном расширении или каждое расширение PHP считается островом, не понимая других частей системы? Если это возможно, это обычная практика или Bad Idea ™?

То есть, я знаю, что могу вернуть строку с чем-то вроде этого.

PHP_FUNCTION(hello_world)
{
    char *str;
    str = estrdup("Hello World");
    RETURN_STRING(str, 0);
}

Я бы хотел вернуть, скажем, элемент SimpleXML или элемент DomDocument. Googling оказался трудным, так как там нет тонкости разработки расширений, и там есть тонна вокруг стандартного использования PHP.

Ответы

Ответ 1

Да, расширения могут фактически зависеть от других. Они могут:

  • Использовать ресурсы, которые другие расширения регистрируют глобально, например, типы классов или функции PHP (то есть они не имеют меньшего доступа, чем сценарии пользовательской земли, которые, очевидно, могут использовать эти ресурсы). См. zend_call_function и zend_lookup_class_ex.
  • Используйте любые экспортированные символы и структуры, объявленные в файле php_extensionname.h (эти заголовки являются единственными, которые рассматриваются как экспорт собственного API для других расширений). Однако некоторые расширения могут фактически НЕ экспортировать некоторые символы, объявленные в этих заголовочных файлах, вы должны искать символы, объявленные с помощью PHPAPI. Обратите внимание, что некоторые расширения не могут быть деактивированы, и вы можете полагаться на их присутствие (например, по 5.3/5.4, стандартное, SPL, отражение, дата, pcre, ereg).
  • Если ваше расширение и целевое расширение построены статически, у вас, конечно, больше свободы на символах, которые вы можете использовать, но это не очень хорошая практика использования неэкспортированных символов.

Я бы хотел вернуть, скажем, элемент SimpleXML или элемент DomDocument.

Если вам нужно явно создать экземпляр SimpleXMLElement или DOMDocument, вы можете сделать это с помощью object_init_ex. Расширения обычно экспортируют zend_class_entry *, которые должны передать этот макрос, но если нет, вы всегда можете использовать zend_lookup_class_ex. Это НЕ вызывает конструктор, поэтому вы все равно должны сделать это вручную, если вам нужно.

Некоторые расширения могут предоставлять собственный интерфейс для создания экземпляра и инициализации объекта, но в целом расширения не готовы к тому, чтобы другие расширения создавали экземпляры своих типов.

Конечно, вы также можете как script вызвать функции и методы PHP, которые возвращают любой из этих типов. Вы получите zval *, который вы, в свою очередь, можете вернуть из своей функции.

Что касается того, как объявить зависимости, для этого дескриптор расширения имеет запись. Это обеспечит загрузку вашего добавочного номера после того, как вы заявляете, что вы зависите. Для объявления зависимости во время компиляции см. PHP_ADD_EXTENSION_DEP.

Ответ 2

Если вы пишете расширения, то Расширение и встраивание PHP (aka "Sara Book" ) является важным чтением. Это немного датировано сейчас, но лучший ресурс, который вы найдете в Интернете или вне.

Ответ 3

Я не очень разбираюсь в написании расширений php, но вы можете попробовать это, если вы еще не прочитали его http://devzone.zend.com/446/extension-writing-part-iii-resources/

с помощью этого вы можете передать любой тип ресурса на расширение php