Анонимная конструкция класса - PullRequest
9 голосов
/ 15 марта 2012

Мне нужна идея, чтобы создать анонимный класс на PHP. Я не знаю, как я могу работать.

См. Мои ограничения :

  • В PHP вы не можете создать анонимный класс, например, анонимную функцию (например, class {});
  • В PHP у вас нет области видимости класса (за исключением пространств имен, но у нее та же проблема, что и ниже);
  • В PHP нельзя использовать переменные для указания имени класса (например, class $name {});
  • У меня нет доступа для установки runkit PECL.

Что мне нужно и почему :

Ну, мне нужно создать функцию с именем ie 1024 *, которая получает имя ключа и анонимный класс . Это будет полезно для меня, потому что я хочу использовать разные символы класса имен, которые 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 ]

6 голосов
/ 13 мая 2015

В 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'].

6 голосов
/ 15 марта 2012

Итак, в основном вы хотите реализовать фабричный шаблон.

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

Добавить кеш внутри для проверки на наличие дубликатов

6 голосов
/ 15 марта 2012

Вы можете создать фиктивный класс, используя stdClass

$the_obj = new stdClass();
0 голосов
/ 12 марта 2014

Если вам действительно нужно это, вы можете использовать eval()

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

Но боги не одобрят это. Ты попадешь в ад, если сделаешь это.

...