【问题标题】:Define a class with a variable name in PHP?在 PHP 中定义一个带有变量名的类?
【发布时间】:2012-11-10 09:24:39
【问题描述】:

我希望能够按照这个顺序做一些事情

$name = "Hello".time().mt_rand();
class $name {
    function hellolol() {
        echo "LOL";
    }
}
$name::hellolol();

这样我就可以在 PHP 中构建一个可重新加载的模块系统。这甚至可能吗?如果可以,我将如何做这样的事情?

编辑:我已经把它变成了一个项目,基本上按照公认的答案建议。这是一个链接:https://github.com/Modfwango/Modfwango

【问题讨论】:

  • 为什么要构建一个“可重新加载的模块系统”?什么“可重新加载的模块系统”?
  • 你确定你的方法名是固定的吗?-)
  • 由于你不能重新定义类,我需要能够为类设置一个动态名称。这将允许我包含一个文件,初始化函数,并在模块管理类中注册类名。
  • @ClayFreeman:为什么您需要动态名称?为什么你甚至需要单独的课程?
  • @ClayFreeman:抱歉,不够具体 :) 我真的不明白这有什么改变。您的意思是要更新文件并再次包含它吗? (你是如何以一种可能的方式运行 PHP 的?)

标签: php class variables dynamic


【解决方案1】:
$name = "Hello".time().mt_rand();
eval(sprintf('
class %s {
    static function hellolol() {
        echo "LOL";
    }
}', $name));
$name::hellolol();

相当讨厌,但很适合嘲笑等。

【讨论】:

  • 这应该可行,我很欣赏这个答案,但我很担心这会在我的文本编辑器中可怕地显示出来。
  • 它可能会。通过使用模板来欺骗它,将内容放在定义为class @@CLASSNAME@@ 的.php 文件中并使用eval(str_replace('@@CLASSNAME@@', $class_name, file_get_contents('your_template.php')));
  • 我可能最终会这样做。
  • 看起来很眼熟!请记住,eval 会解析给定的字符串,就好像它已经以 <?php 为前缀,因此如果模板文件以 <?php 开头,则需要使用 eval('?>'.[...]
  • @Adam:你也发明了 sed 吗? ^^ 我刚刚在野外看到了这个 eval 方法,看看 Kohana2 的自动加载器。我会生病..
【解决方案2】:

这在技术上可能的,只是以一种非常非常糟糕的方式。

首先,保存这个文件:

<?php
// GeneratedClass.php
class CLASSNAME {
    function hellolol(){
        echo "LOL";
    }
}

然后,使用以下命令创建具有自定义名称的类:

<?php
function generate_class($name){
    eval('?>'.str_replace('CLASSNAME', $name, file_get_contents('GeneratedClass.php')));
}

generate_class("Hello".time().mt_rand());

同样,这不是一个好主意!除了与eval 相关的任何事情都可能是个坏主意之外,通过手动解析这些类,您将失去任何优势IDE会给你,文件不会被memcached之类的东西缓存,而且使用起来简直就是一场噩梦。但这是可能的。

【讨论】:

  • 我喜欢这个答案。这可能是我设置它的方式。我将使用这种性质的东西来为 IRC 机器人制作一个可重新加载的模块系统。这将允许我在重新加载命令时为命令实例化新类,这样我就不必重新启动整个过程来对事物进行细微更改。
  • 希望它对你有用!很久以前,我有一个与此类似的设置,可以让我覆盖整个应用程序中的类,或者如果覆盖不存在则生成一个类......我已经意识到这不是一个好主意,来吧找到更好的方法来实现它,因此请确保它是您想要实现的目标的最佳选择!
  • 我希望这行得通。我认为这对我有用。旧的类等老了我会扔掉。
  • 如果您生成的类将被多次使用,请考虑将它们保存到文件而不是evaling,这样您就可以像平常一样include它们,然后保存每次都必须重新加载原始生成文件。
  • Generation 将成为管理我加载的模块的类的一部分。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-18
  • 2016-02-25
  • 1970-01-01
  • 2012-03-04
  • 2011-04-25
  • 1970-01-01
相关资源
最近更新 更多