Модераторы: IZ@TOP, skyboy, SamDark, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> назначить объект свойству абст-му классу, ссылка на db внутри абст-го класса 
:(
    Опции темы
numerovan
Дата 16.4.2016, 08:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 549
Регистрация: 1.12.2007

Репутация: нет
Всего: 2



Здравствуйте.
Подскажите как можно сделать следующее:

1. имеется объект базы данных, например $pdo = new PDO([params]);
2. имеется абстрактный класс, например Controller. Он явл. родителем всем контроллерам в программе.

Я хочу чтоб его потомки могли обращаться к PDO, например $this->db->query("запрос");

Код

abstract class Controller{
    protected $db = NULL;
    protected $smarty = NULL;
}
class Main extends Controller{
    public function index(){
        $this->db-query();
    }
}


Пытался сделать через статические свойства или методы и что-то ни как. Есть идеи?

Добавлено через 2 минуты и 59 секунд
при этом обязательно нужно чтоб каждый потомок имел метод index();
PM MAIL   Вверх
ksnk
Дата 16.4.2016, 11:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6798
Регистрация: 13.4.2007
Где: СПб

Репутация: 1
Всего: 383



Абстрактные классы отличаются от неабстрактных только тем, что new сделать нельзя. Все остальное можно.

Разумно доопределить класс-сеттер монтажа базы данных в объект. Или пусть объект сам выковыривает из окружающей действительности необходимые параметры.

Так, например:

Код

abstract class Controller{
    privаte static $_db=NULL;  // один на всех? А че?
    protected $smarty = NULL;
// магия рулит
    function __get($name){
        if($name=='db'){
             if(is_null(self::$_db)) {
                  self::$_db=new PDO()... // откуда параметры? Из лесу, вестимо...
             } 
             $this->db=self::$_db;
             return $this->db;
        }
    }
}

class Main extends Controller{
    public function index(){
        $this->db->query();
    }
}



--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
numerovan
Дата 16.4.2016, 18:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 549
Регистрация: 1.12.2007

Репутация: нет
Всего: 2



интересную вы предложили идею

Цитата

// откуда параметры? Из лесу, 

параметры у меня фиксированны, одни.

Добавлено через 8 минут и 27 секунд
Цитата

privаte static $_db=NULL;  // один на всех? А че?

Как лучше ... может статик убрать? и чтоб для каждого потомка был свой db?

Это сообщение отредактировал(а) numerovan - 16.4.2016, 18:28
PM MAIL   Вверх
numerovan
Дата 17.4.2016, 01:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 549
Регистрация: 1.12.2007

Репутация: нет
Всего: 2



Сделал пока так:
Код

abstract class Controller{
    private static $_db        = NULL;
    private static $_smarty    = NULL;
    private static $_load        = NULL;
    
    abstract public function index();
    
    public function __get($name){
        if($name == 'db'){
            if(!isset($GLOBALS['pdo'])){
                die("Err: undefined PDO");    
            }
            if(is_null(self::$_db)){
                self::$_db = &$GLOBALS['pdo'];
            }
            
            return self::$_db;
        }
        elseif($name == 'smarty'){
            if(!isset($GLOBALS['smarty'])){
                die("Err: undefined Smarty");    
            }
            if(is_null(self::$_smarty)){
                self::$_smarty = &$GLOBALS['smarty'];
            }
            
            return self::$_smarty;
        }
        elseif($name == 'load'){
            if(!class_exists(NMSPC_CNTRLR."\VnrgLoad", false)){
                die("Err: undefined VnrgLoad");
            }
            if(is_null(self::$_load)){
                self::$_load = new VnrgLoad;
            }
            
            return self::$_load;
        }
        else{
            $trace = debug_backtrace();
         trigger_error('Неопределенное свойство в __get(): '.$name.' в файле '.$trace[0]['file'].' на строке '.$trace[0]['line'], E_USER_NOTICE);
            return NULL;
        }
    }
}
final class VnrgLoad{
    public function model($modelName, $aArgs = array()){
        $file    = DIR_MODELS."/class.".$modelName.".php";
        
        if(in_array($modelName, get_declared_classes())){
            if(sizeof($aArgs)){
                eval("return new \$modelName('".implode("','", $aArgs)."');");    
            }
            else{
                return new $modelName();
            }
        }
        elseif(file_exists($file)){
            include_once($file);
            
            if(sizeof($aArgs)){
                eval("\$TMP = new \$modelName('".implode("','", $aArgs)."');");
                return $TMP;
            }
            else{
                return new $modelName();
            }
        }
        else{
            return false;    
        }    
    }
    public function lang($class, $method){
        $path = DIR_LANGS."/".LANG."/".$class."/".$method.".php";
        
        if(!file_exists($path)){
            die("Err: not found lang (".$class."/".$method.".php)");    
        }
        
        return include_once($path);
    }
}


Можете как-то разкритикировать данный код?
Ниже абстрактного класса Controller вынужден был создать дополнительный класс VnrgLoad, но хотел бы его не создавать а как-то разместить в абстрактном классе Controller. Он мне нужен чтоб подгружать модели и языки в программу. Можно ли такое реализовать только в абстрактном классе Controller?
Что вы думаете по поводу перечачи аргументов в создоваемый объект, стоит ли вообще так делать или нет?
Код

if(sizeof($aArgs)){
                eval("return new \$modelName('".implode("','", $aArgs)."');");    
            }
            else{
                return new $modelName();
            }

PM MAIL   Вверх
ksnk
Дата 17.4.2016, 15:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6798
Регистрация: 13.4.2007
Где: СПб

Репутация: 1
Всего: 383



То есть имеются обязательные глобальные объекты db, smaty и их статические ссылки в контроллере? Зачем дублировать?
Зачем еще один класс, если можно методы model и lang определить в магии контроллера? Лучше, конечно, не просто выдавать в магическом методе ссылку, а сформировать заодно и собственный атрибут с таким именем, чтобы  излишней магии избежать. Также, появится потенциальная возможность переопределить db и smarty для отдельного контроллера.
Все что делает lang - подгружает нужную модель в зависимости от языка? А если модель пока недостаточно локализована? Языка по умолчанию нет? Вообще - вместо die разумнee использовать Exception, его хотя бы перехватить можно.

eval - должен быть красной тряпкой для любого вменяемого программиста. Для каждого такого применения нужно ну очень убедительное объяснение, что по другому сделать нельзя. В этом случае можно зафиксировать количество параметров при вызове конструктора, либо сделать конструктор с пустыми параметрами и дополнительный метод `init` с нужным количеством параметров. Тогда все можно решить именем класса `из переменной` и  call_user_func_array. 


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Google
  Дата 24.5.2019, 02:15 (ссылка)  





  Вверх
  
Ответ в темуСоздание новой темы Создание опроса

Внимание: данный раздел предназначен для решения сложных, нестандартных задач.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Для профи | Следующая тема »


 




[ Время генерации скрипта: 0.1444 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.