2012-03-15 17 views
7

Potrzebuję pomysłu na utworzenie anonimowej klasy na PHP. Nie wiem, jak mogę pracować.Anonimowa budowa klasy

Zobacz moje ograniczenia:

  • W PHP nie można dokonać anonimową klasę, jak funkcji anonimowej (jak class {});
  • W PHP nie masz zasięgu klasy (z wyjątkiem przestrzeni nazw, ale ma ten sam problem poniżej);
  • W PHP nie można używać zmiennych do określenia nazwy klasy (np. class $name {});
  • Nie mam dostępu do instalacji PECL runkit.

Co potrzebne i dlaczego:

No, muszę stworzyć funkcję o nazwie tj create_class() że otrzymuje klucz nazwę i anonimową klasę. Przyda mi się, ponieważ chcę używać różnych symboli klas nazw, których PHP nie może zaakceptować. Na przykład:

<?php 

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

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

?> 

Potrzebuję więc pomysłu, który zaakceptuje to zastosowanie. Potrzebuję go, ponieważ na mojej strukturze mam tę ścieżkę: /modules/site/_login/models/path/to/model.php. Tak więc, model.php trzeba zadeklarować nową klasę o nazwie site.login/path.to.model.

na wezwanie create_object() jeżeli wewnętrzny cache mają $class definicji (jak it.is.an.example po prostu wrócić nowej klasy obiektów. Jeśli nie, trzeba obciążenia. Więc będę korzystać z zawartości $class szukać fastly co jest plik klasy.

+1

Brak anonimowych lekcji PHP jest wyjątkowo restrykcyjny. – MirroredFate

+2

Możesz zajrzeć do tego pytania: http://stackoverflow.com/q/6384431/3933332 – Rizier123

+0

Dlaczego musisz używać nieprawidłowych nazw klas? Dlaczego nie możesz po prostu zastąpić tych "" przez, powiedzmy, "_"? –

Odpowiedz

4

W PHP 7.0 będzie anonymous classes. Nie do końca rozumiem pytanie, ale czynność create_class() może wyglądać następująco:

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

To będzie instancję obiektu z anonimowego typu klasy i zarejestrować ją w $repository. Aby uzyskać obiekt, użyj klucza, który go utworzył: $repository['it.is.an.example'].

6

można utworzyć klasy przy użyciu manekina stdClass

$the_obj = new stdClass(); 
+4

Nie można dołączyć metod do 'stdClass' – webbiedave

6

Więc w zasadzie chcesz zaimplementować wzorzec fabryki.

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

Dodaj cache ciągu sprawdzić duplikatów

+1

Niezupełnie. Potrzebuję metody tworzenia anonimowych klas, aby uniknąć duplikatów. Jeśli dwukrotnie ogłoszę 'foo', to się nie uda. –

0

Jeśli naprawdę potrzeba do tego można użyć eval()

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

Ale bogowie nie zatwierdzi tego. Pójdziesz do piekła, jeśli to zrobisz.