Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.02.2013, 13:36   #1
Stroy562
Пользователь
 
Регистрация: 14.01.2013
Сообщений: 49
Сообщение ООП + PHP Основы, способы и цели

ООП в PHP

Всем доброго времени суток.
В этом посте, я бы хотел рассказать об Объектно ориентированном подходе (ООП) в PHP.
Читая форум, ни раз натыкался на непонимание этого метода программирования и желание его понять и изучить.

Для кого этот пост?
В этом посте разговор будет идти про самые АЗЫ работы с ООП и про такую не маловажную деталь как способ и цели его применения, по этому, если вы считаете что все это вам известно и ищите информацию для продвинутых пользователей, то смело можете покинуть эту тему. Ничего нового вы тут не найдете.

В этом посте я не буду рассказывать про HTML CSS и PHP в целом.
Тема рассчитана на пользователей, владеющих азами создания PHP сайтов.

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

Я же хочу на примере простого сайта рассказать и показать все плюсы использования ООП.

Сначала мы создадим сайт процедурно, а потом постепенно будем упрощать код.

Что получим в итоге?
В итоге у нас получится простой сайтик - каталог статей.
Все статьи будут разбиты на категории и под категории.
Все это будет реализовано средствами ООП.

Чего тут нет?
При написании кода я не буду заострять внимание на безопасности и оптимизации.
Не смотря на то, что конечный САЙт будет полностью работоспособен, я крайне не рекомендую его использовать в таком виде, как мы его закончим.
Так же не будет уделяться внимание дизайну.
Я буду использовать табличный стиль. Данный метод является устаревшим и ресурсоемким,
а для блочного стиля придется уделять внимание CSS, что не входит в цели данного поста.

Проще говоря после прочтения данного поста у Вас будет о чем подумать!).

Для упрощения я не буду блистать английским, большую часть пишу в транслите.
Stroy562 вне форума Ответить с цитированием
Старый 07.02.2013, 13:38   #2
Stroy562
Пользователь
 
Регистрация: 14.01.2013
Сообщений: 49
По умолчанию

Основные принципы ООП PHP

И так ключевым слово этого подхода является ОБЪЕКТ.

По сути ООП это создание ОБЪЕКТОВ на основе ШАБЛОНОВ
ШАБЛОНЫ объектов называются КЛАССАМИ и прежде чем создать объект нам нужно создать его шаблон - КЛАСС
В классе мы можем:
объявить переменные, которые будут являться СВОЙСТВАМИ будущего объекта
создать функции, которые будем называть методами будущего объекта.

По сути мы создаем среду разработки (свой язык программирования)
Для использования этого языка нам нужно знать за что отвечает тот или иной КЛАСС, какие он имеет свойства и методы и в дальнейшем, не думая, просто оперировать этим, создавая объекты, на основании описанных классов.

Как пример рассмотрим подключение к базе данных.

Создадим PHP страничку в которой создадим наш первый класс

Код:
<?php 
class db {};
?>
Здесь с помощью ключевого слова class мы создали класс с именем db

Теперь на основе этого класса создаем объект (экземпляр этого класса)

Код:
<?php 
class db {};

$baza = new db();
?>
Здесь $baza это переменная? которая содержит наш объект или попросту имя нашего объекта.
Ключевое слово NEW и указание КЛАССА db() на основе которого наш объект создан;

Теперь заполним КЛАСС (шаблон объекта) свойствами необходимыми для подключения к базе

Код:
<?php 
class db {
	public $host = "localhost";
	public $uzer = "admin";
	public $pass = "1234";
	public $baza = "site";	
	};

$baza = new db();
?>
Перед объявлением каждой переменной (свойства объекта) ставится модификатор
в нашем случаи public. Что это, для чего нужно и какие есть еще рассказывать не буду.

Теперь создаваемый объект $baza получает все свойства описанные в КЛАССЕ и мы можем к этим свойствам обращаться.
Для этого указываем переменную нашего объекта и через "->" имя свойства

Код:
<?php 
class db {
	public $host = "localhost";
	public $uzer = "admin";
	public $pass = "1234";
	public $baza = "site";	
	};

