я в настоящее время есть ручной метод для регистрации помощников в мой базовый класс соединений, который идет в значительной степени следующим образом:PHP самозарядные хелперы внутри класса
class db_con
{
// define the usual suspect properties..
public $helpers; // helper objects will get registered here..
public function __construct()
{
// fire up the connection or die trying
$this->helpers = (object) array();
}
public function __destruct()
{
$this->helpers = null;
$this->connection = null;
}
// $name = desired handle for the helper
// $helper = name of class to be registered
public function register_helper($name, $helper)
{
if(!isset($this->helpers->$name, $helper))
{
// tack on a helper..
$this->helpers->$name = new $helper($this);
}
}
// generic DB interaction methods follow..
}
Затем вспомогательный класс, такой как ..
class user_auth
{
public function __construct($connection){ }
public function __destruct(){ }
public function user_method($somevars)
{
// do something with user details
}
}
таким образом, после создания $connection
объекта, я бы затем вручную зарегистрировать помощника следующим образом:
$connection->register_helper('users', 'user_auth');
Теперь, на мой вопрос, могу ли я как-то авторизовать вспомогательные классы внутри базового класса подключения? (в пределах метода register_helper()
или аналогичного). Или я ограничена загрузкой их вручную или через внешний автозагрузчик какой-либо формы?
Приносим извинения, если этот вопрос был дан ответ в другом месте, но я просто его не нашел (не из-за отсутствия попытки), и у меня нет никакого реального опыта автозагрузки чего-либо еще.
Любые помощь или рекомендации очень ценятся, спасибо заранее! :)
EDIT: По предложению Вика это рабочее решение, которое я придумал для регистрового метода ..
public function register_handlers()
{
$handler_dir = 'path/to/database/handlers/';
foreach (glob($handler_dir . '*.class.php') as $handler_file)
{
$handler_bits = explode('.', basename($handler_file));
$handler = $handler_bits[0];
if(!class_exists($handler, false))
{
include_once $handler_file;
if(!isset($this->handle->$handler, $handler))
{
$this->handle->$handler = new $handler($this);
}
}
}
}
Это, как представляется, включают в себя и зарегистрировать объекты абсолютно хорошо сейчас, будь то это решение является «хорошим» или нет, я не могу знать без ввода или тестирования.
В основном я стараюсь, чтобы все было просто и, где возможно, автоматизировано. Каждая таблица в моей БД будет в основном иметь собственный собственный класс с методами, упрощающими использование методов подключения. Я ищу простейший эффективный способ авто-волшебства, включая помощников (содержащийся в конкретном каталоге), а затем их регистрацию. Я посмотрю, смогу ли я включить предлагаемое решение в цикл или что-то еще. –
Рабочее решение, разработанное из вашего предложения Vic, поэтому приняло его как принятое и обновленное сообщение. Тем не менее любой дополнительный вклад от кого-то был бы более чем приветствуем, ура! :) –
Я получаю вспомогательный дизайн, который вы хотите, но я не понимаю, почему часть загрузки класса будет проблемой. Файлы классов в вашем проекте должны быть организованы так, чтобы любой из spl_autoloaders мог загружать файлы классов (http://php.net/manual/en/function.spl-autoload.php). Существует также четко определенный стандарт по этому вопросу https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-0.md – xCander