Перехожу на ООП. Проследите ход рассужений при его использовании

Leonid

PHP? нет, не слышал...
Перехожу на ООП. Проследите ход рассужений при его использовании

Перехожу на ООП. Проследите ход рассужений.
Ну, допустим создаю общий класс module, имеющий 3 функции для вывода навигации, заголовка и контента. Запишем это в файл module.php
PHP:
<?php
Class module
{
function GetNav($data)
	{
	return “Navigation”;
}

function GetHeder($data)
	{
	return “Page Headder”;
}

function GetContent($data)
	{
	return “Page content”;
}
}
?>
Разбирая запрос в адресной строке, получаем, что необходимо подключить модуль, например catalog, имеющий те же 2 функции, для навигации и загловка и свою функцию для генерации контента. Файл с классом каталог запишем в файл catalog.php

PHP:
<?php
Class catalog extends module
{
function GetContent($data)
	{
	return “Catalog content”;
}
}
?>
index.php выглядит следующим образом:

PHP:
<?php
Include ‘module.php’;
//....
//Определяем исходные данные $data, например номер раздела.
//….
//Определяем, что подключить надо модуль catalog

Include ‘catalog.php’;
$mod = new catalog;

echo $mod->GetNav($data);
echo $mod->GetHeader($data);
echo $mod->GetContent($data);
?>
Это все работает нормально и понятно. Но в модуле каталог есть свои исходные данные для заголовка, контента, навигации, причем они тоже как-то вычисляются.

Для этого ввожу (и в class module и class catalog) функцию

PHP:
Function FirstData()
	{
	$data = .....;
	return $data;
}
для вычисления этих исходных данных.

По этому index меняется таким образом:

PHP:
<?php
Include ‘module.php’;
//….
//Определяем, что подключить надо модуль catalog

Include ‘catalog.php’;
$mod = new catalog;

$data = $mod->FirstData();

echo $mod->GetNav($data);
echo $mod->GetHeader($data);
echo $mod->GetContent($data);
?>
Вопрос. Это правильно и грамотно, или есть более грамотные способы использования ООП.
 

Vallar_ultra

Любитель выпить :)
Ну батенька, а не проще ли входные данные грузить в конструктор
класса catalog, и сохранять их соответственно в какое-то свойство класса, чтобы потом если надо, провести над ними какое-то действие.....

Общие принципы ООП.

1. Всё является объектом. Объект характеризуется своими отрибутами, которые задаются переменными. И несут информацию об этом объекте. В объекте также описываются модели его поведения или методы обработки информации.
2. Вычисление осуществляется путём взаимодействия или обмена данными между объектами, при котором один объект посылает запрос другому объекту на выполнение некоторого действия.
3. Каждый объект является представителем некоторого класса объектов, который выражает общие свойства этих объектов.
4. Каждый объект имеет независимую память, которая состоит из его объектов родителей.
5. Каждый объект потомок может переопределить проявление своего поведения.
6. Объекты объединённые в иерархическую структуру с общим корнем описывают предметную область и называемая схемой иерархического наследования.

Объектно-ориентированное программирование
 

Leonid

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


PHP:
<?php
class catalog extends module
{
    function catalog()
    {
    $data = //  вычисляем исходные данные
    return $data;
    }

}
?>
А в Index.php
PHP:
$mod = new catalog;

$data = $mod->catalog();

....
 

Vallar_ultra

Любитель выпить :)
PHP:
class module{
var $data;
// Тут определение родительского класса
}

class catalog extends module
{
    function catalog($data)
    {
          $this->data = $data; 
// всё, теперь В ЛЮБОМ МЕСТЕ КЛАССА module и catalog доступна $this->data
// над ней можешь внутри извращаться как угодно :)

    }

}
-~{}~ 21.12.06 15:20:

Кстати, ты мою ссылку открывал?
 

Leonid

PHP? нет, не слышал...
Ссылку открывал, там мне известная теоретическая информация, я уже перехожу к практическим экспериментам :)

Спасибо за подсказку
 

Vallar_ultra

Любитель выпить :)
"я уже перехожу к практическим экспериментам" - эт конечно классно, но всё-таки я считаю что стоит ещё разок прочитать теорию и начать оперировать понятиями ООП :)
 

Leonid

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

