Да, расширения могут фактически зависеть от других.Они могут:
- Использовать ресурсы, которые регистрируются другими расширениями глобально, такие как типы классов или функции 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
.Это НЕ вызывает конструктор, поэтому вам все равно придется делать это вручную, если вам нужно.
Некоторые расширения могут предоставлять собственный интерфейс для создания и инициализации объекта, но в общем случае расширенияне готовы к тому, чтобы другие расширения создавали свои типы.
Конечно, вы также можете, как и скрипт, вызывать функции и методы PHP, которые возвращают любой из этих типов.Вы получите zval *
, который вы, в свою очередь, можете вернуть из своей функции.
Что касается того, как объявлять зависимости, дескриптор расширения имеет для этого запись .Это обеспечит загрузку вашего расширения после тех, от которых вы объявите, что зависите.Для объявления зависимости во время компиляции см. PHP_ADD_EXTENSION_DEP
.