Instanciar una clase no incluida ni referenciada previamente

Hola,

estoy creando un framework php propio, inspirándome en las funcionalidades de symfony pero en plan sencillo, con el fin de aprender más php.

El caso es que estoy atascado en la parte de obtener una instancia de un repositorio personalizado, referenciado desde un archivo de configuración (yaml). De esta forma consigo tener acceso a la ruta del archivo que contiene la clase y el nombre completo de la clase. Pero al no tener un use, el autoload no me incluye la clase.

Esto necesito hacerlo desde una clase EntityManager y claro no puedo meter un "use" dentro de un método de una clase...

He buscado en el código de Doctrine y he encontrado algo parecido a lo que yo hago en su clase DefaultRepositoryFactory, pero no veo cómo lo consigue solucionar.

El código al que me refiero es este:

/**
     * Create a new repository instance for an entity class.
     *
     * @param \Doctrine\ORM\EntityManagerInterface $entityManager The EntityManager instance.
     * @param string                               $entityName    The name of the entity.
     *
     * @return \Doctrine\Common\Persistence\ObjectRepository
     */
    protected function createRepository(EntityManagerInterface $entityManager, $entityName)
    {
        $metadata            = $entityManager->getClassMetadata($entityName);
        $repositoryClassName = $metadata->customRepositoryClassName;
 
        if ($repositoryClassName === null) {
            $configuration       = $entityManager->getConfiguration();
            $repositoryClassName = $configuration->getDefaultRepositoryClassName();
        }
 
        return new $repositoryClassName($entityManager, $metadata);
    }

Yo he estado buscando pero no veo por dónde va la cosa...

Gracias y felices fiestas :)

Respuestas

#1

Buenas, no hace falta hacer use para cargar una clase php con namespace, solo debes indicar todo el namespace al momento de crear la instancia:

<?php
 
$instancia1 = new Psr\Logger();
 
$clase = 'Psr\Logger';
$instancia2 = new $clase();

Hace un tiempo tambien estuve jugando con la creación de un micro micro ORM de pruebas, https://github.com/manuelj555/orm

Que implementa el uso de repositorios tambien, y acá está el link del código de como se resuelve la creación del repositorio:

https://github.com/manuelj555/orm/blob/master/lib/Manuelj555/ORM/Connection.php#L145

En este caso lo que hice fué que el repositorio propio se definia como una constante de la clase "entidad", y si dicha constante existe, se usa para instanciar el repo, de lo contrario se instancia un repo por defecto.

#2

gracias @manuel_j555, al usar el nombre completo de la clase si me la carga. De paso he visto otras cosas interesantes en el código que me has pasado.

Un saludo.