2012-03-15 18 views
7

Necesito una idea para crear clases anónimas en PHP. No sé cómo puedo trabajar.Construcción de clase anónima

Ver mis limitaciones:

  • En PHP no se puede hacer clase anónima, como función anónima (como class {});
  • En PHP no tiene ámbito de clase (excepto en los espacios de nombres, pero tiene el mismo problema a continuación);
  • En PHP no puede usar variables para especificar el nombre de clase (como class $name {}); No tengo acceso para instalar runkit PECL.

Lo que necesito, y por qué:

Bueno, necesito crear una función llamada es decir create_class() que recibe un nombre y una clave de clase anónima . Me será útil porque quiero usar símbolos de clases de nombres diferentes que PHP no puede aceptar. Por ejemplo:

<?php 

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

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

?> 

Entonces, necesito una idea que acepte este uso. Lo necesito porque en mi marco tengo esta ruta: /modules/site/_login/models/path/to/model.php. Entonces, el model.php necesita declarar una nueva clase llamada site.login/path.to.model.

En llamada create_object() si el caché interna tiene una definición $class (como it.is.an.example simplemente devuelve el nuevo objeto de la clase. Si no es así, la necesidad de carga. Así que voy a utilizar el contenido $class para buscar rápidamente lo que es el archivo de clase.

+1

La falta de clases anónimas de PHP es extremadamente restrictiva. – MirroredFate

+2

Le recomendamos que consulte esta pregunta: http://stackoverflow.com/q/6384431/3933332 – Rizier123

+0

¿Por qué tiene que utilizar nombres de clase no válidos? ¿Por qué no puedes simplemente sustituir estos "." Por, digamos, "_"? –

Respuesta

4

En PHP 7.0 habrá anonymous classes. No entiendo totalmente su pregunta, pero su función create_class() podría tener este aspecto:

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

Esto creará una instancia de un objeto con un tipo de clase anónima y registrarlo en el $repository. Para obtener un objeto, use la clave con la que lo creó: $repository['it.is.an.example'].

6

usted puede crear una clase ficticia usando stdClass

$the_obj = new stdClass(); 
+4

No se pueden adjuntar métodos a 'stdClass' – webbiedave

6

Así que básicamente se desea implementar un patrón de fábrica.

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

Añadir un caché dentro para comprobar si hay duplicados

+1

No exactamente. Necesito un método para crear clases anónimas, para evitar duplicados. Si declaro 'foo' dos veces, fallará. –

0

Si realmente necesita de eso, usted podría utilizar eval()

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

Pero los dioses no se apruebe el presente. Irás al infierno si lo haces.

Cuestiones relacionadas