Динамически создавать подкласс

Я использую Kohana и только что нашел этот фрагмент кода в их методе автозагрузки

        // Class extension to be evaluated
        $extension = 'class '.$class.' extends '.$class.'_Core { }';

        // Start class analysis
        $core = new ReflectionClass($class.'_Core');

        if ($core->isAbstract())
        {
            // Make the extension abstract
            $extension = 'abstract '.$extension;
        }

        // Transparent class extensions are handled using eval. This is
        // a disgusting hack, but it gets the job done.
        eval($extension);

в основном то, что он делает, - это когда я имею в виду класс, который не существует (через создание экземпляра объекта, вызов class_exists () и т. д.), Kohana создаст класс (например, Foo), который расширяет класс библиотеки, который следует определенному соглашению об именах (например, Foo_Core). просто из любопытства, есть ли способ сделать что-то подобное, но без использования eval?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
0
942
3

Ответы 3

Я думаю, вы застряли с eval() для этого.

Он отмечен как "отвратительный взлом", так что все в порядке :)

Мне было бы интересно узнать, что вы делаете с таким пустым классом ...

Если вы хотели иметь возможность кэшировать свои динамически созданные классы, вы могли бы записать в файл и потребовать его вместо этого. Это можно было бы также считать хакерским, но это вариант. Для классов, которые создаются один раз и часто используются, это может быть хорошим решением. Для классов, которые должны быть динамическими каждый раз, использование eval, вероятно, будет лучшим решением.

$proxyClassOnDisk = '/path/to/proxyCodeCache/' . $clazz .'.cachedProxyClass';
if ( ! file_exists($proxyClassOnDisk) ) {
    // Generate the proxy and put it into the proxy class on disk.
    file_put_contents($proxyClassOnDisk, $this->generateProxy($object));
}
require_once($proxyClassOnDisk);

В этом примере идея состоит в том, что вы создаете динамические прокси для класса $object. $this->generateProxy($object) вернет строку, которая более или менее похожа на то, как $extension выглядит в исходном вопросе.

Это ни в коем случае не полная реализация, это просто псевдокод, показывающий то, что я описываю.

Если вы хотите создать динамический класс, то eval() - это функция goto (каламбур предназначен.). Как бы то ни было, я обнаружил, что вы можете поместить объявление класса в оператор if-then. Итак, вы можете сделать следующее:

if (true)
{
    class foo
    {
       // methods
    }
}

Я использую это, чтобы проверить, являются ли динамически созданные классы (из файла конфигурации) текущими ... если да, то загрузите класс, в противном случае ... регенерируйте класс и загрузите новый. Поэтому, если вы хотите создать динамические классы по аналогичным причинам, это может быть решением.

Другие вопросы по теме