Dinamicamente construção / carregar uma biblioteca de classes em PHP
-
06-07-2019 - |
Pergunta
Eu sou bastante novo em programação OO ...
Estou construindo o que acabará por vir a ser uma grande biblioteca de classes para ser usado durante todo o meu site. Claramente, carregando toda a biblioteca em cada página é um desperdício de tempo e energia ...
Então, o que eu gostaria de fazer é exigir um único arquivo de classe php "config" em cada página, e ser capaz de "chamada" ou "carregar" outras classes como necessário -. Alargando assim a minha classe de acordo com minhas necessidades
Pelo que eu sei, eu não posso usar uma função na classe de configuração para simplesmente incluir () outros arquivos, por causa de problemas de escopo.
Quais são as minhas opções? Como os desenvolvedores geralmente lidar com este problema, e qual é o mais estável?
Solução
Você pode usar __autoload()
ou criar um objeto de fábrica que irá carregar os arquivos necessários quando você precisar deles.
Como um aparte, se você está tendo problemas de escopo com seus arquivos de biblioteca, você provavelmente deve refatorar seu layout. A maioria das bibliotecas são conjuntos de classes que podem ser instanciado em qualquer âmbito.
A seguir é um exemplo da fábrica objeto muito básico.
class ObjectFactory {
protected $LibraryPath;
function __construct($LibraryPath) {
$this->LibraryPath = $LibraryPath;
}
public function NewObject($Name, $Parameters = array()) {
if (!class_exists($Name) && !$this->LoadClass($Name))
die('Library File `'.$this->LibraryPath.'/'.$Name.'.Class.php` not found.');
return new $Name($this, $Parameters);
}
public function LoadClass($Name) {
$File = $this->LibraryPath.'/'.$Name.'.Class.php'; // Make your own structure.
if (file_exists($File))
return include($File);
else return false;
}
}
// All of your library files should have access to the factory
class LibraryFile {
protected $Factory;
function __construct(&$Factory, $Parameters) {
$this->Factory = $Factory;
}
}
Outras dicas
Som como você deseja autoload e spl_autoload_register se você estiver usando as classes de bibliotecas 3o partido.