отражение — класс перегрузки PHP другим с тем же именем и пространством имен

У меня есть дерево каталогов, где в разных подкаталогах у меня много классов с одинаковыми именами. Существует сильное намерение не редактировать эти классы.

Я ищу способ загрузить один класс и после его использования и уничтожения его экземпляра загрузить другой с точно таким же именем. Затем используйте его, уничтожьте его экземпляр и повторите этот процесс.

Я подумал о некоторых возможных решениях:

  1. Загрузка класса с тем же именем, которое заменяет ранее загруженный класс (перегружает его)
  2. Выгрузка класса перед загрузкой класса с тем же именем, но с другого пути
  3. Создание нового класса (динамически создаваемого тела класса) под другим именем или путем добавления в него пространства имен. Процесс создания сначала читает тело исходного класса, его методы, свойства и «копирует» его в новый класс. Аналогично клонированию в экземплярах, но сделано на уровне тела класса.
  4. Прочитайте первый класс, создайте его экземпляр, используйте его методы, уничтожьте его экземпляр. Затем удалите все методы внутри первого класса и динамически создайте внутри него все методы, которые читаются из второго класса с тем же именем.
  5. Прочитайте содержимое файла класса и создайте временный файл с содержимым класса, который вы прочитали, но измените имя класса или поместите уникальное пространство имен поверх него и, наконец, загрузите временный файл. (Наименее привлекательный подход ко мне)

Для третьего я подумал, что это может быть полезно: 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')
*/

0

Решение

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

class Bar
{
$myname = "";
function __construct($setname="")
{
$this->myname = $setname;
}
function getName()
{
return $myname;
}
}

$paths = array('Foo/Bar','Baz/Bar');
$results = array();
foreach($paths as $p)
{
$bit = new Bar($p);
$results[] = $bit->getName();
}
var_export($results);
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]