Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Для профи > Сомнения при проектировании движка


Автор: Muchenik 12.1.2007, 23:24
У меня возникли сомнения в правильности проектирования. Хотелось бы узнать точку зрения народа.

Ситуация такая. Есть главный класс движка ( к примеру Admin ), который в зависимости от выбраой опции подключает модуль. Имя опции одинаковое с именем файла, в котором хранится модуль.


Код

class Admin{
    .................
    public function run(){
         $op_name = 'Users'   ; /* имя опции и файла модуля */
         require_once $op_name.".php";  /* подключаем класс модуля*/ !!!!!! вот в этой строчке у меня сомнения
    }
    .....
    
}


Проблемная строка вкладывает определение класса прямо в тело рабочей функции. Нормальное ли это явление или нет?  Других вариантов я не вижу.

Надеюсь внятно высловился. 


Автор: Mal Hack 12.1.2007, 23:29
Думаю, что это не шибко хорошо. 
Я вот делал так (вырезка из кода главного файла):
Код

<?php

    if( ! file_exists( "../cfg.php" ) )
    {    exit( "Configurtion file not found.");    }
        
    require( "../cfg.php" );
    
    $glURI = glGetURI( $_SERVER['REQUEST_URI'] , C_URL_ADMIN );
   
        if( 
            ! file_exists( C_PATH_ADMIN . "lng/" . C_LANGUAGE . "/lng." . C_LANGUAGE . ".global.php" ) ||
            ! file_exists( C_PATH_ADMIN . "skin/skin.global.php" ) ||
            ! file_exists( C_PATH_ADMIN . "sql/" . DB_DRIVER . "/sql.global.php" ) ||
            ! file_exists( C_PATH_ADMIN . "kernel.php" )
        )
        {    exit( "One or more system files not found.");    }

        require( C_PATH_ADMIN . "lng/" . C_LANGUAGE . "/lng." . C_LANGUAGE . ".global.php" );
        require( C_PATH_ADMIN . "skin/skin.global.php" );
        require( C_PATH_ADMIN . "sql/" . DB_DRIVER . "/sql.global.php" );
        require( C_PATH_ADMIN . "kernel.php" );

        if( ! empty( $glURI[0] ) )
        {
            if( 
                ! file_exists( C_PATH_ADMIN . "lng/" . C_LANGUAGE . "/lng." . C_LANGUAGE . "." . $glURI[0] . ".php" ) ||
                ! file_exists( C_PATH_ADMIN . "skin/skin." . $glURI[0] . ".php" ) ||
                ! file_exists( C_PATH_ADMIN . "sql/" . DB_DRIVER . "/sql." . $glURI[0] . ".php" ) ||
                ! file_exists( C_PATH_ADMIN . "ext/ext." . $glURI[0] . ".php" )
               )
            {    exit( "One or more modul files not found.");    }
            else 
            {
                include( C_PATH_ADMIN . "lng/" . C_LANGUAGE . "/lng." . C_LANGUAGE . "." . $glURI[0] . ".php" );
                include( C_PATH_ADMIN . "skin/skin." . $glURI[0] . ".php" );
                include( C_PATH_ADMIN . "sql/" . DB_DRIVER . "/sql." . $glURI[0] . ".php" );
                include( C_PATH_ADMIN . "ext/ext." . $glURI[0] . ".php" );
                
                $Modul = new clModul( $lng_modul );
            }
        }
        else 
        {    
            $Modul = null;    
            $lng_modul = array();
        }
        
        $Kernel = new clKernel( $Modul , $PDO , $lng_global , $glURI );
    }
 
?>

Автор: Glip 12.1.2007, 23:57
мне кажется или дублирование кода?

Автор: Muchenik 12.1.2007, 23:59
Да хотелось как можно строже придержаться ООП. 
Главный файл у меня такого плана:

Код

$admin = new Admin();
$admin->run();


Я наверное сделаю так
Код

class Admin{
  function __construct(){
   /* тут определю какой модуль мне поключать */
  }

   public function includeModuleSource(){
        require_once "имя файла модуля";
  }
}


А потом в главном файле

Код

$admin = new Admin();
$admin->includeModuleSource(); /* подключаю код класса */
$admin->run();


Добавлено @ 00:02 
Цитата(Glip @ 12.1.2007,  23:57)
мне кажется или дублирование кода?

Поконкретней плиз. Что, где, почему?

Автор: Glip 13.1.2007, 00:04
а __autoload не подойдет?

http://ru.php.net/manual/en/language.oop5.autoload.php

Добавлено @ 00:05 
Muchenik, дублирование, это я про пример Mal Hack 

Автор: Mal Hack 13.1.2007, 01:30
Цитата(Glip @  13.1.2007,  00:04 Найти цитируемый пост)
Muchenik, дублирование, это я про пример Mal Hack  

Никакого дублирования там нет. Одно дело - главные файлы, другое дело модульные.

Цитата(Muchenik @  12.1.2007,  23:59 Найти цитируемый пост)
Да хотелось как можно строже придержаться ООП. 

А что у меня это нет? 

Автор: Muchenik 16.1.2007, 17:30
Цитата(Glip @ 13.1.2007,  00:04)
а __autoload не подойдет?

http://ru.php.net/manual/en/language.oop5.autoload.php

Добавлено @ 00:05 
Muchenik, дублирование, это я про пример Mal Hack

Дело в том, что помимо самого модуля (класса) мне нужно подгружать настройки для этого модуля из отдельного файла и использовать их как глобальные переменные. Т.е. примерно так:

Код

function __autoload($class_name){
    
    /* load module config */
    if (file_exists(ADMIN_MOD_DIR.$class_name.'/'.$class_name.'.config.php')){
        require_once ADMIN_MOD_DIR.$class_name.'/'.$class_name.'.config.php';
    }
    
    /* load module source */
    require_once ADMIN_MOD_DIR.$class_name.'/'.$class_name.'.class.php'; 
}


Но  __autoload загружает все в свою область видимости и я недоберусь к конфигу модуля.  Как это можно обойти???

Автор: Mal Hack 16.1.2007, 17:38
Muchenik, делай как я показал выше и будет тебе счастье.

Автор: Nchanged 23.1.2007, 11:47
Господа, вы только засоряете код этими классами, которые занимаются совершенно ненужными действиями.

У меня модули подключаются в завимимости от $_GET["mod"]; Т.е следущим образом:

Код

switch ($mod) {
case "main":
    include_once("./system/img.php");
    break;
 }


Это сделано на системный файлы, типа запрос на картинку и пр. А так - все данные хрянятся в Mysql. По всем модулям.

Автор: AztEK 23.1.2007, 14:51
Это ущербный подход. Нормально масштабируемый проект так не сделать.

Автор: Vaulter 23.1.2007, 15:29
главный класс это вообще звучит как нонсенс PHP ООП smile
ЗАЧЕМ? как уже спросили выше.
__autoload + несколько вспомогательных классов + умело сделанная структура модулей+шаблонов+настроек
позволят Вам построить достаточно сложную систему весьма быстро 
используя (по желанию) как чистый ООП так и ОПП (обьектно процедурный подход)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)