匿名类建设

时间:2012-03-15 19:03:27

标签: php class namespaces anonymous php-7

我需要一个在PHP上创建匿名类的想法。我不知道我的工作方式。

查看我的限制

  • 在PHP上你不能创建匿名类,比如匿名函数(如class {});
  • 在PHP上你没有类范围(名称空间除外,但下面有同样的问题);
  • 在PHP上,您不能使用变量来指定类名(如class $name {});
  • 我无权安装runkit PECL。

我需要什么,为什么

好吧,我需要创建一个名为ie create_class()的函数,它接收一个键名和一个匿名类。它对我有用,因为我想使用PHP无法接受的不同名称类符号。例如:

<?php

  create_class('it.is.an.example', function() {
    return class { ... }
  });

  $obj = create_object('it.is.an.example');

?>

所以,我需要一个接受这种用法的想法。我需要它,因为在我的框架中我有这条路:/modules/site/_login/models/path/to/model.php。因此,model.php需要声明一个名为site.login/path.to.model的新类。

在调用create_object()时,如果内部缓存具有$class定义(如it.is.an.example,则只返回新的类对象。如果不是,则需要加载。所以我将使用{{ 1}}内容可以快速搜索什么是类文件。

4 个答案:

答案 0 :(得分:6)

您可以使用stdClass

创建一个虚拟类
$the_obj = new stdClass();

答案 1 :(得分:6)

所以基本上你想要实现工厂模式。

Class Factory() {
  static $cache = array();

  public static getClass($class, Array $params = null) {
    // Need to include the inc or php file in order to create the class
    if (array_key_exists($class, self::$cache) {
      throw new Exception("Class already exists");
    }

    self::$cache[$class] = $class;
    return new $class($params);
  }
}

public youClass1() {
  public __construct(Array $params = null) {
     ...
  }
}

在其中添加缓存以检查重复

答案 2 :(得分:5)

在PHP 7.0中,将有anonymous classes。我不完全理解您的问题,但您的create_class()函数可能如下所示:

function create_class(string $key, array &$repository) {
    $obj = new class($key) {
        private $key;
        function __construct($key) {
            $this->key = $key;
        }
    };
    $repository[$key] = $obj;
    return $obj;
}

这将实例化一个具有匿名类类型的对象,并将其注册到$repository。要获取对象,请使用您创建的密钥:$repository['it.is.an.example']

答案 3 :(得分:0)

如果您真的需要,可以使用eval()

$code = "class {$className} { ... }";
eval($code);
$obj = new $className ();

但众神不赞成这一点。如果你这样做,你会下地狱。