ООП: использование экземпляра класса в другом классе

cDLEON

Онанист РНРСlub
Что такое ядро ?
Ядро - это штука, которая при определённом строении каталогов, файлов и содержимого позволяет быстро подключить нужные модули.
Что такое модуль - модуль это не самостоятельный продукт, который подключает ядро. В модуле всего две вещи есть - одна представление, вторая - конфиги, используемые ядром, так зачем каждый модуль ложить в класс ?
В класс нужно ложить модель. А модуль - это более общее понятие.
 

whirlwind

TDD infected, paranoid
Так никто же не говорит, что монстра нужно реализовать одним супермегаклассом (Bloat Of Mud). У любой программы есть какая то вершина или точка входа, с которой все начинается. По моему логично скрыть за этим классом все тонкости системы.

Насчет наследования не понял если честно. Я разве где-то советовал что нибудь от чего нибудь наследовать?
 

Long

Новичок
whirlwind, так вот и пусть начинается с маленького ядра :) оставьте ему только работу по подключению всего остального нужного хлама. если уж на то пошло - пусть цепляет конфиг, в котором будут прописаны модули, которые нужно подключить по умолчанию при старте.

а про наследование - это трейдстартеру :)
 

джамшут

Новичок
у скрипта может быть несколько точек входа. вызов через http и ssh - это совсем разные вызовы, но суть одна - нужно выполнить определённые действия указанные в параметрах.
вывод: фронт-контроллеров у системы может быть несколько. их задача - обеспечить связь с клиентом по соответствующему каналу.

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

что осталось? реестр объектов и конфигурации? можно ли его назвать "ядром", если он выполняет подчинённую функцию относительно рабочего скрипта?
 

Long

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

BrigadeFuhrer

Новичок
какое-то бесполезное ядро, у меня например есть синглтон класс Application, который агрегирует ConfigReader, Page, InputManager, User, ManagerJSCOde. далее служебный класс для возможности описания свойст (базовый для всех), класс для унифицированного обращения к источникам данных, который вызывает фабрики нужной СУБД или XML, иерархия классов наборов данных, их задача выдать ассоциативный массив с данными, иерарзия классов дамперов для вывода (HTML, stream, XML итд) + для форм еще есть ветки классов постеров и чекеров., в конструкторе большинства классов передается ссылка на объект Application ну и модули для связи дамперов и наборов данных. Вот пример модуля



PHP:
<?php
use_unit('classes/moduls/VAModul.php');


class svCatalog extends VAModul {

 protected $_current2;
 private $_menu2;

 public function __construct(Application $A){
  parent::__construct($A);
  $this->_basetype = 'souvenirs';
  $this->_title = 'Сувениры премиум класса';
 }

  protected function _defineCurrent(){
   if(!$_GET['rubricaID'])$_GET['rubricaID'] = $this->_a->_->rubricaID;
   if(!$_GET['brandID'])$_GET['brandID'] = $this->_a->_->brandID; 
   $this->_current = array('themeID'=>$_GET['rubricaID'],'id'=>$_GET['brandID']);
   $this->_current2 = array('brandID'=>$_GET['brandID'],'id'=>$_GET['rubricaID']);
 }

 protected function _defineDmParams(){
   $p = $this->_a->Page;
   $p->getDm($this->_menu)->_params['link']=$this->_basetype.$this->_innertype;
   $p->getDm($this->_menu)->_params['getparams']=array('id'=>'brandID', 'themeID'=>'rubricaID');
   $p->getDm($this->_menu)->_params['padding']=10;
   $p->getDm($this->_menu2)->_params['link']=$this->_basetype.$this->_innertype;
   $p->getDm($this->_menu2)->_params['getparams']=array('id'=>'rubricaID','brandID'=>'brandID');
   $p->getDm($this->_menu2)->_params['padding']=10;
 }

 protected function _createMenu(){
  $p = $this->_a->Page;
  $this->_menu = $p->c('JSSouvenirMenu',$this->_menuDumper,array($this->_current),null,1);
  $this->_menu2 = $p->c('JSSouvenirBrandMenu',$this->_menuDumper,array($this->_current2),null,1);
 }

 protected function _initSetkaParams(){
  $this->_setkaparams['rubricaID'] = $_GET['rubricaID'];
  $this->_setkaparams['brandID'] = $_GET['brandID'];
  $this->_setkaparams['isb'] = 1;
 }


