Помогите начинающиму с ООП.

alexander.pro

Новичок
Помогите начинающиму с ООП.

Добрый вечер!
До недавнего момента я изучал PHP лишь со стороны процедурного подхода, наконец добрался и до ООП, даже книгу себе приобрёл. Это мой первый опыт написания какого либо класса. после книжных... Хотелось бы узнать ваше мнение...
В том ли направлении я иду?
Насколько правильно со стороны синтаксиса написан код?
PHP:
class SQL_Entry
 {
 	private $host = "localhost";
 	private $login = "root";
 	private $data = " ";
 	public $result = array();

 	function SQL_Ent_Connect($db)
 	{
 		$connect = mysql_connect($this->host,$this->login);
 		$this->data = mysql_select_db($db);
    }

    function SQL_Ent_Check()
    {
    	if (empty($this->data)){
    		echo ("Ошибка");
        }
        else{
        	echo ("Удача");
        }
    }
 }
 

dimagolov

Новичок
alexander.pro, ты не нам, а интерпретатору пхп задавай этот вопрос. проверять синтаксис это его первейшая обязанность.
 

alexander.pro

Новичок
Да я наверное неправильно выразился, я имел в виду правильность самого кода... По моему мнению криво...
 

pilot911

Новичок
вообще вот это неправильно public $result = array();

все внутренние переменные-члены класса должны быть protected, имхо

возвращать результат должна функция

плюс еще - зачем такие большие названия функций: SQL_Ent_Connect и тп.. достаточно Connect
 

fixxxer

К.О.
Партнер клуба
ну ты сам подумай, что это у тебя за класс, какие у него обязанности и что он должен уметь делать.

лучше не пиши сразу класс, а сначала распиши его интерфейс. вот для работы с базой что по идее удобно: выполнить запрос, получить набор строк (или одну строку или столбец), начать транзакцию, завершить транзакцию и тп

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

а еще скажи что за книжка, может ее вообще читать нельзя =)

(в сторону: кто подумал "тдд" - помолчите, а)
 

alexander.pro

Новичок
fixxxer Книжка "Обьектно Ориентировочное Программирование на PHP5"

PHP:
function SQL_Ent_Select($table,$group,$key)
    {
    	$entry = "select*from $table where $group = $key";
    	$sql = mysql_query($entry);
    	$this->result = mysql_fetch_array($sql);
    }
pilot911 Пожалуйста напишите как через protected... Я не совсем понимаю...
 

pilot911

Новичок
изменил с private на protected - потому что вдруг захочется наследовать класс, а ты, по сути, запрещаешь в наследуемом классе обращаться к $переменным класса-родителя.. в данном случае это не нужно

PHP:
class SQL_Entry {
    
	protected $last_error 	= array();
	protected $debug 		= false;
 

	function dbConnect($host, $login, $password)	{
		try	{
			if (!mysql_connect($host, $login, $password))
 				throw new Exception('Failed to connect to database');

 		} catch (Exception $e) {
       		$this->setError($e, __CLASS__, __METHOD__);
        }
    }

	function dbSelect($db)	{
		try	{
			if (!mysql_select_db($db))
 				throw new Exception('Failed to select database');
 		} catch (Exception $e) {
       		$this->setError($e, __CLASS__, __METHOD__);
	    }
    }
 
 	function	setError($e, $class='', $function='')	{
        $this->last_error	=	array('message' => $e->getMessage(), 'trace' => $e->getTrace(), 'class' => $class, 'function' => $function);
	
		if ($this->debug)	var_dump($this->last_error);
	}
 	
	function	getError($e, $class='', $function='')	{
       return  $this->last_error;
	}

	function	setDebug($tf=false)	{
       $this->debug = $tf;
	}

 }

пользоваться просто:

$db = new SQL_Entry();
$db->setDebug(true);
$db->dbConnect('localhost', 'root', '');
$db->dbSelect('news_database');
 

fixxxer

К.О.
Партнер клуба
С тех пор, как все вменяемые люди юзают [m]ErrorException[/m] или что-то в этом роде? %)

-~{}~ 15.03.09 02:53:

alexander.pro
а как название в оригинале и автор?

(если автор местный, то можно сразу на помойку)
 

whirlwind

TDD infected, paranoid
Пардон, с каких это пор грязные хаки отличают вменяемых людей от невменяемых? Неплохой примерчик для человека, который ООП с трудом расшифровывает.
 

pilot911

Новичок
Автор оригинала: whirlwind
Пардон, с каких это пор грязные хаки отличают вменяемых людей от невменяемых? Неплохой примерчик для человека, который ООП с трудом расшифровывает.
пускай лучше сразу разбирается с exeption, чем городит огород аля конец 90х
 

whirlwind

TDD infected, paranoid
pilot911 Ты бы для начала пару книжек сам почитал. С какой вообще стати в рабочем коде должны быть ошибки? Ошибки надо не отлавливать и засовывать в базу красиво оформленными с подсветкой синтаксиса. Их надо просто не допускать.

Дальше. Вот накой ты сохраняешь инфу об ошибке внутри объекта класса если эта информация классом никак не используется? И потом какую инфу дает
это 'Failed to connect to database'? То есть база априори всегда одна?

PHP:
function dbConnect($host, $login, $password)    {
   if ( !mysql_connect($host, $login, $password) )
      throw new Exception(mysql_error());
}
 

pilot911

