Por lo que veo, estas haciendo una clase que te ayude a cargar e instanciar otras clases, pero creo que te estas haciendo un lío ya que puedes usar la función
spl_autoload_register que precisamente te permite cargar clases cuando haces referencia a ellas, te dejo un ejemplo:
Código PHP:
Ver original<?php
//Ojo este ejemplo es muy sencillo y es solo para explicar
$file = sprintf('%s/lib/%s.php',__DIR__
, $class);
require_once($file);
} else {
throw new Exception("Cant load file: $file");
}
});
//Instanciar clase qie se encuentra en la carpeta lib/
try{
$class = new A();
$class->display();
}catch (Exception $e) {
echo $e->getMessage();
}
Cuando tu intentas crear una nueva instancia spl_autoload_register intenta buscar un archivo que tiene el nombre de la clase, de fallar lanza un excepción. En nuestro ejemplo intenta instanciar la clase A que tiene como archivo A.php.
Con esto tu puedes simplificar tu clase a esto:
Código PHP:
Ver originalclass Mi_Clase_Principal{
private $clases = array();
function clase
($clase, $parametros = array()){ if(isset($this->clases[$clase]) && in_array($clase, $this->clases[$clase])){ return $this->clases[$clase];
}
$instancia = new $clase;
}
$this->clases[$clase] = $instancia;
return $this->clases[$clase];
}
exit("La clase '$clase' no existe"); }
}
El cuerpo de la segunda condición no requiere que compruebes si existe el constructor si agregaste parametros por defecto en la clase que estas queriendo instanciar, así que puedes hacer algo como lo siguiente
Código PHP:
Ver originalclass Mi_Clase_Principal{
private $clases = array();
function clase
($clase, $parametros = array()){
if(isset($this->clases[$clase]) && in_array($clase, $this->clases[$clase])){ return $this->clases[$clase];
}
$instancia = (empty($parametros)) ?
new $clase : new $clase(...$parametros);
$this->clases[$clase] = $instancia;
return $this->clases[$clase];
}
throw new Exception("La clase $clase no existe");
}
}
Si mueves tu clase a un directorio lib como en nuestro ejemplo y creas una clase para probar; en mi ejemplo mi clase es de esta forma:
Código PHP:
Ver original//archivo A.php en lib/
class A {
private $x;
private $y;
public function __construct($x = 'hola', $y = 'mundo')
{
$this->x = $x;
$this->y = $y;
}
public function display()
{
echo "$this->x $this->y";
}
}
Y juntamos todo, nuestro ejemplo puede quedar algo como esto
Código PHP:
Ver original $file = sprintf('%s/lib/%s.php',__DIR__
, $class);
require_once($file);
} else {
throw new Exception("Cant load file: $file");
}
});
//Instanciar clase qie se encuentra en la carpeta lib/
try{
$cp = new Mi_Clase_Principal();
$instancias = $cp->clase('A', [1, 2]);
}catch (Exception $e) {
echo $e->getMessage();
}
Espero que el ejemplo te haya ayudado, lo siguiente es que ahora hagas tu propia implementación de autoloading y que mejores la clase Mi_Clase_Principal.