после прочтения ответов я переписал свой вопрос.
Допустим, у меня есть теоретическое php-приложение, которое использует объекты, которые делают разные вещи.Для каждой страницы, загружаемой приложением, будут запускаться разные сценарии.
Теперь я создал простой сценарий php, который создает простой объект.(все это выдумано, я просто пытаюсь понять это, прежде чем кодировать его)
$user = new userClass($db);
$user->login($credentials);
все хорошо, и я даже могу повторить процедуру несколько раз после создания пользовательского класса
$user = new userClass($db);
$user->login($credentials);
...
$user->login($credentials2);
Теперь представьте, если эти 2 части разделены на 2 разных файла php.
file1:
$user = new userClass($db);
$user->login($credentials);
file2:
$user->login($credentials2);
include file1
include file2
, если они выполняются по порядку, все в порядке, но если нет, или если file1 нетвключается вообще ...
file2:
$user->login($credentials);
file1:
$user = new userClass($db);
$user->login($credentials2);
include file2
include file1
тогда это не сработает ... они должны поддерживать порядок, поэтому давайте создадим основной php-файл, который загружается несмотря ни на что.
main file:
$user = new userClass($db);
file1:
$user->login($credentials);
file2:
$user->login($credentials2);
(например, включаемые файлы с автозагрузкой) включают в себя главный включаемый файл1, включающий файл2 или включают основной включаемый файл2, включающий файл1 или включают основной включаемый файл2
теперь файлы 1 и 2 можно загружать в любом порядке, а один независит от другого, но что, если и file1, или file2 не нужны?
main file:
$user = new userClass($db);
//nothing else gets loaded
, тогда основной файл также не нужен, и окажется, что это источник ресурсов, уверен, если его один класс - это не проблема,а что если главный файОн загружает сотни классов, которые никогда не привыкают?
совсем не элегантно.
Тогда давайте попробуем сделать это по-другому, давайте полностью удалим основной файл и сделаем это так (нижепример того, чего я хочу достичь):
file1:
if(!is_object($user)){
$user = new userClass($db);
}
$user->login($credentials);
file2:
if(!is_object($user)){
$user = new userClass($db);
}
$user->login($credentials2);
конечно, это работает, но не элегантно, не так ли?
давайте попробуем это с перегрузкой метода ...
class loader {
private $objects;
private $db;
function __construct($db){
$this->objects = array();
$this->db = $db;
}
function __get($name){
if(!isset($this->objects[$name])){
return $this->objects[$name] = new $name($this->db);
}
}
}
main file:
$loader = new loader($db);
file1:
$loader->user->login($credentials);
file3:
$loader->user->login($credentials3);
file2:
$loader->user->login($credentials2);
file4:
$loader->user->login($credentials4);
, кажется, работает, пока вы не поймете, что больше не можете передавать объектам, созданным таким образом, любую другую переменную, кроме $ db.Это означает, что класс загрузчика ограничен для использования только с пользовательским классом (например), потому что использование класса загрузчика с любым другим классом потребует редактирования класса загрузчика
и простого сценария, подобного этому:
$user = new userClass($this->db);
$user->login($credentials);
$form = new formClass($_POST);
$form->process($info);
потребуется 2 отдельных класса загрузчика или как минимум 2 метода в классе загрузчика
class loader {
private $objects;
private $db;
function __construct($db){
$this->objects = array();
$this->db = $db;
}
function getuserclass($name){
if(!isset($this->objects[$name])){
return $this->objects[$name] = new $name($this->db);
}
}
function getformclass($name){
if(!isset($this->objects[$name])){
return $this->objects[$name] = new $name($_POST);//just an unrealistic example.
}
}
}
main file:
$loader = new loader($db);
file1:
$loader->getuserclass('user')->login($credentials);
file3:
$loader->getformclass('form')->process($info);
, но это тоже не элегантно.
Как это действительно должно быть сделано?