2013-02-14 3 views
0

я в настоящее время есть ручной метод для регистрации помощников в мой базовый класс соединений, который идет в значительной степени следующим образом: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); 
      } 
     } 
    } 
} 

Это, как представляется, включают в себя и зарегистрировать объекты абсолютно хорошо сейчас, будь то это решение является «хорошим» или нет, я не могу знать без ввода или тестирования.

ответ

2

Код может выглядеть примерно так, но зачем вам это нужно?

public function register_helper($name, $helper) 
{ 
     if(!isset($this->helpers->$name, $helper)) 
     { 
      $this->load_class($helper); 
      // tack on a helper.. 
      $this->helpers->$name = new $helper($this); 
     } 
} 

private function load_class($class) 
{ 
    if(!class_exists($class, false)) { 
      $class_file = PATH_SOME_WHERE . $class . '.php'; 
      require $class_file; 
    } 
} 
+0

В основном я стараюсь, чтобы все было просто и, где возможно, автоматизировано. Каждая таблица в моей БД будет в основном иметь собственный собственный класс с методами, упрощающими использование методов подключения. Я ищу простейший эффективный способ авто-волшебства, включая помощников (содержащийся в конкретном каталоге), а затем их регистрацию. Я посмотрю, смогу ли я включить предлагаемое решение в цикл или что-то еще. –

+0

Рабочее решение, разработанное из вашего предложения Vic, поэтому приняло его как принятое и обновленное сообщение. Тем не менее любой дополнительный вклад от кого-то был бы более чем приветствуем, ура! :) –

+0

Я получаю вспомогательный дизайн, который вы хотите, но я не понимаю, почему часть загрузки класса будет проблемой. Файлы классов в вашем проекте должны быть организованы так, чтобы любой из 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

Смежные вопросы