$baza = new db();
echo $baza->host;
?>
Здесь мы вывели на экран localhost (Свойство public $host = "localhost"

Теперь создадим метод (функцию) которая будет делать то же самое.
Метод класса объявляется как и простая функция только внутри созданного класса

Код:
<?php 
class db {
	public $host = "localhost";
	public $uzer = "admin";
	public $pass = "1234";
	public $baza = "site";	
	
	function host(){
		echo $this->host;	
		}
	};

$baza = new db();
echo $baza->host;
?>
Теперь обратимся к этому методу по тому же принципу, что и обращались к свойству. Только теперь нам не понадобится оператор ECHO, так как наш метод, уже использует его для вывода.

Код:
<?php 
class db {
	public $host = "localhost";
	public $uzer = "admin";
	public $pass = "1234";
	public $baza = "site";	
	
	function host(){
		echo $this->host;	
		}
	};

$baza = new db();
$baza->host();
?>
Мы получим тот же результат localhost .

При обращении к методу как и к любой функции ставим скобки которые в дальнейшем будем использовать для передачи методу переменных.

На основании изложенного создадим метод подключения к базе данных и запустим его.

Код:
<?php 
class db {
	public $host = "localhost";
	public $uzer = "admin";
	public $pass = "1234";
	public $baza = "site";	
	
	function DbStart(){
		$q = mysql_connect ($this->host,$this->uzer,$this->pass); 
		mysql_select_db($this->baza,$q);
		mysql_query('SET NAMES utf8');
		mysql_query('SET CHARACTER_SET utf8'); 	
		}
	};

$baza = new db();
$baza->DbStart();
?>
Данный код подключается к базе данных по средствам создания объекта и обращения к методу.

Зачем все это нужно? Куча кода путаница!!!
Все верно НО!

Если предположить что данный класс будет в отдельном файле db.php который лежит отдельной папке classes
Код:
<?php 
class db {
	public $host = "localhost";
	public $uzer = "admin";
	public $pass = "1234";
	public $baza = "site";	
	
	function DbStart(){
		$q = mysql_connect ($this->host,$this->uzer,$this->pass); 
		mysql_select_db($this->baza,$q);
		mysql_query('SET NAMES utf8');
		mysql_query('SET CHARACTER_SET utf8'); 	
		}
	};
?>
В той же папке создадим файл classes.php в который подключим db.php и создадим объект

Код:
<?php 
include "db.php";
$baza = new db();
?>
Теперь подключаем файл classes.php к нашему первому файлу, только уже убираем описание класса и создание объекта
Код:
<?php 
include "classes/classes.php";
$baza->DbStart();
?>
Код нашего первого файла заметно сократился но в целом объем кода остался прежним, да и файлов куча.
Однако теперь вы можете использовать папку classes при создании других сайтов.
В этой папке можно создать кучу калассов и объектов один раз и использовать их, не переписывая однотипные коды заново.

Создав описание каждого класса вы сможете с легкостью работать в команде и собственно созданной среде разработки.

Последний раз редактировалось Stroy562; 07.02.2013 в 13:44.
Stroy562 вне форума Ответить с цитированием
Старый 07.02.2013, 13:38   #3
Stroy562
Пользователь
 
Регистрация: 14.01.2013
Сообщений: 49
По умолчанию

Теперь опробуем все эти навыки на деле.

Приступаем к нашему сайту.



У нас установлен ЛОКАЛЬНЫЙ сервер. (Как это сделать не спрашивайте. Не по теме)

У нас создана база данных MySQL в которой две таблицы

1. Категории kat
id int(11) AUTO_INCREMENT // id (номер) Категори текущей
in_id int(11) // id (номер) Категори в которой находится текущая категория
name varchar(50)// Имя категории

2 Статьи stat
id int(11) AUTO_INCREMENT // id (номер) Статьи текущей
in_id int(11) // id (номер) Категори в которой находится текущая статья
name varchar(50)// Имя статьи
opisan text() // Краткое описание статьи
text text() //Сам текст статьи

Как их создать и что это вообще такое - ТАЙНА !





И так приступим.


Мы планируем что на нашем сайте будет размещен каталог статей.

Каждая статья расположена в своей категории.
Каждая категория может быть расположена в другой категории.
Вложенность категорий не ограничена.
На главной странице будут показаны заголовки и краткие описания последних 10 статей.
На странице каждой категории заголовки и краткие описания всех статей в данной категории.

Список категорий расположен в левой части а статьи в правой части страницы.



И так создаем файл index.php со всеми HTML причиндалами.


Код:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Наш сайт</title>
</head>
<body>


</body>
</html>

Размещаем таблицу из 3 строк
Шапка высотой 50 пикселей с надписью "Каталог статей"
Контент
Подвал высотой 25 пикселей с надписью "Копирайт"
Толщина рамки 0


Код:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Наш сайт</title>
</head>
<body>
<table width="100%" border="0">
  <tr height="50px">
    <td><h2>Католог статей</h2></td> <!--Шапка -->
  </tr>
  <tr>
    <td>&nbsp;</td> <!--Контент -->
  </tr>
  <tr height="25px">
    <td><p>Копирайт</p></td> <!--Подвал -->
  </tr>
</table>

</body>
</html>


В строку КОНТЕНТА вставляем еще таблицу из 2 столбцов.
В левом список категирий
В правом список статей или открытая статья
Ширина левого 200 пикселей
Толщина рамки 0

Код:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Наш сайт</title>
</head>
<body>
<table width="100%" border="0">
  <tr height="50px">
    <td><h2>Католог статей</h2></td><!--Шапка -->
  </tr>
  <tr>
    <td><!--Контент -->
    
  <table width="100%" border="1">
  <tr>
    <td width="200px">&nbsp;</td><!--Левый столбец -->
    <td>&nbsp;</td><!--Правый столбец -->
  </tr>
</table>  
    
    
    </td>
  </tr>
  <tr height="25px">
    <td><p>Копирайт</p></td><!--Подвал -->
  </tr>
</table>

</body>
</html>


На этом верстку нашего сайта мы закончим!
Stroy562 вне форума Ответить с цитированием
Старый 07.02.2013, 13:39   #4
Stroy562
Пользователь
 
Регистрация: 14.01.2013
Сообщений: 49
По умолчанию

Подключаемся к базе


Код:
<?php 
$q = mysql_connect ("localhost","admin","123456"); 
mysql_select_db("site",$q);
mysql_query('SET NAMES utf8');
mysql_query('SET CHARACTER_SET utf8'); 
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Наш сайт</title>
</head>
<body>
<table width="100%" border="0">
  <tr height="50px">
    <td><h2>Католог статей</h2></td><!--Шапка -->
  </tr>
  <tr>
    <td><!--Контент -->
    
  <table width="100%" border="1">
  <tr>
    <td width="200px">&nbsp;</td><!--Левый столбец -->
    <td>&nbsp;</td><!--Правый столбец -->
  </tr>
</table>  
    
    
    </td>
  </tr>
  <tr height="25px">
    <td><p>Копирайт</p></td><!--Подвал -->
  </tr>
</table>

</body>
</html>

Выводим в левом столбце список корневых категорий (категории в которых in_id = 0)
Все имена будем сортировать по алфавиту и каждое имя будет ссылкой на эту же страницу.
В ссылках будем передавать параметр kat по методу GET.

Код:
<?php 
$q = mysql_connect ("localhost","admin","123456"); 
mysql_select_db("site",$q);
mysql_query('SET NAMES utf8');
mysql_query('SET CHARACTER_SET utf8'); 
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Наш сайт</title>
</head>
<body>
<table width="100%" border="0">
  <tr height="50px">
    <td><h2>Католог статей</h2></td><!--Шапка -->
  </tr>
  <tr>
    <td><!--Контент -->
    
  <table width="100%" border="1">
  <tr>
    <td width="200px"><!--Левый столбец -->
    <?php 
	 $kat_rezult = mysql_query("select * from kat WHERE in_id = 0 ORDER BY name");
    while ($kat_dat = mysql_fetch_array($kat_rezult)){
		?>
        
		<a href="?kat=<?php echo $kat_dat['id'] ?>"><?php echo $kat_dat['name'] ?></a><br>	
        	
		<?php 		
		};	
		?>    
    </td>
    <td>&nbsp;</td><!--Правый столбец -->
  </tr>
</table>  
    
    
    </td>
  </tr>
  <tr height="25px">
    <td><p>Копирайт</p></td><!--Подвал -->
  </tr>
</table>

</body>
</html>


Теперь в левом стлбце у нас список категорий при клике по любой из них мы должны вывести список категорий вложеных в выбранную.
Для этого проверяем есть ли у нас передача переменной kat по методу GET, если есть, то выводим категории с in_id равной kat если нет, то присваиваем kat 0 и на основании ее, выводим корневые категории

Код:
<?php 
$q = mysql_connect ("localhost","admin","123456"); 
mysql_select_db("site",$q);
mysql_query('SET NAMES utf8');
mysql_query('SET CHARACTER_SET utf8'); 
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Наш сайт</title>
</head>
<body>
<table width="100%" border="0">
  <tr height="50px">
    <td><h2>Католог статей</h2></td><!--Шапка -->
  </tr>
  <tr>
    <td><!--Контент -->
    
  <table width="100%" border="1">
  <tr>
    <td width="200px"><!--Левый столбец -->
    <?php 
	if (isset($_GET['kat'])){
		$kat = $_GET['kat'];		
		}else{
			$kat = 0;
			};
	 $kat_rezult = mysql_query("select * from kat WHERE in_id = '$kat' ORDER BY name");
    while ($kat_dat = mysql_fetch_array($kat_rezult)){
		?>
        
		<a href="?kat=<?php echo $kat_dat['id'] ?>"><?php echo $kat_dat['name'] ?></a><br>	
        	
		<?php 		
		};	
		?>    
    </td>
    <td>&nbsp;</td><!--Правый столбец -->
  </tr>
</table>  
    
    
    </td>
  </tr>
  <tr height="25px">
    <td><p>Копирайт</p></td><!--Подвал -->
  </tr>
</table>

</body>
</html>

С категориями разобрались. Теперь переходим к статьям.
Stroy562 вне форума Ответить с цитированием
Старый 07.02.2013, 13:40   #5
Stroy562
Пользователь
 
Регистрация: 14.01.2013
Сообщений: 49
По умолчанию

Выводим в правой колонке последние 10 статей. То есть выводим 10 статей сортируя их по id в обратном порядке.
Наименование каждой статьи - ссылка которая методом GET передает переменную STAT этой же странице.

Код:
<?php 
$q = mysql_connect ("localhost","admin","123456"); 
mysql_select_db("site",$q);
mysql_query('SET NAMES utf8');
mysql_query('SET CHARACTER_SET utf8'); 
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Наш сайт</title>
</head>
<body>
<table width="100%" border="0">
  <tr height="50px">
    <td><h2>Католог статей</h2></td><!--Шапка -->
  </tr>
  <tr>
    <td><!--Контент -->
    
  <table width="100%" border="1">
  <tr>
    <td width="200px"><!--Левый столбец -->
    <?php 
	if (isset($_GET['kat'])){
		$kat = $_GET['kat'];		
		}else{
			$kat = 0;
			};
	 $kat_rezult = mysql_query("select * from kat WHERE in_id = '$kat' ORDER BY name");
    while ($kat_dat = mysql_fetch_array($kat_rezult)){
		?>        
		<a href="?kat=<?php echo $kat_dat['id'] ?>"><?php echo $kat_dat['name'] ?></a><br>	        	
		<?php 		
		};	
		?>    
    </td>
    <td><!--Правый столбец -->
    <?php 
	 $stat_rezult = mysql_query("select * from stat ORDER BY id DESC LIMIT 10");
    while ($stat_dat = mysql_fetch_array($stat_rezult)){
		 ?>
		 <a href="?stat=<?php echo $stat_dat['id']; ?>"><?php echo $stat_dat['name']; ?></a><br>
         <div>
         <?php echo $stat_dat['opisan']; ?>
         </div><br><br>		 
		 <?php		
		};	
	?>    
    </td>
  </tr>
</table>  
    
    
    </td>
  </tr>
  <tr height="25px">
    <td><p>Копирайт</p></td><!--Подвал -->
  </tr>
</table>

</body>
</html>
Теперь создаем условие проверяющее наличие переменной kat. Если это переменная равна 0 то все остается как было а если нет то выводим все статьи с in_id = kat. Переменная kat у нас уже определена выше и мы спокойно ей пользуемся.

Код:
<?php 
$q = mysql_connect ("localhost","admin","123456"); 
mysql_select_db("site",$q);
mysql_query('SET NAMES utf8');
mysql_query('SET CHARACTER_SET utf8'); 
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Наш сайт</title>
</head>
<body>
<table width="100%" border="0">
  <tr height="50px">
    <td><h2>Католог статей</h2></td><!--Шапка -->
  </tr>
  <tr>
    <td><!--Контент -->
    
  <table width="100%" border="1">
  <tr>
    <td width="200px"><!--Левый столбец -->
    <?php 
	if (isset($_GET['kat'])){
		$kat = $_GET['kat'];		
		}else{
			$kat = 0;
			};
	 $kat_rezult = mysql_query("select * from kat WHERE in_id = '$kat' ORDER BY name");
    while ($kat_dat = mysql_fetch_array($kat_rezult)){
		?>        
		<a href="?kat=<?php echo $kat_dat['id'] ?>"><?php echo $kat_dat['name'] ?></a><br>	        	
		<?php 		
		};	
		?>    
    </td>
    <td><!--Правый столбец -->
    <?php 
	if ($kat == 0){
	 $stat_rezult = mysql_query("select * from stat ORDER BY id DESC LIMIT 10");
    while ($stat_dat = mysql_fetch_array($stat_rezult)){
		 ?>
		 <a href="?stat=<?php echo $stat_dat['id']; ?>"><?php echo $stat_dat['name']; ?></a><br>
         <div>
         <?php echo $stat_dat['opisan']; ?>
         </div><br><br>		 
		 <?php		
		};
		}else{
			
			$stat_rezult = mysql_query("select * from stat WHERE in_id = '$kat' ORDER BY id DESC");
    while ($stat_dat = mysql_fetch_array($stat_rezult)){
		 ?>
		 <a href="?stat=<?php echo $stat_dat['id']; ?>"><?php echo $stat_dat['name']; ?></a><br>
         <div>
         <?php echo $stat_dat['opisan']; ?>
         </div><br><br>		 
		 <?php		
		};			
			};
	?>    
    </td>
  </tr>
</table>  
    
    
    </td>
  </tr>
  <tr height="25px">
    <td><p>Копирайт</p></td><!--Подвал -->
  </tr>
</table>

</body>
</html>
Stroy562 вне форума Ответить с цитированием
Старый 07.02.2013, 13:41   #6
Stroy562
Пользователь
 
Регистрация: 14.01.2013
Сообщений: 49
По умолчанию

Теперь нам осталось организовать вывод выбраной статьи.
Все просто при выборе статьи нам передается переменная stat и нам не составлявит проблем вывести эту статью,
но, что у нас при этом будет в левом столбце?
А там будет список корневых категорий так как переменной kat нет.

Хотелось бы, что бы при выборе статьи в левом столбце показывать категории которые находятся в той же категории что и статья.

Для этого редактируем ссылку на статью и дабаляем тутда передачу переменной kat в которую заносим значение in_id.

Далее нам нужно организовать условие для вывода списка статей в категории и вывода выбраной статьи.
То есть если есть переменная stat, то выводим статью, если такой переменной нет, то список.

Работаем!

Код:
<?php 
$q = mysql_connect ("localhost","admin","123456"); 
mysql_select_db("site",$q);
mysql_query('SET NAMES utf8');
mysql_query('SET CHARACTER_SET utf8'); 
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Наш сайт</title>
</head>
<body>
<table width="100%" border="0">
  <tr height="50px">
    <td><h2>Католог статей</h2></td><!--Шапка -->
  </tr>
  <tr>
    <td><!--Контент -->
    
  <table width="100%" border="1">
  <tr>
    <td width="200px"><!--Левый столбец -->
    <?php 
	 
	if (isset($_GET['kat'])){
		$kat = $_GET['kat'];		
		}else{
			$kat = 0;
			};
	 $kat_rezult = mysql_query("select * from kat WHERE in_id = '$kat' ORDER BY name");
    while ($kat_dat = mysql_fetch_array($kat_rezult)){
		?>        
		<a href="?kat=<?php echo $kat_dat['id'] ?>"><?php echo $kat_dat['name'] ?></a><br>	        	
		<?php 		
		};	
		?>    
    </td>
    <td><!--Правый столбец -->
    <?php 
        if (!isset($_GET['stat'])){
	if ($kat == 0){
	 $stat_rezult = mysql_query("select * from stat ORDER BY id DESC LIMIT 10");
    while ($stat_dat = mysql_fetch_array($stat_rezult)){
		 ?>
		 <a href="?stat=<?php echo $stat_dat['id']; ?>&kat=<?php echo $stat_dat['in_id']; ?>"><?php echo $stat_dat['name']; ?></a><br>
         <div>
         <?php echo $stat_dat['opisan']; ?>
         </div><br><br>		 
		 <?php		
		};
		}else{
			
			$stat_rezult = mysql_query("select * from stat WHERE in_id = '$kat' ORDER BY id DESC");
    while ($stat_dat = mysql_fetch_array($stat_rezult)){
		 ?>
		 <a href="?stat=<?php echo $stat_dat['id']; ?>&kat=<?php echo $stat_dat['in_id']; ?>"><?php echo $stat_dat['name']; ?></a><br>
         <div>
         <?php echo $stat_dat['opisan']; ?>
         </div><br><br>		 
		 <?php		
		};			
			};
			}else{
				$stat = $_GET['stat'];
				 $rezult = mysql_query("select * from stat WHERE id = '$stat'");
    if ($stdat = mysql_fetch_array($rezult)){
		?>
		<h3><?php echo $stdat['name']; ?></h3>
        <div>
         <?php echo $stdat['text']; ?>
         </div><br>		 
		 <?php			
		};				
				};
	?>    
    </td>
  </tr>
</table>  
    
    
    </td>
  </tr>
  <tr height="25px">
    <td><p>Копирайт</p></td><!--Подвал -->
  </tr>
</table>

</body>
</html>



Наш сайт готов!

Заполняем базу данных и все (принимаем меры безопасности и оптимизации)
Stroy562 вне форума Ответить с цитированием
Старый 07.02.2013, 13:42   #7
Stroy562
Пользователь
 
Регистрация: 14.01.2013
Сообщений: 49
По умолчанию

Теперь давайте упростим код используя ООП


Подключение к Базе (уже проходили)

В папке classes создаем файл db.php в котором описываем КЛАСС db для подключения к базе

Код:
<?php 
class db {
	public $host = "localhost";
	public $uzer = "admin";
	public $pass = "1234";
	public $baza = "site";	
	
	function DbStart(){
		$q = mysql_connect ($this->host,$this->uzer,$this->pass); 
		mysql_select_db($this->baza,$q);
		mysql_query('SET NAMES utf8');
		mysql_query('SET CHARACTER_SET utf8'); 	
		}
	};
?>
Этим файлом мы начали организовывать ООП и теперь можно продумать какие еще классы нам понадобятся

Предлогаю сделать так:

Класс kat будет у нас работать с категориями

Класс stat со статьями

Приступим

В паке classes создаем фал kat.php с одноименным классом

Код:
<?php 
class kat {};
?>
Теперь создадим методы для этого класса, то есть что мы хотим делать.
Обращаемся к ранее написанному коду. Первое что мы делали - это выводили корневые категории.
Первый метод будет делать то же.

Создадим его и назавем koren_kat

Код:
<?php 
class kat {
	function koren_kat(){}
	};
?>
Опишем работу метода вставив в него код, написанный для вывода корневых категорий

Код:
<?php 
class kat {
	function koren_kat(){
		$kat_rezult = mysql_query("select * from kat WHERE in_id = 0 ORDER BY name");
    while ($kat_dat = mysql_fetch_array($kat_rezult)){
		?>        
		<a href="?kat=<?php echo $kat_dat['id'] ?>"><?php echo $kat_dat['name'] ?></a><br>	        	
		<?php };   
		
		}
	};
?>
Теперь усовершенствуем.
Методу как и простой функции можно передавать значения.
Мы можем передать этому методу, id категории, вложения которой нам нужно выводить.

При этом учитываем, что если мы ничего не передаем то выводим корневые категории.
Для этого присваиваем передаваемой переменной по умолчанию значение 0.
И производим вывод с базы на ее основании.

Код:
<?php 
class kategor {
	function koren_kat($kat = 0){
		$kat_rezult = mysql_query("select * from kat WHERE in_id = '$kat' ORDER BY name");
    while ($kat_dat = mysql_fetch_array($kat_rezult)){
		?>        
		<a href="?kat=<?php echo $kat_dat['id'] ?>"><?php echo $kat_dat['name'] ?></a><br>	        	
		<?php };   
		
		}
	};
?>
Теерь у нас есть выбор, как мы будем определять переменную kat, прежде чем передать ее методу.
Это можно сделать в основном коде, а можно создать еще один метод который за это и будет отвечать.
Уж если занимаемся ООП то давайте в нем все и будем делать.

Создаем новый метод. Называем его kat_control

Код:
<?php 
class kategor {
	function koren_kat($kat = 0){
		$kat_rezult = mysql_query("select * from kat WHERE in_id = '$kat' ORDER BY name");
    while ($kat_dat = mysql_fetch_array($kat_rezult)){
		?>        
		<a href="?kat=<?php echo $kat_dat['id'] ?>"><?php echo $kat_dat['name'] ?></a><br>	        	
		<?php };   
		
		}
	function kat_control(){}
	
	};
?>
Теперь в нем происываем все условия при которых переменная kat будет принимать то или иное значение
и передаем ее методу koren_kat.

Код:
<?php 
class kategor {
	function koren_kat($kat = 0){
		$kat_rezult = mysql_query("select * from kat WHERE in_id = '$kat' ORDER BY name");
    while ($kat_dat = mysql_fetch_array($kat_rezult)){
		?>        
		<a href="?kat=<?php echo $kat_dat['id'] ?>"><?php echo $kat_dat['name'] ?></a><br>	        	
		<?php };   
		
		}
	function kat_control(){
		if (isset($_GET['kat'])){
		$kat = $_GET['kat'];		
		}else{
			$kat = 0;
			};
			$this->koren_kat($kat);			
			}
	
	};
?>

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

На этом работу с классом категорий мы закончили.
Stroy562 вне форума Ответить с цитированием
Старый 07.02.2013, 13:42   #8
Stroy562
Пользователь
 
Регистрация: 14.01.2013
Сообщений: 49
По умолчанию

Переходим к статьям


Как уже можно догадаться в папке classes создаем stat.php с классом...

Код:
<?php 
class stat {};
?>
Какие мотоды нам нужны? Что мы будем делать со статьями?
Ну самое главное мы их будем читать, а значит первый метод это вывод нужной статьи stat_vew.

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

Код:
<?php 
class stat {
	function stat_vew ($stat = 0){
		if ($stat != 0){
			 $stat_rezult = mysql_query("select * from kat WHERE id = '$stat'");
   if ( $stdat = mysql_fetch_array($stat_rezult)){
	   ?>
		<h3><?php echo $stdat['name']; ?></h3>
        <div>
         <?php echo $stdat['text']; ?>
         </div><br>		 
		 <?php	   
	   };			
			}	
	};
?>
Теперь создадим еще два метода
kor_stat - 10 последних статей (для главной странице)
inner_stat - все статьи в выбранной категории, при этом id категории как всегда передаем в переменной kat

Код:
<?php 
class stat {
	function stat_vew ($stat = 0){
		if ($stat != 0){
			 $stat_rezult = mysql_query("select * from kat WHERE id = '$stat'");
   if ( $stdat = mysql_fetch_array($stat_rezult)){
	   ?>
		<h3><?php echo $stdat['name']; ?></h3>
        <div>
         <?php echo $stdat['text']; ?>
         </div><br>		 
		 <?php	   
	   };			
			}	
	function kor_stat (){
		$stat_rezult = mysql_query("select * from stat ORDER BY id DESC LIMIT 10");
    while ($stat_dat = mysql_fetch_array($stat_rezult)){
		 ?>
		 <a href="?stat=<?php echo $stat_dat['id']; ?>&kat=<?php echo $stat_dat['in_id']; ?>"><?php echo $stat_dat['name']; ?></a><br>
         <div>
         <?php echo $stat_dat['opisan']; ?>
         </div><br><br>		 
		 <?php		
		};		
		}		
	function inner_stat ($kat){
		if (isset($kat) and $kat > 0){
			$stat_rezult = mysql_query("select * from stat WHERE in_id = '$kat' ORDER BY id DESC");
    while ($stat_dat = mysql_fetch_array($stat_rezult)){
		 ?>
		 <a href="?stat=<?php echo $stat_dat['id']; ?>&kat=<?php echo $stat_dat['in_id']; ?>"><?php echo $stat_dat['name']; ?></a><br>
         <div>
         <?php echo $stat_dat['opisan']; ?>
         </div><br><br>		 
		 <?php		
		};				
			};			
		}
	};
?>
Нужно заметить что при создание метода inner_stat, перед выводом списка статей, мы проверяем наличие переменной kat которая больше нуля.

И последний метод который мы создадим stat_control, который по аналогии с категориями будет работать со статьями.
Данный метод определяет наличие передачи переменной stat и kat методом get и запускает нужный метод, передавая в него необходимые параметры

Код:
<?php 
class stat {
	function stat_vew ($stat = 0){
		if ($stat != 0){
			 $stat_rezult = mysql_query("select * from kat WHERE id = '$stat'");
   if ( $stdat = mysql_fetch_array($stat_rezult)){
	   ?>
		<h3><?php echo $stdat['name']; ?></h3>
        <div>
         <?php echo $stdat['text']; ?>
         </div><br>		 
		 <?php	   
	   };			
			}	
	function kor_stat (){
		$stat_rezult = mysql_query("select * from stat ORDER BY id DESC LIMIT 10");
    while ($stat_dat = mysql_fetch_array($stat_rezult)){
		 ?>
		 <a href="?stat=<?php echo $stat_dat['id']; ?>&kat=<?php echo $stat_dat['in_id']; ?>"><?php echo $stat_dat['name']; ?></a><br>
         <div>
         <?php echo $stat_dat['opisan']; ?>
         </div><br><br>		 
		 <?php		
		};		
		}		
	function inner_stat ($kat){
		if (isset($kat) and $kat > 0){
			$stat_rezult = mysql_query("select * from stat WHERE in_id = '$kat' ORDER BY id DESC");
    while ($stat_dat = mysql_fetch_array($stat_rezult)){
		 ?>
		 <a href="?stat=<?php echo $stat_dat['id']; ?>&kat=<?php echo $stat_dat['in_id']; ?>"><?php echo $stat_dat['name']; ?></a><br>
         <div>
         <?php echo $stat_dat['opisan']; ?>
         </div><br><br>		 
		 <?php		
		};				
			};			
		}
	function stat_control (){
		if (isset($_GET['stat'])){
			$stat = $_GET['stat'];
			$this->stat_vew($stat);
			}else{
				if(!isset($_GET['kat']) or $_GET['kat'] == 0){
					$this->kor_stat();				
					}else{
						$kat = $_GET['kat'];
						$this->inner_stat($kat);
						};				
				};		
		}	
	};
?>
С классами разобрались Теперь подключим их к нашему сайту и создадим объекты на их основе
Stroy562 вне форума Ответить с цитированием
Старый 07.02.2013, 13:43   #9
Stroy562
Пользователь
 
Регистрация: 14.01.2013
Сообщений: 49
По умолчанию

В известной папке classes, создаем classes.php, подключаем туда файлы db.php kat.php и stat.php и создаем объекты от ранее описанных классов
Не забывем подключиться к базе, после создания объекта $db методом DbStart

Код:
<?php 
include "stat.php";
include "kat.php";
include "db.php";

$db = new db();
$db->DbStart();
$kat = new kat();
$stat = new stat();

?>
Теерь нам осталось подключить файл classes.php к нашему сайту и запустить метод kat_control объекта kat в левой колонке, а метод lstat_controt объекта stat в правой.

Код подключения к базе мы просто убираем так как подключаемся в файле classes.php

В результате получаем код:

Код:
<?php 
include "classes/classes.php";
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Наш сайт</title>
</head>
<body>
<table width="100%" border="0">
  <tr height="50px">
    <td><h2>Католог статей</h2></td><!--Шапка -->
  </tr>
  <tr>
    <td><!--Контент -->
    
  <table width="100%" border="1">
  <tr>
    <td width="200px"><!--Левый столбец -->
    <?php $kat->control_kat();?>    
    </td>
    <td><!--Правый столбец -->
    <?php $stat->control_stat(); ?>    
    </td>
  </tr>
</table>  
    
    
    </td>
  </tr>
  <tr height="25px">
    <td><p>Копирайт</p></td><!--Подвал -->
  </tr>
</table>

</body>
</html>

ДА . Код основной страницы значительно упростился но сколько мароки!!!

Все верно Использовать ООП для подобный сайтиков просто глупо.

Гораздо существенней помощь этого метода в работе над большими проектами, да еще и в команде.
Классов и методов в них может быть ограмное колличество и зная какой, за что отвечает, создание проекта значительно упростится и ускорится.
Stroy562 вне форума Ответить с цитированием
Старый 07.02.2013, 13:43   #10
Stroy562
Пользователь
 
Регистрация: 14.01.2013
Сообщений: 49
По умолчанию

В заключении хотелось бы немного поговорить о подключении классов в файле classes.php
В нашем примере файлов-классов всего три. А если в громадном проекте их будет несколько сотен?
Да Инклюдить замаемся!).

Для упрощение этой задачи воспользуемся функцией

Код:
__autoload($class_name);

Эта функция определяет создание объекта и (в нашем случаи) переменной $class_name присваивает имя класса, на основании которого создается объект.

Мы не зря создавали все классы в одноименных файлах.
Теперь наш код файла classes.php то же упроститься с заделом на будущее (большое колличество классов)

Код:
<?php 
function __autoload ($class_name){
include "classes/".$class_name.".php";
};

$db = new db();
$db->DbStart();
$kat = new kat();
$stat = new stat();

?>


На этом все.

Предупреждаю сразу что все писалось на лету и не тестировалось, по этому могут быть ошибки.

Но целью было не создание работающего сайта и азы ООП

Только АЗЫ... Самые АЗЫ

Всем удачи!!!
Stroy562 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задача ООП на php Gamestop Помощь студентам 3 12.03.2014 14:59
ООП в php Arsenx777 PHP 2 06.04.2012 20:20
основы ООП phasha Помощь студентам 2 26.01.2012 15:10
Разработка основы класса. ООП Walker32 Фриланс 3 22.12.2011 11:45
Манипуляторы и манипулируемые + Основы ООП Izhic Свободное общение 9 13.06.2009 12:24