Перекрестная совместимость пользовательских расширений PHP

#php #php-extension

#php #php-расширение

Вопрос:

Я создаю свое первое расширение PHP, используя https://www.zend.com/resources/writing-php-extensions в качестве дорожной карты и столкнулся с некоторыми интересными (для меня) проблемами.

На сервере установлен PHP 7.2, но текущая master версия — 7.4. Я скопировал php-src-master его на сервер и выполнил первый шаг php ext_skel.php --ext test --dir , а затем

 # phpize
# ./configure
# make
  

Затем я получаю эту ошибку:

 /bin/bash /root/php-src-master/ext/test/libtool --mode=compile cc  -I. -I/root/php-src-master/ext/test -DPHP_ATOM_INC -I/root/php-src-master/ext/test/include -I/root/php-src-master/ext/test/main -I/root/php-src-master/ext/test -I/usr/include/php/20170718 -I/usr/include/php/20170718/main -I/usr/include/php/20170718/TSRM -I/usr/include/php/20170718/Zend -I/usr/include/php/20170718/ext -I/usr/include/php/20170718/ext/date/lib  -DHAVE_CONFIG_H  -g -O2   -c /root/php-src-master/ext/test/test.c -o test.lo 
libtool: compile:  cc -I. -I/root/php-src-master/ext/test -DPHP_ATOM_INC -I/root/php-src-master/ext/test/include -I/root/php-src-master/ext/test/main -I/root/php-src-master/ext/test -I/usr/include/php/20170718 -I/usr/include/php/20170718/main -I/usr/include/php/20170718/TSRM -I/usr/include/php/20170718/Zend -I/usr/include/php/20170718/ext -I/usr/include/php/20170718/ext/date/lib -DHAVE_CONFIG_H -g -O2 -c /root/php-src-master/ext/test/test.c  -fPIC -DPIC -o .libs/test.o
In file included from /root/php-src-master/ext/test/test.c:10:0:

/root/php-src-master/ext/test/test_arginfo.h:8:2: warning: implicit declaration of function ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE [-Wimplicit-function-declaration]
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, str, IS_STRING, 0, """")
  

Если я загружу src для 7.2, то все будет работать просто отлично. Наверное, я удивлен, потому что на данный момент я вообще не редактировал никакого кода, поэтому я бы подумал, что это эквивалент Hello World системы, которая, похоже, будет иметь максимальную совместимость между версиями и поэтому не выдаст ошибку, если я не вызывал функции, которых не было в установленной версии. Если это верно и вызывается «новая» функция, которой не было в 7.2, кажется странным, что базовый скелет будет использовать функции, которых не было в 7.2, для отображения «Hello World».

Если бы я создавал и компилировал в 7.2, смог бы я позже скомпилировать в 7.4? Если я скомпилирую в 7.4, смогу ли я использовать его в 7.2?

Расширения, которые я хочу создать, будут иметь очень простые задания, но те, которые нужно выполнять быстро и часто. Такие вещи, как форматирование телефонных номеров, фильтрация json, обработка рекурсивных древовидных связей и так далее.

Увидев эту проблему совместимости, мне любопытно, не заставит ли это меня использовать определенную версию PHP, где, даже когда я не пытаюсь использовать какие-либо новые функции в своем коде, мне все равно придется переписывать его каждый раз, когда мы будем обновлять PHP в ближайшие годы.

Комментарии:

1. объявление неявной функции означает, что не удалось найти функцию во время соединения. Вам, вероятно, нужно -l и, возможно -L , сообщить компоновщику, где его найти.

Ответ №1:

Скелеты для конкретной ветви версии PHP могут использовать функциональные возможности / внутренние API, представленные в указанной версии, если вы хотите создать расширение, совместимое с более низкой версией PHP, вы должны работать со скелетом расширения PHP указанной версии PHP, а не с более поздней.