Ситуацията е следната – имам няколко обекта, които онаследяват някакъв клас. В родителският клас има методи, които връщат определени суми. При първоначалният ми план, бях направил всеки метод ( три метода ) да си определя сумата с отделна заявка – т.е. три заявки на обект умножени по четири класа т.е. заявките към базата стават дванадесет. Ето примера:
class A {
public function A1() {
// DB Query
}
public function A2() {
// DB Query
}
public function A3() {
// DB Query
}
}
class B extends A {
public function B() {
parent::__construct(); // Задавам нови насройки на базата
}
}
class C extends A {
public function B() {
parent::__construct(); // Задавам нови насройки на базата
}
}
class D extends A {
public function B() {
parent::__construct(); // Задавам нови насройки на базата
}
}
class E extends A {
public function B() {
parent::__construct(); // Задавам нови насройки на базата
}
}
$B = new B();
$B->A1();
$B->A2();
$B->A3();
$C = new C();
$C->A1();
$C->A2();
$C->A3();
$D = new D();
$D->A1();
$D->A2();
$D->A3();
$E = new E();
$E->A1();
$E->A2();
$E->A3();
Така всеки нов обект задава нови настройки за връзка с база данни и използва методие на родитеслкият клас за обработка на получените данни.
До тук добре. Всичко работи, но скоростта опрделено не е оптимизирана. Дванадесет заявки са много. Затова измислих следното решение. Добавих допълнителен метод в родетелският клас, който извлича всичките суми, чрез вътрешни заявки ( sub query / queries ), създава се инициализиращ масив, а останалите методи ще обръщат към него. Да де, ама така излиза, че пак ще се правят 12 заявки, като този път ще са и по-сложни. И да и не. Тук идват на помощ статичните данни. Инициализираме един статичен масив във всеки от дъщерните класове, който ще предваме по референция. При извикването на метода, който извлича всичките данни ще се прави проверка, дали тези данни са вече записани в статичният метод – ако да използваме тях, ако не са – извличаме ги. Ето и примера:
class A {
public function A0( &$arr ) {
if( sizeof( $arr ) == 0 ) {
// Извлечи, обработи и запиши данните в $arr масива
}
return $arr;
}
public function A1() {
$a = $this->A0();
return $a[‘A1Result’];
}
public function A2() {
$a = $this->A0();
return $a[‘A2Result’];
}
public function A3() {
$a = $this->A0();
return $a[‘A3Result’];
}
}
class B extends A {
protected static $arr;
public function B() {
parent::__construct(); // Задавам нови насройки на базата
}
public function A0() {
return parent::A0( &$arr );
}
}
class C extends A {
protected static $arr;
public function B() {
parent::__construct(); // Задавам нови насройки на базата
}
public function A0() {
return parent::A0( &$arr );
}
}
// Тук кодът продължава като първият пример
Ако нещо не сте разбрали или имате предложения – чувствайте се свободни да пишете коментари.