Вопросы по ООП

akxxiv

Новичок
Вопросы по ООП

Пытаюсь разобраться в ООП и попутно возникают вопросы (возможно дилетантские, но все же)
Первый вопрос такой.
Допустим есть класс радотающий с БД class_mysql. Как правильней поступать.

1. Создавать все классы, в которых требуется обращения к БД наследуемыми от class_mysql и обращаться $this->sql_query(...)

2. Вначале каждого класса создавать экземпляр $cMysql = new class_mysql, а потом обращаться $cMysql->sql_query(...)

3. Для каждого запроса создавать экземпляр
PHP:
$cMysql = new class_mysql('SELECT...');
$result = $cMysql->result();
 

_RVK_

Новичок
1. Это наследование.
2. Это агрегация.

Эти 2 решения применимы, и выбор зависит от архитектуры и требований. Например что если тебе придется работать с несколькими разными СУБД в приделах одного приложения? Или обеспечить легкую смену СУБД в различных версиях?

3. Так тоже можно делать, например, если необходимо абстрагировать источник данных от отстального приложения. Например так может поступать контроллер для получения данных и передачи их в представление.

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

Valdisss

Guest
Re: Вопросы по ООП

Автор оригинала: akxxiv
Пытаюсь разобраться в ООП и попутно возникают вопросы (возможно дилетантские, но все же)
Первый вопрос такой.
Допустим есть класс радотающий с БД class_mysql. Как правильней поступать.

1. Создавать все классы, в которых требуется обращения к БД наследуемыми от class_mysql и обращаться $this->sql_query(...)

2. Вначале каждого класса создавать экземпляр $cMysql = new class_mysql, а потом обращаться $cMysql->sql_query(...)

3. Для каждого запроса создавать экземпляр
PHP:
$cMysql = new class_mysql('SELECT...');
$result = $cMysql->result();
Правильней создать абстрактный класс, затем наследоваться от него, затем создать экземпляр класса и выполнять комманду, скажем, GetQuery($query).
 

Фанат

oncle terrible
Команда форума
2. Вначале каждого класса создавать экземпляр $cMysql = new class_mysql, а потом обращаться $cMysql->sql_query(...)

3. Для каждого запроса создавать экземпляр
$cMysql = new class_mysql('SELECT...');
ага
и в каждом объекте - коннект...
 

SiMM

Новичок
PHP:
class class_object{
  function class_object(&$db) {
    $this->db = $db;
  }
}

$db = new class_mysql();
$object = new class_object($db);
 

_RVK_

Новичок
Ну насколько я знаю это еще постараться нужно что бы второй коннект к базе открыть.

[m]mysql_connect[/m] - Если второй вызов функции произошёл с теми же аргументами mysql_connect(), новое соединение не будет установлено. Вместо этого функция вернёт ссылку на уже установленное соединение. Параметр new_link может заставить функцию mysql_connect() открыть ещё одно соединение, даже если соединение с аналогичными параметрами уже открыто. (с) manual
 

uliss

Новичок
Последнее время перешел на такой метод при работе с БД - о нем есть статья в PHP inside #4. "Практическое применение ORM в PHP".
Мне показалось это очень удобным и быстрым.
 

akxxiv

Новичок
т.е xчто-то типа такого делать? Или это вообще бред?
PHP:
class class_mysql
{
  var $sql_user="user";
  var $sql_passwd="password";
  var $sql_database="database";
  var $sql_host="host";

  var $sql_conn_id; 
  var $sql_query;
  var $sql_res;

 	function connect()
 	{
   		$this->sql_conn_id=@mysql_connect($this->sql_host,$this->sql_user,$this->sql_passwd);
  		if(!$this->sql_conn_id) die(....);
 		if(!@mysql_select_db($this->sql_database)) die(....);
 	}
 
  	function execute()
 	{
  		if(!$this->sql_conn_id) $this->sql_connect();	
  		$this->sql_res=mysql_query($this->sql_query,$this->sql_conn_id);
 	}
	
	function run($query)
 	{
   		$this->sql_query = $query;
   		$this->sql_execute();
 	}
	
	function result()
	{
		return $this->sql_res;
	}
}

class class_db
{
	var $query;
	var $rusult;
	
	function class_db($query)
	{
		$this->query = $query;
		$this->result=class_mysql::run($this->query);
	}
	
	function assoc()
	{
		$arr = array();
		while($row = mysql_fetch_assoc($this->result)) $arr[]=$row;
		return $arr;
	}
}

class MyClass
{
	function getResult()
	{
		$q = new class_db("SELECT ....");
		$res = $q->assoc();
	}
}
 

Сергей Тарасов

Профессор
Советую посмотреть документацию на расширение php mysqli
http://ru.php.net/mysqli
Это класс, инкапсулирующий некоторые алгоритмы работы с MySQL.
Будет полезно, как пример.

PS. Ты можешь отнаследоваться от этого класса и добавить методы, которых не хватает.
 

zerkms

TDD infected
Команда форума
Сергей Тарасов
mysqli неудобный, я бы посоветовал PDO
 

Andreika

"PHP for nubies" reader
Интерфейс - есть просто абстрактный класс, содержащий только методы.
интерфейс ну как бы немного совсем не класс

akxxiv
нее.. class_db лесом, лучше уж class_db_result, но его до тебя придумали уже
 

Сергей Тарасов

Профессор
Andreika
Обратись к Бучу или подобной литературе по основам OOD(Object Oriented Design).
zerkms
Это пример проектирования DB-Layer'а
 

Andreika

"PHP for nubies" reader
Сергей Тарасов
чтобы понять, что это одно и тоже надо прочитать подобную литературу? на практике это не понять?
 

Сергей Тарасов

Профессор
Можно. Абстрактный класс может и не обладать свойствами, согласен?
Т.е. некий класс, описывающий, например, поведение. Это и есть не что иное, как интерфейс. Строго говоря - под интерфейсом в программировании подразумевается некий набор методов, характеризующих взаимодействие объекта с внешним миром.
Ключевого слова interface нет во многих языках программирования(например, С++), однако понятие интерфейсов там широко используется: взять ту же самую COM.
 

Andreika

"PHP for nubies" reader
Сергей Тарасов
Ключевого слова interface нет во многих языках программирования
ой, им и без этого прекрасно живется с множественным то наследованием

взять ту же самую COM.
COM используется в C++... интерфейс есть в COM, в C++ интерфейса нет, поэтому они, бедняги, используют абстрактный класс.. кста, а если метод такого "интерфейса" с GUID IUnknown будет не абстрактным оно не скомпилируется чтоли?

ну а в общем если Буч сказал, значит так оно и есть.. где-то.. в каком-то теоретическом языке..
 

Сергей Тарасов

Профессор
Да они не бедняги... :)) Ключевое слово interface - вообще редкость, если честно, то не знаю больше языков, в которых оно есть... :))
В PHP5:
PHP:
interface I {
public function F();
}

class A implements I
{
public function F()
{
...
}
}
class B implements I
{
public function F()
{
...
}
}
То же самое без использования interface
PHP:
abstract class I {
abstract public function F();
}

class A extends I
{
public function F()
{
...
}
}
class B extends I
{
public function F()
{
...
}
}
Класс абстрактный только для того, чтобы подчеркнуть, что объекты такого класса - не имеют смысла! :)
 
Сверху