 public function Dump(){
  throw new Exception("Для вывода каталожной сетки используйте DumpContent, для вывода меню DumpMenu!");
 }


  public function DumpMenu2(){
  $this->_a->Page->getDm($this->_menu2)->Dump();
 }

}



?>
вот пример дампера

PHP:
<?php
use_unit('classes/DumpTableRepeater.php');
class DumpBlocks extends DumpTableRepeater  {

 private $_menuname;
 private $_menuid;

 function __construct(Application $A){
   parent::__construct($A);
   $this->colcount=2;
   $this->_plink['type']=$this->_a->Type;
 }

 protected function writeds(Blocks $ds){
  parent::writeds($ds);
  $this->_menuname = $this->_ds->Ds['menu']['name'];
  $this->_menuid = $this->_ds->Ds['menu']['id'];
  $this->_ds = $this->_ds->Ds['blocks'];
 }

 public function Dump(){
 ?>
  <table id="zoomtable" cellpadding="0" cellspacing="0" width="100%" border="0" align="center">
  <tr>
    <td width="80%"  height="18px" style="background-image: url(img/left_round.gif);background-repeat: no-repeat;background-position: left top;"></td>

    <td width="20%"  style="background-image: url(img/right_round1.gif);background-repeat: no-repeat;background-position: left right;"></td>
  </tr>
  <tr bgcolor="#FFFFFF">
    <td>
    <table cellspacing="0" id="tleftc1" width="100%" border="0">

        <tr>
          <td colspan="2"><b class="headzoom"><?php echo $this->_menuname; ?></b></td>
        </tr>
 <?php
    parent::Dump();
 ?>
  <?php unset($this->_plink['blockID']); $this->DumpPages(); ?>
    </table>
    </td>
    <td id="photos" bgcolor="#eeece4"><!--R--><!--/R-->

        </td>
  </tr>
  <tr>
    <td height="18px" bgcolor="#FFFFFF" style="background-image: url(img/bleft_round.gif);background-repeat: no-repeat;background-position: left top;"><p class="backtocat"><a href=""><img src="img/btn/back.gif"/>Назад</a></p></td>
    <td bgcolor="#eeece4"></td>
  </tr>
</table>
 <?php
 }

 public function DumpPages(){
   ?>
   <tr>
     <td colspan=<?php echo $this->colcount; ?>>
     <div class="nums">Страницы:
     <?php parent::DumpPages();  ?>
     <div class="numbers">
     </div>
    </div></td>
    </tr>
   <?php
 }


  protected function OnFirst($i){
  $this->OnPage($i);
 }

 protected function OnLast($i){
  $this->OnPage($i);
 }

 protected function OnPage($i){
  $this->_plink['p']='';
  $this->_plink['menuItemID']='';
  $this->_plink['page']=$i;
  $this->_plink['id'] = $_GET['id'];
  echo '<a href="?'.$this->ur.' ">'.$i.'</a>&nbsp;';
 }

 protected function OnSelected($i){
  echo '<span style="font-size:14px; font-weight:bold; color:#000000">'.$i.'</span>';
 }


  protected function OnStartRow(&$row,$j,$key){
   echo "<tr>";
  }

 protected function OnEndRow(&$row,$j,$key){
  echo "</tr>";
 }



 protected function OnCell(&$row,$i,$j,$key){
   $this->_a->_->blockID = $row['id'];
   if(!$_GET['menuItemID'])$_GET['menuItemID'] = $this->_a->im->uvar('menuItemID',null,true);
   $this->_plink['menuItemID'] = $_GET['menuItemID'];
   $this->_plink['blockID'] = $row['id'];
 ?>
 <td>
  <p><b class="art"><?php echo $row['date'];  ?></b></p>
  <a class="head" href="?<?php echo $this->ur; ?>"><?php echo $row['name']; ?></a>
 </td>
  <?php
 }

 protected function OnEmptyCell($i,$j,$key){
   echo "<td>&nbsp;</td>";
 }


}
?>
 

whirlwind

TDD infected, paranoid
А где InputManager, вот это

PHP:
if(!$_GET['rubricaID'])$_GET['rubricaID'] = $this->_a->_->rubricaID;
?
 

BrigadeFuhrer

Новичок
Easer this->_a->_
PHP:
 class Easer {
  private $_a;
  public function __construct(Application $a){
   $this->_a = $a;
  }
  function __get($nm){
    return $this->_a->im->uvar($nm);
  }
  function __set($nm, $val){
   return $this->_a->im->uvar($nm,$val);
  }
 }
