У меня есть дерево каталогов, где в разных подкаталогах у меня много классов с одинаковыми именами. Существует сильное намерение не редактировать эти классы.
Я ищу способ загрузить один класс и после его использования и уничтожения его экземпляра загрузить другой с точно таким же именем. Затем используйте его, уничтожьте его экземпляр и повторите этот процесс.
Я подумал о некоторых возможных решениях:
Для третьего я подумал, что это может быть полезно: 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')
*/
Я не думаю, что есть способ удалить класс, как только он был определен, и, поскольку они совместно используют одно и то же пространство имен, они выдают ошибку.
но вы можете получить желаемый эффект следующим образом
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);
Других решений пока нет …