ООП: где его применить?

Ms

Новичок
ООП: где его применить?

В последние несколько дней решил заняться изучением ООП в ПХП. Не то, что бы нужда заставила, а так...
И вот я сижу и думаю: "А зачем оно надо?"
Из примеров использолвания ООП видел только
объединение функций в класс и работа со свойствами объекта.
Однако, мне кажется, что нет смысла объединять функции в класс, ибо можно называть все математические функции так:
math_minus();
math_plus();
math_sin();
и др.

А работу со свойставми объхекта чаще всего можно запменить на работу с массивавми...

И так, вопрос: зачем такому языку как PHP нужно ООП?
(просто никогда не сталкивался с его рациональным применением)
 

Кром

Новичок
>И так, вопрос: зачем такому языку как PHP нужно ООП?

Этот вопрос активно обсуждается на форуме уже не первый год. Что тебе мешает поискать эти темы?
 

Фанат

oncle terrible
Команда форума
лично я думаю, что оопнужен скорее не языку, а программисту.
Если человеку удобнее писать объектами - пусть пишет.
Неудобнее - никаких проблем тоже не будет
 

Ms

Новичок
"ООП - это неизбежность, с которой мы рано или поздно столкнёмся"(с)
 

kruglov

Новичок
Ms
Ну, представим, что у нас есть некие объекты, например "новость" и "товар". И мы их очень любим выводить у себя на сайте кстати и некстати (для чего написали функцию show()).

Понятно, что у этих объектов разная внутренняя структура, поэтому функция show() должна различать тип объекта, чтоб показывать их по-разному. По сути нужны 2 функции: show_news() и show_goods()

Потом у нас 3, 5, 10 видов объектов...

И возникает великая путаница с обслуживающими их функциями.

А если мы делаем это классами, то получаем метод show в каждом из классов. Lastnews->show() и Novinki->show()
 

Ms

Новичок
А если мы делаем это классами, то получаем метод show в каждом из классов. Lastnews->show() и Novinki->show()
как я понял, здесь для каждого объекта надо писать свой класс. И путаницы с классами не возникнет?
 

Лисю

Guest
Основная концепция ООП - совокупность данных (переменных) и инструментов для работы с ними.

Ты MySql используешь? помнишь, там надо тоскать например идентификатор соеденения, хранить переменную результата:

PHP:
    /* Соединение, выбор БД */
    $link = mysql_connect("mysql_host", "mysql_user", "mysql_password")
        or die("Could not connect");
    print "Connected successfully";
    mysql_select_db("my_database") or die("Could not select database");

    /* Выполнение SQL query */
    $query = "SELECT * FROM my_table";
    $result = mysql_query($query) or die("Query failed");

    /* Печать результатов в HTML */
    print "<table>\n";
    while ($line = mysql_fetch_array($result, MYSQL_ASSOC)) {
        print "\t<tr>\n";
        foreach ($line as $col_value) {
  print "\t\t<td>$col_value</td>\n";
        }
        print "\t</tr>\n";
    }
    print "</table>\n";

    /* Освобождение resultset */
    mysql_free_result($result);

    /* Закрытие соединения */
    mysql_close($link);
Создавая класс мы избавляемся от этой рутины.
Например:
PHP:
class DB{
	var $lnk = null, $result = null, $server = null, $username = null, $password = null, $db = null;
	
	//Устанавливаем коннект, выбираем БД
	function connect(){
		if(is_resource($this->lnk)) return true;
		
		$this->server = $GLOBALS["database"]["server"]; 
		$this->user = $GLOBALS["database"]["user"]; 
		$this->password = $GLOBALS["database"]["password"];
		$this->db = $GLOBALS["database"]["db"]; 
		$this->lnk = mysql_connect($this->server, $this->user, $this->password) or 
			die("Не могу подключиться к MySql; ".mysql_error());
			if(is_resource($this->lnk))
				mysql_select_db($this->db, $this->lnk) or 
					die("Не могу выбрать БД; ".mysql_error());
	}
	
	//КОНСТРУКТОР
	function DB(){
		$this->connect();
	}
	
	//Выполняет Sql запрос
	//результатом будет либо возвращённое булево значение, либо ресурс в области видимости класса
	//Принимает обязательный параметри SQL-запрос и любое количество аргументов
	function query(){
		$this->connect();
		
		$c = func_num_args();
		$arg_list = func_get_args();
		
		if(!$c)	return false;
		$query = &$arg_list[0];
		$query = str_replace("%","%%",$query);
		$query = str_replace("?","%s",$query);
		
		foreach($arg_list as $k=>$v){
			if(is_int($v) || empty($v))	continue;
			// k = 0 -- это всегда SQL-запрос, поэтому эскейпить его не нужно!
			if($k==0)		continue;
			
			$arg_list[$k] = mysql_escape_string($v);
		}
		
		$query = call_user_func_array("sprintf",$arg_list);
		
		if(is_resource($this->lnk))
			$what = mysql_query($query, $this->lnk) or die("Не могу сделать SQL-запрос: <small>$query</small>, ".mysql_error());
		if(is_resource($what))	$this->result = $what;
		else if (is_bool($what))	return $what;
		else return false;
	}
	