Solid

Drosera anglica
Leonid
Курите шаблоны проектирования, а так же найдите хорошую книгу по идеологии объектно-ориентированного программирования. И да будет вам счастье.
 

Vallar_ultra

Любитель выпить :)
2Solid
шаблоны проектирования когда человек тока начал изучать ООП???? Это шож за монстром надо быть чтоб сразу врубиться в обе темы сразу.....
А вот книга - это да, вещь в данном случае необходимая!
 

Фанат

oncle terrible
Команда форума
Leonid
к ооп приведённый код не имеет ни малейшего отношения.
это те же самые процедуры, но только записанные в другом синтаксисе.
что изменится, если вместо echo $mod->GetNav($data); будет echo GetNav($data); ?
 

Leonid

PHP? нет, не слышал...
Фанат, у меня такая же мысль возникла... :) Есть конечно отличия, но красота ООП теряется пи усложнении кода. Остается набор функций и их вызовы, тот же процедурный подход... Может дашь ссылочку, где хорошо все объяснено, а то я нахожу только общие слова да самые примитивные примеры...
 

Solid

Drosera anglica
Leonid
Почитай про инкапсуляцию, полиморфизм, наследование, абстракцию. Это основы ООП, без них тебе будет очень трудно, а то и вовсе невозможно, понять идеологию объектов. В общем-то ООП и был создан для того, что бы ускорить разработку программ и облегчить жизнь программистов, особенно в разработке крупных проектов.
Небольшой список литературы: http://anatolix.naumen.ru/Books/OOP
PS. Просто надо научиться мыслить объектами.
 

Alexandre

PHPПенсионер
Ссылку открывал, там мне известная теоретическая информация, я уже перехожу к практическим экспериментам
ну насмешил, спасибо....!

-~{}~ 22.12.06 11:22:

Include ‘catalog.php’;
$mod = new catalog;

$data = $mod->FirstData();

echo $mod->GetNav($data);
echo $mod->GetHeader($data);
echo $mod->GetContent($data);
ООП в первом приближении
PHP:
$mod = new catalog; 
$mod->makeData(); 

$mod->makeNav(); 
$mod->makeHeader(); 
$mod->makeContent();

echo $mod->show(); 
/*   или $mod->show();  разбиваем на три метода...
$mod->showNav(); 
$mod->showHeader(); 
$mod->showContent();  */
Ну а я бы в первом приближении сделал бы так:
PHP:
$mod = new catalog; 
$mod->setObjContent (  new Nav  )
$mod->setObjContent (  new  Header )
$mod->setObjContent (  new  Content )
echo $mod->show()
 

Leonid

PHP? нет, не слышал...
Не понял в чем разница showNav(); и makeNav(); ?
Сначала создать а потом показать? А почему нельзя одновременно?
 

Alexandre

PHPПенсионер
Сначала создать а потом показать? А почему нельзя одновременно?
Это две разные операции, соответственно, два разных метода.

Основные правила использования методологии ООП:
- Методы должны иметь небольшой (10-15 строк максимум ) и структурированный код
- Название Метода должно отражать его назначение.
- Если несколько объектов имеют общий код, то его стоит выделить в отдельный метод или класс.
ну и тд....
 

Leonid

PHP? нет, не слышал...
Ну, операции разные, почему их объединить нельзя? Или чтобы можно было создать напрмер навигацию, а вывести ее в 2 разных местах?

-~{}~ 22.12.06 11:36:

Не понял синтаксис $mod->setObjContent ( new Nav )
 

Alexandre

PHPПенсионер
Не понял синтаксис $mod->setObjContent ( )
создаешь отдельные объекты
Код:
new Nav 
new  Header 
new  Content
Очевидно как минимум два из них Nav и Header будут использоваться в др модулях
 

Leonid

PHP? нет, не слышал...
Понял, аргументом функции будет объект класса Nav или Content... Просто это пока непривычно.

-~{}~ 22.12.06 12:02:

Еще вопрос. Можно ли использовать какие-либо функции, не принадлежащие никаким классам, не являющиеся методами...

Ну, например есть функция для выборки первых 5 слов из текста. И она может использоваться где угодно. Сделать ее просто "свободной функцией", или лучше методом класса, родительского для всех остальных?
 
Сверху