PHP Overload类由其他具有相同名称和名称空间的类

时间:2018-11-12 19:44:38

标签: php reflection overloading clone dynamic-loading

我有一个目录树,在其中不同的子目录中,我有很多同名的类。强烈希望编辑这些类。

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

我想过一些可能的解决方案:

  1. 正在加载具有与先前加载的类相同的名称的类(将其重载)
  2. 在我加载同名但来自不同路径的类之前,先卸载类
  3. 以不同的名称或通过向其添加名称空间来创建新类(动态创建的类主体)。创建过程首先读取源类主体,其方法,属性以及复制到新类的“副本”。与在实例上克隆相似,但在类主体级别完成。
  4. 读取第一个类,实例化它,使用其方法,破坏其实例。然后删除第一类中的所有方法,并在其中动态创建从第二类中读取的所有具有相同名称的方法。
  5. 读取类的文件内容,并使用读取的类内容创建临时文件,但更改类名称或在其顶部放置唯一的名称空间,最后加载临时文件。 (对我来说最不吸引人的方法)

第三次,我认为这可能是有用的:ComponereRunkitClasskit,但对它们没有任何经验。

您还有其他想法或解决方案吗? 您是否使用过componereRunkit / Classkit并且可以说它们适合这份工作?也许还有其他选择?

也许有一种OOP设计模式可以解决此问题,但我并不熟悉。

示例代码:

<?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 :(得分: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);