【问题标题】:Call method from class of unknown name从未知名称的类中调用方法
【发布时间】:2015-01-04 02:35:46
【问题描述】:

标题可能令人困惑,但我不知道如何措辞。所以我希望能够在从数组中获取类名之前初始化一个类并从中调用方法。

我想做的事

$modules = array(
    'Forums' => array(
            'class'=>'Forums',
            'classVar'=>'forum'
    )
);

        foreach($modules as $name => $module) if ($module['enabled']) {
            require_once('include/scripts/'.$module['link']);
            $$module['classVar'] = new $module['class'];
            $$module['classVar'] = $module['classVar'];
            global $$module['classVar'];
        }

但是,我知道这是一种迂回的方式来实现这一点,我需要知道是否有更简单的方式,以及这是否合乎逻辑。

我想这样做的原因是因为我正在处理的将能够接受模块,并且我需要能够从模块中获取所有统计信息并将它们显示在主管理面板中,但是如果我没有创建模块,则无法知道模块是否已启用并正在运行。例如,如果有人创建了module.php 来跟踪某人单击特定链接的次数,那么软件本身不会知道它,我需要它能够从中获取统计信息。

【问题讨论】:

    标签: php logic


    【解决方案1】:

    嗯,您可能对 Singleton 设计模式(http://en.wikipedia.org/wiki/Singleton_patternhttp://www.phptherightway.com/pages/Design-Patterns.html)感兴趣。

    在这种情况下,您的配置数组中有一个类列表,并在您真正想要对实际模块执行某些操作时调用“getInstance()”。

    另外,看看工厂模式,它也可能对您的目的有用。

    【讨论】:

    • 好吧,看看这个(除非我错了)我仍然需要知道等于new someClass;的变量
    • 并非如此。使用单例,您可以只使用ClassName::getInstance()$classRef::getInstance(),而不是将实例存储在全局变量中(或传递它)。当然,这假设您的模块配置数组中有模块类名。
    • (我的意思是物理上会有一个实例变量,但它将由单例本身管理 - 作为模块使用者,您不需要关心它)。跨度>
    • 当然,这只是一个最简单的可能实现,假设您没有使用框架;如果您使用 Symfony,请查看“标记服务”(symfony.com/doc/current/components/dependency_injection/…)。
    • 单例方法让我找到了我的解决方案,谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-23
    • 1970-01-01
    • 1970-01-01
    • 2013-04-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多