Autor Zpráva
rotator
Profil *
Zkouším použít extendy tříd pro generování obsahu na webu takhle:
class pagelayout {
		function __construct($title) {
			echo "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n";
			echo "<html xmlns=\"http://www.w3.org/1999/xhtml\">\n";
			echo "<head>\n";
			echo "<meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\" />\n";
			echo "	<title>".$title."</title>\n";
			echo "</head>\n";
			echo "<body>\n";
		}
		function __destruct() {
			echo "</body>\n";
			echo "</html>\n";
		}
}
class mainpage extends pagelayout {
		function __construct() {
			echo "	<h2>najaky obsah</h2>\n";
		}
		function __destruct() { return false; }
}

potom:
$pagelayout = new pagelayout("titulek");
$pagelayout = new mainpage();

Když tam nedám to "function __destruct() { return false; }", tak to vrací destruct rodičovské třídy. Teprve se to učím. Zajímalo by mě, jestli jdu správným směrem co se týče toho vytváření tříd?
Alphard
Profil
rotator:
Zajímalo by mě, jestli jdu správným směrem co se týče toho vytváření tříd?
Já bych to takhle nedělal. Při vytvoření bych jako logické viděl právě tu html hlavičku u rodiče. Ale následné přepsání konstruktu u potomka na nějaké <h2> už nechápu.
fajzen
Profil
zmysel by to malo, keby konštruktor triedy mainpage volal najskôr konštruktor rodičovkej triedy (teda pagelayout) a deštruktor tam nebol:
class mainpage extends pagelayout {
        function __construct() {
            parent::__construct();
            echo "    <h2>najaky obsah</h2>\n";
        }
}


pri rozširovaní triedy totiž metódy potomka "prepisujú" metódy rodiča s rovnakým názvom, teda nie je to tak, že sa najskôr vykoná metóda rodiča a potom potomka (v tomto môže byť slovo extends- rozširuje, trochu zavádzajúce, ide totiž o rozšírenie triedy, nie jednotlivých metód)

EDIT: až teraz som si všimol, že najskôr vytváraš objekt triedy pagelayout a potom samostatne objekt triedy mainpage... takto by to síce fungovalo, ale úplne by sa stratil zmysel dedičnosti týchto tried
rotator
Profil *
Tak jak bych ty třídy měl volat?
AM_
Profil
Já si hlavně myslím, že tohle samo o sobě není vhodné použití třídy. K takovýmhle věcem jsou určeny různé šablonovací systémy (např. podle mě dost dobrý Smarty), ale psát funkce, které natvrdo echují obsah stránky, je dost divné, a cpát to ještě k tomu do konstruktoru a destruktoru také. Když už bys to hodně chtěl takhle, tak bych do toho zapojil víc abstrakce. Např. si můžeš udělat třídu "kernel", která se bude starat o vypisování, a pak třeba abstraktní třídu page, takhle nějak:
abstract class page{
  abstract function head();
  abstract function content();
  abstract function foot();
}
class page_uvod extends page{
  function head(){
    return file_get_contents(tpl/uvod_head.tpl);
  }
 function content(){
   return file_get_contents(tpl/uvod_content.tpl);
 }
 function foot(){
   return file_get_contents(tpl/uvod_foot.tpl);
 }
}
class kernel{
  static function createPage($pageId){
    $pageId='page_'.$pageId;
    $page = new $pageId();
    return $page->head().$page->content().$page->foot();
  }
}
echo kernel::createPage('uvod');
]


Je to takový základ, jakým směrem bych se asi já ubíral, kdybych něco takového dělal. Především jsem nepřítelem použití echo uprostřed funkce, je lepší dát programátorovi volbu, jestli výstup funkce zobrazí, nebo použije jinak.
Další řešení je použít něco již hotového napsaného zkušenými lidmi, např. nette framework.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: