У меня есть дерево каталогов, где в разных подкаталогах у меня много классов с одинаковыми именами.Существует сильное намерение , а не редактировать эти классы.
Я ищу способ загрузить один класс, а после его использования и уничтожения его экземпляра загрузить другой с точно таким же именем.Затем используйте его, уничтожьте его экземпляр и повторите этот процесс.
Я подумал о некоторых возможных решениях:
- Загрузка класса с тем же именем, которое заменяет ранее загруженный класс (перегружает его)
- Выгрузка класса перед загрузкой класса с тем же именем, но с другим путем
- Создание нового класса (динамически создаваемого тела класса) под другим именем или путем добавления в него пространства имен.Процесс создания сначала читает тело исходного класса, его методы, свойства и «копирует» его в новый класс.Аналогично клонированию в экземплярах, но выполняется на уровне тела класса.
- Чтение первого класса, создание его экземпляра, использование его методов, уничтожение его экземпляра.Затем удалите все методы внутри первого класса и динамически создайте внутри него все методы, которые читаются из второго класса с тем же именем.
- Чтение содержимого файла класса и создание временного файла с содержимым класса, который вы прочитали, но изменилиимя класса или поместите уникальное пространство имен поверх него и, наконец, загрузите временный файл.(Наименее привлекательный подход для меня)
Для третьего я подумал, что это может быть полезно: Componere или Runkit или Classkit , ноу меня нет никакого опыта с ними.
У вас есть какие-то другие идеи или, возможно, какие-то решения?Вы использовали componere или Runkit / Classkit и можете сказать, что они подходят для работы?может быть, есть другие варианты?
Возможно, существует шаблон проектирования ООП, который охватывает эту проблему, но я не знаком с ним.
Пример кода:
<?php
#------------------------------------
//path Foo/Bar.php
/* class is without a namespace or have the same
as Baz/Bar.php */
class Bar
{
public function getName() : string
{
return 'Foo/Bar';
}
}
#------------------------------------
//path Baz/Bar.php
/* class is without a namespace or have the same
as Foo/Bar.php */
class Bar
{
public function getName() : string
{
return 'Baz/Bar';
}
}
#------------------------------------
//path ./Execute.php
$paths = [
'Foo/Bar.php',
'Baz/Bar.php'
];
$results = [];
foreach ($paths as $path) {
//how to create instance of class Bar in Foo/Bar.php and then in Baz/Bar.php
//without PHP Fatal error: Cannot declare class...
$classDynamic = ...
$results[] = $classDynamic->getName();
unset($classDynamic);
}
var_export($results)
/**
* prints
* array('Foo/Bar', 'Baz/Bar')
*/