У меня есть два расширения php — A и B.
У меня есть:
struct foo : public functor {
virtual void operator()( some parameters );
};
В б.ч у меня тоже самое
struct foo : public functor {
virtual void operator()( some parameters );
};
Функтор объявлен в shared.h, который является общим для двух расширений
struct functor {
virtual void operator()( some parameters );
};
void foo :: operator () (некоторые параметры) реализованы по-разному в a2.cpp и b2.cpp.
В a1.cpp у меня есть список функторов, используемых в расширении A:
const functor a_func[] = {
func1(new func1),
func2(new func2),
foo(new foo),
func4(new func4)
};
В b2.cpp у меня есть похожий список:
const functor b_func[] = {
func1(new func1),
foo(new foo),
func3(new func3),
func4(new func4)
};
Функция foo вызывается в shared.cpp
const functor* func = get_func( functors );
*func( some arguments );
Где ‘functors’ — это либо a_func, либо b_func, а shared.cpp вызывается из расширения A или расширения B в зависимости от используемого вами API.
Проблема, с которой я сейчас сталкиваюсь, заключается в том, что при тестировании расширения B на Mac и при загрузке расширения A до расширения B в php.ini вместо b2.cpp используется функция foo, определенная в a2.cpp. Но если я переверну порядок в php.ini, все будет нормально. Когда я отлаживаю в нем, я вижу, что список функторов, передаваемых в get_func (), правильный (то есть b_func).
Я попытался использовать пространство имен или переименовать функцию foo в A и B, которая устраняет проблему. Но вот что меня смущает, так это то, что расширения всегда работали в Windows и Linux, однако теперь у них есть проблема с определением одного имени на Mac.
На всякий случай, если другие люди задаются вопросом. Это потому, что MacOS имеет конфигурацию по умолчанию плоского пространства имен. Чтобы это исправить, нужно положить в MACOSX_DEPLOYMENT_TARGET=
sw_vers -productVersion в вашем конфигурационном файле.
Других решений пока нет …