Я создаю библиотеку PHP для извлечения структурированных данных schema.org из веб-страниц.
Schema.org имеет иерархию множественного наследования , которую я могу достичь только через интерфейсы PHP:
interface LocalBusiness extends Organization, Place
{
}
В дополнение к этому schema.org позволяет объекту иметь нескольких независимых типов , например, это может быть Book
и Product
, и использовать свойства из обоих:
<!-- Uses both the "Book" and "Product" item types -->
<div vocab="http://schema.org/" resource="#record" typeof="Book Product">
...
<span property="author">
...
<span property="sku">
Чтобы поддержать этот вариант использования, мне нужно динамически генерировать классы, которые реализуют более одного интерфейса. В приведенном выше примере это может выглядеть так:
new class implements Book, Product
{
use BookTrait;
use ProductTrait;
}
Очевидно, я не могу сгенерировать все комбинации интерфейсов заранее, поэтому я думаю о способе создания такой реализации во время выполнения.
Насколько я знаю, рефлексия не позволяет делать подобные вещи, поэтому я могу думать только о том, чтобы использовать сгенерированный код и eval()
, как это делают библиотеки-макеты. Проблема в том, что eval()
можно отключить , что является проблемой при написании библиотеки общего назначения.
Я что-то упустил? Есть ли другой способ динамически создать объект, который реализует произвольное количество интерфейсов, которые известны только во время выполнения?