Новичок
Автор оригинала: whirlwind
pilot911 Ты бы для начала пару книжек сам почитал. С какой вообще стати в рабочем коде должны быть ошибки? Ошибки надо не отлавливать и засовывать в базу красиво оформленными с подсветкой синтаксиса. Их надо просто не допускать.

Дальше. Вот накой ты сохраняешь инфу об ошибке внутри объекта класса если эта информация классом никак не используется? И потом какую инфу дает
это 'Failed to connect to database'? То есть база априори всегда одна?

PHP:
function dbConnect($host, $login, $password)    {
   if ( !mysql_connect($host, $login, $password) )
      throw new Exception(mysql_error());
}
ну ты сказал... "С какой вообще стати в рабочем коде должны быть ошибки?" ... где у нас на форуме сборник прикольных выражений ? :D

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

ПС.

try{}catch() я вообще привел как пример, можно и без него обойтись.. просто хочется, чтобы топикстартер обратил на эту конструкцию внимание...

ПСС.

if ( !mysql_connect($host, $login, $password) )
throw new Exception(mysql_error());


а где ловится этот эксепшен ?
 

whirlwind

TDD infected, paranoid
pilot911 если для тебя отсутствие ошибок в коде это нонсенс и фантастика, то просто не парь ТСу мозг

-~{}~ 15.03.09 05:48:

мне нравится хранить внутри объекта отчеты о его действиях и в любой момент после любого запроса видеть, как он прошел... есть другие варианты ?
Вот ты и не путай "нравится тебе" и "как должно быть". Запрос либо прошел либо он не прошел. "как-то-так" пройти запрос не может. И тем более не может такого быть что синтаксически неправильный запрос у тебя будет проходить через раз. Этот код set/getError - откровенный мозгозаворачивающий балласт.

И потом еще раз задаю ключевой вопрос: база у тебя в единственном экземпляре? Где смысл определения нового класса? Что будет, если создать два экземпляра? Почему не

PHP:
function dbConnect($host, $login, $password)    {
   if ( !($this->dbh = mysql_connect($host, $login, $password)) )
      throw new Exception(mysql_error());
}
это не ключевой момент?
 

pilot911

Новичок
Автор оригинала: whirlwind
pilot911 если для тебя отсутствие ошибок в коде это нонсенс и фантастика, то просто не парь ТСу мозг

-~{}~ 15.03.09 05:48:


Вот ты и не путай "нравится тебе" и "как должно быть". Запрос либо прошел либо он не прошел. "как-то-так" пройти запрос не может. И тем более не может такого быть что синтаксически неправильный запрос у тебя будет проходить через раз. Этот код set/getError - откровенный мозгозаворачивающий балласт.

И потом еще раз задаю ключевой вопрос: база у тебя в единственном экземпляре? Где смысл определения нового класса? Что будет, если создать два экземпляра? Почему не

PHP:
function dbConnect($host, $login, $password)    {
   if ( !($this->dbh = mysql_connect($host, $login, $password)) )
      throw new Exception(mysql_error());
}
это не ключевой момент?
полно случаев, когда в продакшене отлавливаются ошибки после добавления нового функционала... ты идеализируешь ситуации

как ты предложил - тоже вариант - можно определить свой класс исключения непосредственно для sql
 

whirlwind

TDD infected, paranoid
Это заведомо проигрышная позиция. Ошибки не надо накапливать и откладывать до того момента, пока ленивый программист не соизволит обратить на них свое драгоценное внимание. Надо бросать исключение, что бы кривой запрос вылез на ПЕРВОМ же запуске программы и был исправлен немедленно, а не через неделю после многочисленных жалоб клиентов. Чем больше внимания уделяется обработке ошибок, тем меньше вероятность что эти ошибки будут замечены и исправлены. А иногда в хендлерах ошибок появляются свои собственные ошибки. К чему это приводит надеюсь объяснять не нужно?
 

jonjonson

Охренеть
alexander.pro, забейте на весь топик. Если код работает, значит он правильный. Если перестал работать, значит ошибка. И так в цикле. Нет правильного\неправильного кода нет в не контекста. Теоретические вопросы могут иметь место, когда есть опыт. Именно опыт отец теории. Верить пересказанным теориям - самая большая глупость. :)
 

pilot911

Новичок
Автор оригинала: whirlwind
Это заведомо проигрышная позиция. Ошибки не надо накапливать и откладывать до того момента, пока ленивый программист не соизволит обратить на них свое драгоценное внимание. Надо бросать исключение, что бы кривой запрос вылез на ПЕРВОМ же запуске программы и был исправлен немедленно, а не через неделю после многочисленных жалоб клиентов. Чем больше внимания уделяется обработке ошибок, тем меньше вероятность что эти ошибки будут замечены и исправлены. А иногда в хендлерах ошибок появляются свои собственные ошибки. К чему это приводит надеюсь объяснять не нужно?
некоторые ошибки вылезают спустя время просто потому, что клиентами функционал редко используется
 

iceman

говнокодер
PHP:
try    {
            if (!mysql_connect($host, $login, $password))
                 throw new Exception('Failed to connect to database');

         } catch (Exception $e) {
               $this->setError($e, __CLASS__, __METHOD__);
        }
луди добрые, рассшифруйте для чего тут нужен try, catch? =(
 

x-yuri

Новичок
так уже расшифровывали:
try{}catch() я вообще привел как пример, можно и без него обойтись.. просто хочется, чтобы топикстартер обратил на эту конструкцию внимание...
 
Сверху