Возврат "родных" объектов PHP из расширения - PullRequest
15 голосов
/ 19 марта 2012

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

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

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

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

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

Ответы [ 3 ]

4 голосов
/ 20 марта 2012

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

  • Использовать ресурсы, которые регистрируются другими расширениями глобально, такие как типы классов или функции 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.

2 голосов
/ 20 марта 2012

Если вы пишете расширения, то Расширение и встраивание PHP (он же «Книга Сары») является обязательным чтением. Сейчас он немного устарел, но лучший ресурс, который вы найдете в Интернете или вне его.

1 голос
/ 19 марта 2012

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

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

...