PHP перегрузить класс другим с таким же именем и пространством имен - PullRequest
0 голосов
/ 12 ноября 2018

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

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

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

  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')
 */

1 Ответ

0 голосов
/ 12 ноября 2018

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

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...