Pisem jednu veliku intranet aplikaciju koristeci PHP kao Front controler, Input Filter, Model i View, a AJAX kao Command controller.
Pojavile su mi se izvesne nedoumice, a to cu najbolje opisati kroz kod. Osnovna klasa za View (jaaako uprošćeno, jednostavnosti radi):
Code:
abstract class baseViewHTML {
final static function renderHeader(){
return "<br> Header <br>";
}
final static function renderFooter(){
return "<br> Footer <br>";
}
private static function renderSidebar(){
//function to make standard sidebar
return "<br> Sidebar <br>";
}
abstract static function renderContent();
}
abstract class baseViewHTML {
final static function renderHeader(){
return "<br> Header <br>";
}
final static function renderFooter(){
return "<br> Footer <br>";
}
private static function renderSidebar(){
//function to make standard sidebar
return "<br> Sidebar <br>";
}
abstract static function renderContent();
}
Klasa koja nasledjuje baseViewHTML klasu:
Code:
class sampleModuleViewHTML extends baseViewHTML {
public static function renderContent(){
return "<br> Content <br>";
}
private static function renderSidebar(){
return "<br> Module - specific Sidebar <br>";
}
public function render(){
$output="";
$output=parent::renderHeader(); #nedoumica br.1
$output.=self::renderSidebar();
$output.=self::renderContent();
$output.=parent::renderFooter(); #nedoumica br.2
return $output;
}
}
class sampleModuleViewHTML extends baseViewHTML {
public static function renderContent(){
return "<br> Content <br>";
}
private static function renderSidebar(){
return "<br> Module - specific Sidebar <br>";
}
public function render(){
$output="";
$output=parent::renderHeader(); #nedoumica br.1
$output.=self::renderSidebar();
$output.=self::renderContent();
$output.=parent::renderFooter(); #nedoumica br.2
return $output;
}
}
Komentar: glavna klasa formira header i footer (metode su deklarisane kao final, i ne mogu se menjati kroz nasledjene klase); takodje formira interface za prikaz glavnog sadrzaja (apstraktna metoda renderContent), i formira funkciju za prikaz "sidebara" (dela View-a koji prikazuje razne sitne informacije); sidebar moze, a i ne mora biti definisan kroz nasledjene funkcije, s obzirom da je standardan sidebar definisan u glavnoj klasi.
Nedoumice: ako u klasi sampleModuleViewHTML u funkciji render() napisem:
Code:
$output=parent::renderHeader();
$output=parent::renderHeader();
ili
Code:
$output=self::renderHeader();
$output=self::renderHeader();
...dodje mu na isto? Kako je to moguce? Zar ne bi PHP engine trebalo da javi gresku ako se napise $output=self::renderHeader(); s obzirom da je u glavnoj klasi ta metoda deklarisana kao final? Isto pitanje je i za deo $output.=parent::renderFooter();.
Takodje, izgleda da je nemoguce metodu u glavnoj klasi deklarisati kao abstract private, da joj ogranicim "vidljivost" kroz abstraktni interface?
10x unapred, da li je jos neko imao ovakve nedoumice?
Bolje 100 godina biti milioner nego nedelju dana siromašak
(c) Alan ford
(c) Alan ford