this->_a->_->rubricaID;
то же что и this->_a->_im->uvar('rubricaID');
вычисляет переменную. для этого есть в базе заточенные ХП под это дело

-~{}~ 14.05.08 15:23:

$this->_a->_im это и есть InputManager
 

BrigadeFuhrer

Новичок
HraKK, а если это не таблица? или верстка более сложная? имхо мне проще с колбэками, нивижу ничего замороченного, а вот каждый раз фигачить цикл, который у меня определен в родительском классе это конечно реальный кодинг.
PHP:
 public function Dump(){
  if(is_a($this->_ds,'ComponentMe')){$data = $this->_ds->DS;}
  else {$data = $this->_ds;}
  if(!$data)throw new Exception('Не указана источник!');
  $colcount = intval($this->colcount);
  if($colcount<=0)throw new Exception('Количество колонок не может быть равно 0!');
  foreach($data as $key=>$val){
   $i++;
   if($i==1){
    $j++;  $this->OnStartRow($val,$j,$key);
    $this->OnCell($val,$i,$j,$key);
    if($colcount==1){   //исключение
      $this->OnEndRow($val,$j,$key);
      //$j = 0;
      $i = 0;
    }
   }
  else if($i==$colcount) {
   $this->OnCell($val,$i,$j,$key);
    $this->OnEndRow($val,$j,$key);
    //$j = 0;
    $i = 0;
   } else {
    $this->OnCell($val,$i,$j,$key);
   }
  }
  if($i<$colcount&&$i!=0){
   for($s=$i+1;$s<=$colcount;$s++)
    $this->OnEmptyCell($s,$j,$key);
   $this->OnEndRow($val,$j,$key);
  }

 }
Прелесть ООП как раз и состоит в повторном использовании кода. Это кому как удобнее, я знаю человека который не то что классы, функции редко использует у него идет сплошной макаронный код, но задачу он свою делает, друго дело что пыхтения от этого значительно больше и разбираться в таком коде убийство нах. Опять же кто как привык.
 

demon_goo

Новичок
первый раз встречаю человека, который рассуждает о прелестях ООП, но не видит смысла отделять представление данных от кода :)
 

BrigadeFuhrer

Новичок
demon_goo, дружище, почитай мои посты. классы дамперы использутся у меня как раз для формирования вывода.
и дамперы это еще не шаблон, а конкретный класс вывода для множества источников данных (также классов).
PHP:
if(!$data)throw new Exception('Не указана источник!');
 

itprog

Cruftsman
BrigadeFuhrer
чтобы там не было это не ооп :)

особо порадовали имена plink, j, im, umpPages, _ds, a, i, ComponentMe..
 

BrigadeFuhrer

Новичок
"umpPages" формат слетел
DumpPages.

Конструктив закончился? ))

$this->Application->InputManager->UseVar(); это конечно ООП! ))
 

whirlwind

TDD infected, paranoid
[offtop]
У меня есть теория эволюции кода. Основные этапы развития, которые проходит девелопер

1. лапша (поток мыслей, гавнакод)
2. процедурное программирование
3. увлечение static-ООП
4. переход к классическому ООП
5. раздувание объектов
6. осознание декомпозиции
7. избыточная детализация (увлечение декомпозицией)

дальше не знаю, не постиг исчо :)

Качество кода не говорит о том что это плохо или хорошо, оно говорит о возрасте программиста :)

Так вот, согласно этой теории, товарищ сейчас между 4 и 5. Самый сложный переход 3-4 он осуществил, дальше научится.


[/offtop]
 

BrigadeFuhrer

Новичок
с mzz.ru

PHP:
$response->setHeader('', 'HTTP/1.x 404 Not Found');
$response->setHeader('Location', $url);
:) это ООП?

-~{}~ 14.05.08 17:04:

whirlwindраздувание объектов? скорее наоборот ))
 

whirlwind

TDD infected, paranoid
Да, кстати, эволюция именования элементов кода так же имеет место быть. Она начинается с $a, $im, $b, etc и заканчивается где-то на умеренно-экспрессивной форме .

:)
 

BrigadeFuhrer

Новичок
whirlwind поверишь, или нет, я специально перешел от "application" к a datasource -> ds iniputmanager -> im итд, писать быстрее стало. :)

какого?
PHP:
$result=$this->_connection->Connect($this->Host,$this->UserName,$this->UserPassword,$this->DatabaseName);
 
Сверху