Ответ 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
.