Динамически создать класс, который реализует произвольные интерфейсы - PullRequest
0 голосов
/ 21 мая 2019

Я создаю библиотеку 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() можно отключить , что является проблемой при написании библиотеки общего назначения.

Я что-то упустил? Есть ли другой способ динамически создать объект, который реализует произвольное количество интерфейсов, которые известны только во время выполнения?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...