12

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

查看我的限制

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

我需要什么,为什么

好吧,我需要创建一个名为 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它只是返回新的类对象。如果没有,则需要加载。所以我将使用$class内容快速搜索什么是类文件。

4

4 回答 4

9

在 PHP 7.0 中会有匿名类。我不完全理解您的问题,但您的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']

于 2015-05-13T14:58:49.723 回答
6

您可以使用 stdClass 创建一个虚拟类

$the_obj = new stdClass();
于 2012-03-15T19:11:32.547 回答
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) {
     ...
  }
}

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

于 2012-03-15T19:15:02.580 回答
2

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

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

但神不会同意的。如果你这样做,你会下地狱。

于 2014-03-12T18:11:16.023 回答