php 匿名类构造

zkure5ic  于 2023-09-29  发布在  PHP
关注(0)|答案(4)|浏览(106)

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

c8ib6hqw

c8ib6hqw1#

在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']

k0pti3hp

k0pti3hp2#

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

$the_obj = new stdClass();
gjmwrych

gjmwrych3#

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

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) {
     ...
  }
}

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

h7wcgrx3

h7wcgrx34#

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

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

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

相关问题