	//....
	//....
	// Ещё масса функций и ещё...
	//....
	//....
	
	//Получает простое единственное значение (не массив) из запроса
	function get_one(){
	$arg_list = func_get_args();
	//Вызываем метод query, текущего объекта, с параметрами переданными в функцию get_one
	call_user_func_array(array(&$this, "query"), $arg_list);
		
		if(!is_resource($this->result) || !mysql_num_rows($this->result))
			return false;
		
		$row = mysql_fetch_row($this->result);
	return $row[0];
	}
	
	//	Возвращает результат работы mysql_insert_id
	function insert_id(){
		return mysql_insert_id($this->lnk);
	}
}
Как видишь, ничего сложного.
Теперь работать с БД стало намного легче: мы не таскаем за собой всякие переменные, они храняться в классе, а работать стало гораздо приятнее и яснее:

PHP:
// Инициализируем класс
$myDB = new DB();
// Вставляем какие-то записи в БД:
$myDB->query("INSERT INTO gb VALUES('?', NULL, ? , '?' , NOW(), '', '')", $_POST["gb_id"], USER_ID, $_POST["user_message"]);
// Получаем сгенерированный id полученный операцией выше
$last = $myDB->insert_id();
// Теперь вытащим из БД что-нибудь..
$a = $myDB->get_one("SELECT gb_active FROM gb_config WHERE gb_id='?'", $_POST["gb_id"]));
 

kruglov

Новичок
Ms
Не. Тем более что нам зачастую и не надо в этом разбираться. Просто не задумываясь пишем show() и все.

Трудно сказать, как в PHP, тут я с классами особо не игрался, а в сурьезном изначально OOP-ориентированном языке Java (где без слова class вообще программу не напишешь) есть к примеру такие вещи:

Есть класс Object, описывающий абстрактный объект просто. Из него наследуется ну к примеру класс Container - обобщенный контейнер для отрисовки на экране. У класса Container есть метод show(). Из класса Container выводится класс Panel (панель для рисования). Из класса Panel выводится класс Applet (наверное, в переводе не нуждается?), а из Applet мы выводим свой собственный класс SuperGame, который является Appletом + новая нужная нам функциональность. У класса Applet есть метод getParameter для передачи в аплет параметров. И у нас в нашем SuperGame автоматически есть этот метод, поэтому нам не надо писать свое получение параметров. И еще есть метод setSize(), например... И уже упомянутый show()

И у всех этих объектов есть метод toString() для вывода их структуры в строковом виде. Потому что метод toString есть в корневом объекте Object.

-~{}~ 29.07.05 14:03:

Вот полная иерархия аплета:
http://www.math.dcn-asu.ru/docs/jdk1.1.7b/docs/api/java.applet.Applet.html
 

diamond_krnl

pure-php
единственное место где использую классы это только так называемый db-layer, но не из за "переносимости СУБД" потому как утопия, а просто так удобнее использовать, когда есть обьект для каждего запроса.

и более не вижу, что можно засунуть в классы (в контексте PHP).

вот от namespace не отказался бы. :)
 

Ms

Новичок
Лисю
Мне почему-ио кажется, что пример "притянут за уши". Код намного понятнее будет если использовать процедруный подход, мне 4кажется.
kruglov
Просто не задумываясь пишем show() и все.
А потом по-люьому надо писать класс-обработчик. Да и в функциях show_news() и show_goods() и т.п., будь их хоть 100 штук можно не запутаться, если правильно структурировать информацию.
 

kvf77

Red Devil
Ms
ООП - он либо приходит в твой код - либо нет - тут не может быть за и против
 

Ms

Новичок
Он рано или поздно придёт, обязательно придёт, т.к. я рассматриваю как новую ступеньв изучении PHP и программирвоанния вообще.

Но возможно, язык PHP - не тот случай, где реально надо будет польщзовать ООП
 

Alexandre

PHPПенсионер
Но возможно, язык PHP - не тот случай, где реально надо будет польщзовать ООП
1) не знание языка определяет умение программировать :)
2) Ms, просто не сталкивался с проектами сложности чуть выше средней
 

_RVK_

Новичок
Наверное лучше всего постигать ООП на примере. Например почитать про паттерны. Посмотреть готовые движки, тот же Mojavi.
 

nw

Новичок
Лично по мне, так ООП больше помогает в проектировании и поддержке системы, нежели в большей "крутости" написания. Конечно мизерные системы не обязательно на объектах делать, но когда появляются сложные сущности и необходимо реализовывать различные взаимодействия между ними, то тут для меня проще мыслить объектами и объектно же потом писать. Так что ООП для меня это больше проектирование чем код.
 

Alexandre

PHPПенсионер
Наверное лучше всего постигать ООП на примере. Например почитать про паттерны. Посмотреть готовые движки, тот же Mojavi.
до паттернов - еще дорасти надо ;)
второе, в пхп их лишь малая часть реализуема.
 

Денч

Новичок
[off]
Помню, с полгодика назад была тема "класс по работе с бд".
Ее потом порезали на части, и в итоге всю скинули в мусорку (не без моей вины...).
Так там был развернутый ответ от Crazy на вопрос - зачем нужен ООП в PHP. Жаль, что этот ответ канул в летах...
[/off]
 
Сверху