代码之家  ›  专栏  ›  技术社区  ›  Jimmix

其他具有相同名称和命名空间的PHP重载类

  •  0
  • Jimmix  · 技术社区  · 6 年前

    我有一个目录树,在不同的子目录中有许多同名的类。有强烈的意图 编辑这些类。

    我正在寻找一种方法来加载一个类,在使用它并销毁它的实例之后,加载另一个具有完全相同名称的类。然后使用它,销毁它的实例并重复这个过程。

    1. 使用替换先前加载的类的相同名称加载类(重载它)
    2. 在加载同名但路径不同的类之前先卸载类
    3. 用不同的名称创建一个新类(动态创建的类主体),或者通过添加到它的命名空间。创建过程首先读取源类的主体、方法、属性,并将其“复制”到新类中。类似于实例上的克隆,但在类主体级别上完成。
    4. 读取第一个类,实例化它,使用它的方法,销毁它的实例。然后删除第一个类中的所有方法,并在其中动态创建从第二个类中读取的具有相同名称的所有方法。

    对于第三个,我认为这可能是有用的: Componere Runkit Classkit 但我对他们没有任何经验。

    componere Runkit公司 类工具包 你能说他们适合这份工作吗?也许还有其他选择?

    也许有一个面向对象的设计模式涵盖了这个问题,但我不熟悉它。

    示例代码:

    <?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 回复  |  直到 6 年前
        1
  •  0
  •   IcePops    6 年前

    我不认为有一种方法可以取消一个类一旦被定义,因为他们共享相同的命名空间,他们会出错。

    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);