<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Kubánek.org &#187; Zend Framework</title>
	<atom:link href="http://kubanek.org/blog/stitky/zend-framework/feed/" rel="self" type="application/rss+xml" />
	<link>http://kubanek.org</link>
	<description>Blog o programování, volejbale a zážitcích ze života</description>
	<lastBuildDate>Mon, 10 May 2010 20:50:11 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>K něčemu malému s velkou myšlenkou</title>
		<link>http://kubanek.org/blog/k-necemu-malemu-s-velkou-myslenkou/</link>
		<comments>http://kubanek.org/blog/k-necemu-malemu-s-velkou-myslenkou/#comments</comments>
		<pubDate>Wed, 15 Jul 2009 12:12:58 +0000</pubDate>
		<dc:creator>Lukáš Kubánek</dc:creator>
				<category><![CDATA[Informační technologie]]></category>
		<category><![CDATA[Nette Framework]]></category>
		<category><![CDATA[Zend Framework]]></category>

		<guid isPermaLink="false">http://localhost/kubanek.org/?p=114</guid>
		<description><![CDATA[Byl jsem zendařem. Už je tomu asi rok a půl zpátky. Hledal jsem vhodný PHP framework, který by mi ulehčil práci při psaní webových aplikací. Tenkrát jsem se rozhodl pro Zend Framework hlavně z toho důvodu, že ho vyvíjeli autoři PHP. Říkal jsem si, že asi bude psán kvalitně. Výběru napomohla také skutečnost, že frameworků [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Byl jsem <em>zendařem</em>. Už je tomu asi rok a půl zpátky. Hledal jsem vhodný PHP framework, který by mi ulehčil práci při psaní webových aplikací. Tenkrát jsem se rozhodl pro <a href="http://zendframework.com/">Zend Framework</a> hlavně z toho důvodu, že ho vyvíjeli autoři PHP. Říkal jsem si, že asi bude psán kvalitně. Výběru napomohla také skutečnost, že frameworků tenkrát ještě moc nebylo, nebo o nich aspoň nebylo tolik slyšet. To až v poslední době se s nimi roztrhl pytel. Pamatuji si, byla to verze 1.5, kterou jsem začal studovat. Naivně jsem si vytiskl <em>celou</em> dokumentaci. To se ještě vešla na pouhých 670 stránek. K tomu jsem si koupil <a href="http://www.galileocomputing.de/katalog/buecher/titel/gp/titelID-1540">knihu</a>, která se vázala k verzi 1.5, a začal jsem se vzdělávat.</p>
<p style="text-align: justify;">Přechod na verzi 1.6 byl jediný přechod, který jsem stihl plně pochytit. S přechodem na verzi 1.7 mi toho hodně proklouzlo a další přechody už jsem sledovat nestíhal. Zend Framework byl hodně rozšířen do všech směrů a stalo se z něho obrovské <em>neovladatelné</em> monstrum. Kde zůstala ta základní kostra verze 1.5? S vytisknutou dokumentací a zakoupenou knihou si teď můžu tak akorát tak… Nezastavitelný bezmyšlenkovitý vývoj mě začal na frameworku vadit. To když začínáte s projektem na aktuální verzi frameworku, museli byste projekt před dokončením pořád upravovat na tu novou a novou verzi, abyste jeli pořád na té aktuální. Framework má přece práci ulehčovat, ne ztěžovat. Občas se najdou i celkem zásadní změny jako např. psaní bootstrapového souboru pomocí objektu třídy <em>Zend_Application</em> nebo třeba zavedení <a href="http://mirin.cz/blog/url-helpery">URL helperů</a>. Podle mého názoru by takové věci měly být stanoveny před počátkem vývoje frameworku. Jsou to základní kameny, na kterých by se mělo začít stavět. Kromě toho mě odradila rychlost frameworku. Je samozřejmé, že se to nabalování nových vlastností<em> </em>muselo někde projevit. Jednoduše Zend Framework už nesplňuje moji ideologii frameworku. Netuším, proč se vývojáři snaží, aby uměl úplně všechno.</p>
<p style="text-align: justify;">V tomto ohledu se mi zalíbil <a href="http://nettephp.com/cs/">Nette Framework</a>, který mi byl doporučen <a href="http://beta.dvojmo.cz/">Tomášem Jukinem</a>. Má totiž jasně vytyčenou myšlenku, se kterou ho David Grudl píše. Fascinující je, že je framework vyvíjen pouze jediným člověkem, který si dle vlastního uvážení řekne, ano, tohle tam dám nebo ne, tohle si tam dodej sám! Líbí se mi, že se framework nerozrůstá do maximálních rozměrů a zůstává jednoduchý, jasný a srozumitelný. Mimo to využívá rozhraní a kvalitního objektového přístupu. Další plus u mě získal tím, že nemá knihovnu pro práci s databázi a tak si v klídku můžu dodat mnou zvolený ORM nástroj a stavět na něm celý model. I když mám s tímto frameworkem zatím více méně nulové zkušenosti, tak splňuje moji ideologii frameworku a vypadá to, že budeme kamarádi!</p>
<p style="text-align: justify;">Chtěl jsem vám jenom oznámit, že přecházím od <em>něčeho velikého s malou myšlenkou</em> k <em>něčemu malému s velkou myšlenkou</em>, od Zend Frameworku k Nette Frameworku.</p>
]]></content:encoded>
			<wfw:commentRss>http://kubanek.org/blog/k-necemu-malemu-s-velkou-myslenkou/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>Bootstrap file a nekoncepční třída</title>
		<link>http://kubanek.org/blog/bootstrap-file-a-nekoncepcni-trida/</link>
		<comments>http://kubanek.org/blog/bootstrap-file-a-nekoncepcni-trida/#comments</comments>
		<pubDate>Sun, 22 Mar 2009 12:02:39 +0000</pubDate>
		<dc:creator>Lukáš Kubánek</dc:creator>
				<category><![CDATA[Informační technologie]]></category>
		<category><![CDATA[bootstrap file]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Zend Framework]]></category>

		<guid isPermaLink="false">http://localhost/kubanek.org/?p=93</guid>
		<description><![CDATA[K tomuto příspěvku mě dotlačilo toto téma na českém ZF fóru, ale především tři noci prosezené u psaní a konečné formulace bootstrap file pro projekt My Town Game, o kterém vám v blízké době povím něco více. Zakrývám si oči pravou rukou, otáčím se a ulehám do kouta. Harvejsi, měl jsem bootstrap tak veliký a [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">K tomuto příspěvku mě dotlačilo <a href="http://forum.zendframework.cz/index.php?topic=620.0">toto téma</a> na českém ZF fóru, ale především tři noci prosezené u psaní a konečné formulace bootstrap file pro projekt <a href="http://mtgame.net/">My Town Game</a>, o kterém vám v blízké době povím něco více. Zakrývám si oči pravou rukou, otáčím se a ulehám do kouta. Harvejsi, měl jsem bootstrap tak veliký a nepřehledný, že jsem byl donucen ho přepsat do nekoncepční třídy s originálním názvem <em>Application</em>. Kromě tebou <a href="http://forum.zendframework.cz/index.php?topic=620.msg3099#msg3099">zmiňované</a> přehlednosti má nekoncepční třída bootstrap filu ještě takovou výhodu, že se u každé metody dá napsat pěkný phpDoc komentář, který mi vždy připomene, co že se to teď vlastně louduje. Takže se ti předem omlouvám a nedivím se, proč je kolem vývoje třídy <a href="http://framework.zend.com/wiki/display/ZFPROP/Zend_Application+-+Ben+Scholzen">Zend_Application</a> takové vzrůšo. Dovolil bych si tedy tvrdit, že pokud se jedná o větší ZF projekt, jehož bootstrap file by byl v základním znění nepřehledný, je výhodné, naházet to všechno do nekoncepční třídy. Musím tedy přihmouřit své OOoči… <img src="http://kubanek.org/blog/wp-includes/images/smilies/icon_wink.gif" alt=";-)" /></p>
<p style="text-align: justify;">Ehm, a co že to ta nekoncepční bootstrap třída vlastně je? Představte si, že váš bootstrap file <em>index.php (www/index.php)</em><strong> </strong>bude vypadat následovně a že statická metoda s divokým názvem <em>run()</em><strong> </strong>se postará o všechno, co je třeba:</p>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:800px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br /></div></td><td><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666; font-style: italic;">// include class Application</span><br />
<span style="color: #b1b100;">require_once</span> <span style="color: #0000ff;">'..'</span> <span style="color: #339933;">.</span> <span style="color: #009900; font-weight: bold;">DIRECTORY_SEPARATOR</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">'application'</span> <span style="color: #339933;">.</span> <span style="color: #009900; font-weight: bold;">DIRECTORY_SEPARATOR</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">'Application.php'</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #666666; font-style: italic;">// execute the application</span><br />
Application<span style="color: #339933;">::</span><span style="color: #004000;">run</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p style="text-align: justify;">Přesuneme se dále do třídy <em>Application (application/Application.php)</em>, která implementuje návrhový vzor singleton, protože aplikaci přece nebudeme spouštět vícekrát najednou, a to i kdyby měla <a href="http://phpfashion.com/singleton-sofie-s">Sofie S.</a> zůstat sama samotinká. Tato metoda potom ve zkratce zavolá po sobě seřazenou většinu loudovacích metod, které jsou ve třídě dostupné. To je kalibr!</p>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:800px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br /></div></td><td><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #009933; font-style: italic;">/**<br />
&nbsp;* This method execute the application<br />
&nbsp;*<br />
&nbsp;* @return void<br />
&nbsp;*/</span><br />
<span style="color: #000000; font-weight: bold;">public</span> static <span style="color: #000000; font-weight: bold;">function</span> run<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> &nbsp;<span style="color: #009900;">&#123;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">self</span><span style="color: #339933;">::</span><span style="color: #004000;">getInstance</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span>_setErrorReporting<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// error reporting level</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">self</span><span style="color: #339933;">::</span><span style="color: #004000;">getInstance</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span>_setDefaultTimezone<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Europe/Prague'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// default timezone</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">self</span><span style="color: #339933;">::</span><span style="color: #004000;">getInstance</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span>_setApplicationDir<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// application directory</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">self</span><span style="color: #339933;">::</span><span style="color: #004000;">getInstance</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span>_setIncludePath<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// include path</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">self</span><span style="color: #339933;">::</span><span style="color: #004000;">getInstance</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span>_registerAutoload<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// autoloader</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">self</span><span style="color: #339933;">::</span><span style="color: #004000;">getInstance</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span>_netteDebug<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// Nette debug</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">self</span><span style="color: #339933;">::</span><span style="color: #004000;">getInstance</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span>_loadConfig<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// loading configuration</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">self</span><span style="color: #339933;">::</span><span style="color: #004000;">getInstance</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span>_initCache<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// cache</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">self</span><span style="color: #339933;">::</span><span style="color: #004000;">getInstance</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span>_doctrineConnect<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// database connection</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">self</span><span style="color: #339933;">::</span><span style="color: #004000;">getInstance</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span>_initRouter<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// router</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">self</span><span style="color: #339933;">::</span><span style="color: #004000;">getInstance</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span>_initFrontController<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// front controller</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">self</span><span style="color: #339933;">::</span><span style="color: #004000;">getInstance</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span>_dispatch<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// dispatch</span><br />
<br />
<span style="color: #009900;">&#125;</span></div></td></tr></tbody></table></div>
<p style="text-align: justify;">Všechny takto volané metody jsou soukromé a vykonávají část bootstrap funkcionality, která se takto dá velmi jednoduše dokumentovat pomocí phpDoc u každé této metody a samozřejmě také rozšiřovat novými metodami. Třída pak může obsahovat ještě pomocné soukromé metody nebo veřejné metody pro přístup z pluginů nebo z controllerů. Na ukázku ještě detail metody pro připojení do databáze:</p>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:800px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br /></div></td><td><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #009933; font-style: italic;">/**<br />
&nbsp;* Doctrine lazy database connection<br />
&nbsp;* It creates a connection string by class Tools_Doctrine and it forwards this string<br />
&nbsp;* to Doctrine manager.<br />
&nbsp;*<br />
&nbsp;* @link http://www.doctrine-project.org/Doctrine_Manager/1_0#method_connection<br />
&nbsp;* @see class Doctrine_Manager<br />
&nbsp;* @see class Tools_Doctrine<br />
&nbsp;* @return void<br />
&nbsp;*/</span><br />
<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">function</span> _doctrineConnect<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #000088;">$connection</span> <span style="color: #339933;">=</span> Tools_Doctrine<span style="color: #339933;">::</span><span style="color: #004000;">getConnectionString</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_config<span style="color: #339933;">-&gt;</span><span style="color: #004000;">database</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; Doctrine_Manager<span style="color: #339933;">::</span><span style="color: #004000;">connection</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$connection</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #000088;">$connection</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #009900;">&#125;</span></div></td></tr></tbody></table></div>
<p style="text-align: justify;">No a konečně disponuje nekoncepční bootstrap třída výhodou, že si může všechno zapamatovat ve svých členských proměnných a o použití <em>Zend_Register</em> si můžete nechat během teplých letních nocích jen zdát. Následující kód zobrazuje příklad deklarace členských proměnných.</p>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:800px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br />46<br />47<br />48<br />49<br />50<br />51<br />52<br />53<br />54<br />55<br />56<br />57<br />58<br />59<br />60<br />61<br />62<br /></div></td><td><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #009933; font-style: italic;">/**<br />
&nbsp;* Single instance of class Application<br />
&nbsp;*<br />
&nbsp;* @staticvar Application<br />
&nbsp;*/</span><br />
<span style="color: #000000; font-weight: bold;">private</span> static <span style="color: #000088;">$_instance</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #009933; font-style: italic;">/**<br />
&nbsp;* Application directory<br />
&nbsp;*<br />
&nbsp;* @var string<br />
&nbsp;*/</span><br />
<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000088;">$_dir</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #009933; font-style: italic;">/**<br />
&nbsp;* Configuration object<br />
&nbsp;*<br />
&nbsp;* @var Zend_Config<br />
&nbsp;*/</span><br />
<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000088;">$_config</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #009933; font-style: italic;">/**<br />
&nbsp;* Cache object<br />
&nbsp;*<br />
&nbsp;* @var Zend_Cache<br />
&nbsp;*/</span><br />
<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000088;">$_cache</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #009933; font-style: italic;">/**<br />
&nbsp;* Router<br />
&nbsp;*<br />
&nbsp;* @var Zend_Controller_Router_Rewrite<br />
&nbsp;*/</span><br />
<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000088;">$_router</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #009933; font-style: italic;">/**<br />
&nbsp;* Language<br />
&nbsp;*<br />
&nbsp;* @var string<br />
&nbsp;*/</span><br />
<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000088;">$_language</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #009933; font-style: italic;">/**<br />
&nbsp;* Application locale<br />
&nbsp;*<br />
&nbsp;* @var Zend_Locale<br />
&nbsp;*/</span><br />
<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000088;">$_locale</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #009933; font-style: italic;">/**<br />
&nbsp;* Translation object<br />
&nbsp;*<br />
&nbsp;* @var Zend_Translate<br />
&nbsp;*/</span><br />
<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000088;">$_translator</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #009933; font-style: italic;">/**<br />
&nbsp;* Instance of Front Controller<br />
&nbsp;*<br />
&nbsp;* @var Zend_Controller_Front<br />
&nbsp;*/</span><br />
<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000088;">$_frontController</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p style="text-align: justify;">Vše co je libo je prostě přístupné a tak si ještě nakonec shrneme výhody a nevýhody nekoncepční bootstrap třídy. Mezi výhody patří:</p>
<ul>
<li>přehlednost</li>
<li>dokumentovatelnost</li>
<li>rozšiřovatelnost</li>
<li>přístupnost</li>
<li>znovupoužitelnost</li>
</ul>
<p>A mezi nevýhody patří:</p>
<ul>
<li>nekoncepčnost</li>
<li>rychlost (zanedbatelná)</li>
</ul>
<p style="text-align: justify;">Stejně jako jsem v <a href="http://kubanek.org/blog/prave-objektove-orientovane-programovani-v-php/">článku o kategorizaci přístupu k tvorbě PHP projektu</a> neodsuzoval žádný z přístupů, tak ani v tomto případě netvrdím, že některý způsob tvorby bootstrap filu je obecně nejlepší. Proč si myslíte, že to Zend Framework nechává otevřené a předává tuto starost na samotné programátory?</p>
]]></content:encoded>
			<wfw:commentRss>http://kubanek.org/blog/bootstrap-file-a-nekoncepcni-trida/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Pravé objektově orientované programování v PHP</title>
		<link>http://kubanek.org/blog/prave-objektove-orientovane-programovani-v-php/</link>
		<comments>http://kubanek.org/blog/prave-objektove-orientovane-programovani-v-php/#comments</comments>
		<pubDate>Mon, 02 Mar 2009 13:48:50 +0000</pubDate>
		<dc:creator>Lukáš Kubánek</dc:creator>
				<category><![CDATA[Informační technologie]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[Nette Framework]]></category>
		<category><![CDATA[OOP]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Zend Framework]]></category>

		<guid isPermaLink="false">http://localhost/kubanek.org/?p=89</guid>
		<description><![CDATA[Kdo by neznal čím dál více se rozšiřující serverový skriptovací jazyk s nedomyšlenou rekurzivní zkratkou PHP, který je známý nejen jako výukový trenažér pro amatérské webmastery. Statistiky ukazují, že dnešní hostingový program bez podpory PHP je buď ten nejlevnější nebo s chybou v metrixu. S příchodem páté verze se v PHP objevuje objektová syntaxe a [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Kdo by neznal čím dál více se rozšiřující serverový skriptovací jazyk s nedomyšlenou rekurzivní zkratkou <a href="http://php.net/">PHP</a>, který je známý nejen jako výukový trenažér pro amatérské webmastery. Statistiky ukazují, že dnešní hostingový program bez podpory PHP je buď ten nejlevnější nebo s chybou v metrixu. S příchodem páté verze se v PHP objevuje objektová syntaxe a PHP se mění z výukového trenažéru na kvalitní objektový serverový skriptovací nástroj, se kterým lze dělat velké věci. Protože PHP projekty z našeho světa jen tak nezmizí, rozhodl jsem se sepsat článek, který kategorizuje a odděluje od sebe jednotlivé přístupy tvorby PHP projektů.</p>
<h2>A: Strukturální přístup</h2>
<p style="text-align: justify;">Každý, kdo zná PHP, se ve svém životě setkal s koncepcí PHP projektíku založeného na statických stránkách, jejichž obsah se přepíná pomocí jediného GET parametru a jazykového konstruktu <em>include</em>. V lepších případech je využita databáze nebo zápis do souborů. Takovýto projekt využívá pouze strukturálních funkcí, nejčastěji implementovaných přímo v PHP.</p>
<p style="text-align: justify;">PHP projekt založený na strukturálním přístupu obvykle postrádá logiku a je nejčastěji založen na práci s textem. Vůbec nechci tento přístup odsuzovat, naopak, takový přístup disponuje největší perzistencí v porovnání s dalšími přístupy, ale hodí se jen na malé, velmi jednoduché projekty.</p>
<h2>B: Objektově strukturální přístup</h2>
<p style="text-align: justify;">Ne nadarmo se řadí PHP mezi multiparadigmatické programovací jazyky. Hlavně několik posledních let se začíná rozrůstat síla PHP frameworků, které programátorům uzpůsobují a mnohdy ulehčují jejich programátorský styl. Z těch nejznámějších zmíním <a href="http://framework.zend.com/">Zend Framework</a>, <a href="http://cakephp.org/">CakePHP</a> nebo český <a href="http://nettephp.com/">Nette Framework</a>. PHP frameworky jsou nejčastěji psané v objektovém kódu a založené na MVC architektuře.</p>
<p style="text-align: justify;">Při tvorbě PHP projektu, který využívá některý z objektově psaných frameworků, je kód projektu psaný samozřejmě také objektově. Důležité je, uvědomit si, že pokud je objektový kód, nemusí být objektová i logika. V objektově strukturálním přístupu aplikace logiku postrádá a z pohledu architektury je stále strukturální. Aplikace pouze plní za sebou seřazené a do tříd obalené metody. Takovýmto přístupem jsou koncipovány středně složité projekty, které vyžadují složitější komponenty (například z knihovny frameworku) a usnadňují práci programátorovi, mnohdy bohužel na úkor perzistence.</p>
<h2>C: Pravý objektový přístup</h2>
<p style="text-align: justify;">Pokud chceme programovat náš PHP projekt opravdu objektově, musíme naučit systém přemýšlet. Proto v pravém objektovém přístupu využíváme nejen objektové syntaxe, ale i objektové logiky, na které je postavena systémová architektura. Nejen že systém využívá objektového kódu některého frameworku, ale pracuje i s našimi doménovými objekty, které tvoří problémovou doménu projektu. Tyto objekty tvoří <em>model </em>MVC architektury a jsou nejčastěji mapovány do databází pomocí některého ORM nástroje, který může být integrován přímo do frameworku.</p>
<p style="text-align: justify;">Takový přístup bychom měli zvolit, pokud se jedná o složitější PHP projekt. Vzniklý systém nevyniká perzistencí, proto je nutno ho co možná nejlépe optimalizovat (databázové dotazy – kvalitní ORM, dobře navrhnutá architektura, cache…), ale vyniká správností objektového konceptu.</p>
<p style="text-align: justify;">Musím ještě podotknout, že žádný z přístupů není nejhorší a žádný nejlepší, protože vždy záleží na konkrétním PHP projektu. I když osobně preferuji pravý objektový přístup, tak se mi zamlouvá i strukturální přístup pro jednoduché projekty. Nejmíň se mi ale zarývá pod nehty objektově strukturální přístup, protože nejsem schopný kloubit správný objektový koncept a logicky strukturální přístup. Je to jako duševní bariéra. Ale každému vyhovuje něco jiného.</p>
]]></content:encoded>
			<wfw:commentRss>http://kubanek.org/blog/prave-objektove-orientovane-programovani-v-php/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
