пытаюсь понять ООП

danilabergin

Новичок
пытаюсь понять ООП

Начинаю практически с нуля. Достаточно всякой литературы прочитал про идеологию ООП. Небольшая путаница в голове образовалась, вопрос наверняка элементарный, но нужен пинок в правильную сторону. Если на конкретном примере подскажет комьюнити пхпклуба, было бы здорово.

К примеру имеем...

бд-класс Журнал

метод ДобавитьЗапись
метод РедактироватьЗапись
метод УдалитьЗапись
метод ПолучитьЗапись.


и есть интерфейсная какая-то приблуда, которая создает экземпляр этого класса, использует его методы и показывает все это безобразие...

Я пытаюсь использовать adodb в качестве api для доступа к субд. Так вот, наверное, правильней будет бд-класс "журнал" наследовать от бд-класса adonewconnection? дабы не создавать в каждом бд-классе экземпляры класса адодб, т.е. считаем, каждый раз коннектится к бд. Делать глобальной переменную $db = AdoNewConnection() и использовать уже её в своих бд классах тоже будет не верным ?

Так вот. Остановимся на той, идее что adonewconnection родительский для каждого нашего бд-класса. Но как это будет работать, не совсем понятно.


class AdoNewConnection
function __construct;
function connect;
function execute;
...

class Journal extend AdoNewConnection
function __construct;
function get_records;
function del_records;
...

class OtherBDClass extend AdoNewConnection
function __construct;
function get_records;
function del_records;
...

По идее, в конструкторе бд-классов вызывается parent::__construct. А в этом самом родительском конструкторе идет коннект к базе и т.п. в результате чего мы можем в нашем бд классе выполнять sql к базе и т.п.

Но если мы используем в нашем интерфейсном модуле два бд-класса, получается выполняется подключение к бд два раза?! Что, как мне кажется не правильно.

Если кто-то все-таки понял проблему моего понимания буду рад услышать напутственные слова в мир ооп.
 

uliss

Новичок
Такое наследование не нужно.
Журнал не является частным случаем подключению к БД.
Также как двигатель не является родителем машины :)
Здесь нужна композизиция.
 

danilabergin

Новичок
Т.е. если я правильно понимаю термин композиция. Это будет выглядеть примерно так.

class Journal{

private db: ADONewConnection;

...

db = new ADONewConnection();

}

т.е. все-таки. в каждом бд классе своё подключение к бд?
 

uliss

Новичок
Зачем в каждом?

создаешь абстрактного родителя "журнала" и в нем определяешь объект для взаимосвязи с БД. И от него наследуешь уже "реальный" журнал.
 

danilabergin

Новичок
Бр... лучше кодом :)

class Journal{
var db;
function a1;
function b2;
}
...
$db = AdoNewConnection();

$jr = new Journal();
$jr->db = & $db;

Типа вроде этого?
 

Sam

Новичок
да, типа этого
хотя менять состояние объекта напрямую обращаясь к его полям - чаще всего неправильно
 

danilabergin

Новичок
Автор оригинала: Sam
да, типа этого
хотя менять состояние объекта напрямую обращаясь к его полям - чаще всего неправильно
Гм. ну предложите правильную оо-модель.

Также как двигатель не является родителем машины
Двигатель - Ходовая - Подвеска ...
Аккумулятор - Генератор - Фары ...
Кузов - Двери ...
Кузов - Салон ...

это так, о-очень условно :)

и вот это все машина. поэтому говорить о том, что машина потомок двигателя, конечно, нельзя. это все не объект, а уже законченная система, но к примеру класс доступа к бд, может быть родителем для бд-класса Журнал. Потому как журнал будет юзать все методы adodb по выполнению sql'я. Или я не прав и опять все не так понимаю :) ?

возвращаясь к критике Sam'a. Мне и самому не очень нравится идея определения свойства подключения к бд повсеместным. Ведь, придется определять каждый раз, когда будет создаваться абстрактный класс, того же Журнала... что, по-моему, не очень красиво.
 

whirlwind

TDD infected, paranoid
>возвращаясь к критике Sam'a. Мне и самому не очень нравится идея определения свойства подключения к бд повсеместным. Ведь, придется определять каждый раз, когда будет создаваться абстрактный класс, того же Журнала... что, по-моему, не очень красиво.

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

danilabergin

Новичок
Кое-какие трудности возникли все же. Проблема в том, что свойство template::tpl не видно, где его хотелось бы видеть.
Комментарии в коде... где чего и как должно быть :)

Базовый класс "Шаблон". Cоздаем экземпляр smarty.
PHP:
class template { 
	private static $instance = null;	
	public $tpl;    	

	protected $template_group = 'system';
	
    function __set($name, $value) {		
		switch ($name) {
			case 'tpl':	$this->$name = $value;
			case 'template_group':	$this->$name = $value;			
			default:    			$this->tpl->$name = $value;			
		}		
    }    

	function __get($name) {	
		switch ($name) {
			case 'tpl':	return $this->tpl;
			default:	return $this->tpl->$name;
			break;	
		}
    }	
	
    private function __construct() {
   		//создаем
   		$this->tpl = new Smarty();
   		
   		$this->tpl->compile_check   = sys_smarty_compile_check;	 
   		$this->tpl->caching  		= sys_smarty_caching;
   		$this->tpl->template_dir    = sys_smarty_template_dir;		
   		$this->tpl->compile_dir     = sys_smarty_compile_dir;		
   		$this->tpl->config_dir      = sys_smarty_config_dir;	
   		$this->tpl->cache_dir  		= sys_smarty_cache_dir;
   		$this->tpl->left_delimiter  = sys_smarty_left_delimiter;
   		$this->tpl->right_delimiter = sys_smarty_right_delimiter;
    }	
		
    public static function singleton() {
        if (!isset(self::$instance)) {            
            self::$instance = new template();
        }
        return self::$instance;
    }
    
    public function __clone() {
        trigger_error('Клонирование "'.__CLASS__.'" запрещено.', E_USER_ERROR);
    }   
    
	public function display($tpl_name) {
   		//не видим
   		var_dump($this->tpl);
		$this->tpl->display($this->template_group.'/'.$tpl_name.'.tpl');		
	}    	
}
Наследуемый от него "Шбл_Пользователь"
PHP:
class tpl_user extends template { 
	public function __construct() {
		$this->singleton();	
		$this->template_group = 'user';
	}	
}
Пытаемся все это безобразие завести...
PHP:
	include_once('obj/user.lib/login.db.php');
	include_once('obj/user.lib/login.face.php');
	
	$login = new tpl_user();
	$login->display('login.form');
 

whirlwind

TDD infected, paranoid
Ну правильно. У вас singelton какой объект настраивает? А какой объект вы получаете при наследовании?

-~{}~ 04.10.06 15:31:

Не делайте template сингельтоном
 
Сверху