Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: ООП. Использование абстрактных классов.
 
 автор: alph[p]a   (17.11.2010 в 16:05)   письмо автору
 
 

вот есть абстрактный класс parser есть куча его реализаций site1Parser , site2Parser и т.д
чета я непойму как на странице все это соедениеть и работать не с конкретной реализацией так как их много будет а с абст.классом или интерфейсом. вообщем как сообрать вооедино. кто понял откликнитесь.

  Ответить  
 
 автор: @ndry   (17.11.2010 в 16:54)   письмо автору
 
   для: alph[p]a   (17.11.2010 в 16:05)
 

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

У вас заведомо неправильный подход к ООП.

  Ответить  
 
 автор: Alph[p]a   (17.11.2010 в 19:08)   письмо автору
 
   для: @ndry   (17.11.2010 в 16:54)
 

собс..зачем они нужны тогда?

  Ответить  
 
 автор: @ndry   (17.11.2010 в 19:29)   письмо автору
 
   для: Alph[p]a   (17.11.2010 в 19:08)
 

Я уже написал - реализация общей для всех их наследников логики.

  Ответить  
 
 автор: Tonik992   (17.11.2010 в 21:25)   письмо автору
 
   для: Alph[p]a   (17.11.2010 в 19:08)
 

Есть ноутбук - asus.
Есть модель - m50.
На все серии этой модели одни и теже корпуса производят.
Но на каждые серии (m50vm, m50sa,m50sr и т.д.) свои комплектации под корпус (в одной серии есть одно, в другой - другое, что-то общее также)

  Ответить  
 
 автор: neadekvat   (17.11.2010 в 21:54)   письмо автору
 
   для: Tonik992   (17.11.2010 в 21:25)
 

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

  Ответить  
 
 автор: Tonik992   (17.11.2010 в 23:45)   письмо автору
 
   для: neadekvat   (17.11.2010 в 21:54)
 

Корпус один, а входы и выходы где-то есть, а где-то нет

  Ответить  
 
 автор: Лена   (17.11.2010 в 23:50)   письмо автору
 
   для: alph[p]a   (17.11.2010 в 16:05)
 

Ситуация, которая часто встречается. По ходу дела поймете, для чего абстрактные классы.
Есть абстрактный класс, задача которого - извлечь некие данные из файла:

<?php
abstract class Parser{
    abstract function 
getPage(); //этот метод занимается извлечением нужной информации
}
?>


Файлы могут быть разного формата - txt,xml...
Поэтому извлекать информацию из этих файлов будем по-разному.
Для этого создаем два дочерних класса:

<?php

 
class textParser extends Parser{
  function 
getPage(){
  
//парсим текстовый файл    
  
};
}

class 
xmlParser extends Parser{
    function 
getPage(){
    
//парсим xml-файл    
    
};    
}
?>

Допустим, понадобилось нам не только извлечь данные, но и положить их в базу.
Для этого создаем класс dataInDatabase, методу этого класса мы передаем объект типа Parser, этот метод не должен точно знать, какой объект он получил, главное, чтобы это был потомок Parser, потому как в Parser реализован метод getPage():

<?php
class dataInDatabase{

    function 
pageIntoDatabase(Parser $object){
        
//распарсили данные
        
$object->getPage();
        
//кладем данные в базу
    
}
}
?>

И далее создаем объект, который может работать с любым типом данных:

<?php
$obj 
= new dataInDatabase();
//объект может работать с текстовым файлом(как он с ним работает, это от нас скрыто - инкапсуляция)
$obj->pageIntoDatabase(new textParser);
//объект может работать с xml-файлом
$obj->pageIntoDatabase(new xmlParser);
?>

  Ответить  
 
 автор: alph[p]a   (18.11.2010 в 08:00)   письмо автору
 
   для: Лена   (17.11.2010 в 23:50)
 

Вроде все ясно..но

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

не буде я же в главном файле писать

 
<?php
class site1Parser extends Parser {
// ***** 

?>

и все это дело в switch загонять!!?! как тогда?!

  Ответить  
 
 автор: Лена   (18.11.2010 в 12:16)   письмо автору
 
   для: alph[p]a   (18.11.2010 в 08:00)
 

>не буде я же в главном файле писать

нет, конечно.
Я делаю так.
В индексном файле подключаю все файлы с классами:

<?php
foreach (glob(CLASSES_PATH "*.php") as $filename) {
    require_once(
$filename);
}
?>


Т.е. ваше <?php
class site1Parser extends Parser {
// *****

} ?>
будет, допустим, в файле classes/site1Parser.php

Можно подключать не все классы, а классы, принадлежащие какому-то определенному пространству имен - то, которое необходимо при загрузке системы. Т.е. вам, допустим, при загрузке системы нужны файлы классов, которые заканчиваются на Parser, тогда можно и так сделать:

<?php
foreach (glob(CLASSES_PATH "*Parser.php") as $filename) {
    require_once(
$filename);
}
?>

Тогда все остальные файлы классов подключаются позже.
Подключили необходимые классы - а далее создаем объекты по мере необходимости.
Что вы хотите сделать со switch я не поняла. Расскажите простым языком.

  Ответить  
 
 автор: psychomc   (18.11.2010 в 12:30)   письмо автору
 
   для: Лена   (18.11.2010 в 12:16)
 

а почему бы не заюзать __autoload?

  Ответить  
 
 автор: Лена   (18.11.2010 в 17:09)   письмо автору
 
   для: psychomc   (18.11.2010 в 12:30)
 

А если название класса не совпадет с названием файла?
Если в одном файле будет несколько классов, обеспечивающих общую функциональность?

  Ответить  
 
 автор: psychomc   (18.11.2010 в 17:43)   письмо автору
 
   для: Лена   (18.11.2010 в 17:09)
 

думаю что это всё бессмысленно.
как и загрузка сразу всех классов где-нибудь в конфиге, большая часть из которых никак в контроллере не используются.
p.s ведь такие функции не зря придумывают. хотя конечно у каждого своё видение...

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования