<?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>Code.ge Blog &#187; Design Patterns</title>
	<atom:link href="http://www.code.ge/posts/tag/design-patterns/feed" rel="self" type="application/rss+xml" />
	<link>http://www.code.ge</link>
	<description>ბლოგი ვებ პროგრამირებისა და ტექნოლოგიების შესახებ</description>
	<lastBuildDate>Fri, 03 Dec 2010 12:05:16 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.2</generator>
		<item>
		<title>Registry პატერნი, array_map და ტექსტში შაბლონით ძებნა</title>
		<link>http://www.code.ge/posts/registry-pattern-array-map-and-pattern-search-in-texts</link>
		<comments>http://www.code.ge/posts/registry-pattern-array-map-and-pattern-search-in-texts#comments</comments>
		<pubDate>Fri, 19 Oct 2007 14:35:54 +0000</pubDate>
		<dc:creator>იოსები</dc:creator>
				<category><![CDATA[Design Patterns]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.code.ge/php/registry-pattern-array-map-and-pattern-search-in-texts</guid>
		<description><![CDATA[ამ დღეებში ვატარებდი მცირე ექსპერიმენტებს ტექსტში შაბლონებით ძიებაზე, და მცირე სასარგებლო აღმოჩენები გავაკეთე. ჩემი ამოცანა მდგომარეობდა იმაში რომ ტექსტში მომეძებნა გარკვეული ფრაგმენტები და შემდეგ ჩამენაცვლებინა ისინი სხვა მნიშვნელობებით, ეს მნიშვნელობები კი სისტემის გლობალური ცვლადები იყო. ფრაგმენტებს ტრადიციული სახე მივეცი რადგან შაბლონებით ძიება მარტივი ყოფილიყო, ანუ რაღაც ამის მსგავსი {var:encoding}, ყველასათვის ცნობილი და მიღებული ფორმით&#8230; როგორ [...]]]></description>
			<content:encoded><![CDATA[<p>ამ დღეებში ვატარებდი მცირე ექსპერიმენტებს ტექსტში შაბლონებით ძიებაზე, და მცირე სასარგებლო აღმოჩენები გავაკეთე. ჩემი ამოცანა მდგომარეობდა იმაში რომ ტექსტში მომეძებნა გარკვეული ფრაგმენტები და შემდეგ ჩამენაცვლებინა ისინი სხვა მნიშვნელობებით, ეს მნიშვნელობები კი სისტემის გლობალური ცვლადები იყო. ფრაგმენტებს ტრადიციული სახე მივეცი რადგან შაბლონებით ძიება მარტივი ყოფილიყო, ანუ რაღაც ამის მსგავსი {var:encoding}, ყველასათვის ცნობილი და მიღებული ფორმით&#8230;<span id="more-79"></span></p>
<p>როგორ გადავწყვიტე საბოლოოდ ეს ამოცანა? პირველ რიგში მინდა ავღნიშნო რომ არ მიყვარს ე.წ. გლობალური ცვლადების გამოყენება და ამის თავიდან ასარიდებლად ყოველთვის ვიყენებ <a href="http://www.code.ge/php/registry-pattern-php4">Registry პატერნს</a>, რომლის მეშვეობითაც იოლად ვირიდებ თავიდან გლობალურ ცვლადებთან მუშაობის არასასიამოვნო დეტალებს.</p>
<p>პატერნის რეალიზაცია PHP5 &#8211; ისთვის გამოიყურება შემდეგნაირად(დეტალური ახსნა თუ რანაირად მუშაობს ეს პატერნი იხილეთ ზემოთ მითითებულ ბმულზე):</p>
<div class="codecolorer-container php blackboard" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><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 /></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: #000000; font-weight: bold;">class</span> Registry <span style="color: #009900;">&#123;</span><br />
&nbsp; <br />
&nbsp; <span style="color: #000000; font-weight: bold;">private</span> static <span style="color: #000088;">$stack</span> <span style="color: #339933;">=</span> <a href="http://www.php.net/array"><span style="color: #990000;">array</span></a><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; <br />
&nbsp; <span style="color: #000000; font-weight: bold;">public</span> static <span style="color: #000000; font-weight: bold;">function</span> add<span style="color: #009900;">&#40;</span><span style="color: #000088;">$key</span><span style="color: #339933;">,</span> <span style="color: #000088;">$value</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">self</span><span style="color: #339933;">::</span><span style="color: #000088;">$stack</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$key</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$value</span><span style="color: #339933;">;</span><br />
&nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; <br />
&nbsp; <span style="color: #000000; font-weight: bold;">public</span> static <span style="color: #000000; font-weight: bold;">function</span> get<span style="color: #009900;">&#40;</span><span style="color: #000088;">$key</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><a href="http://www.php.net/isset"><span style="color: #990000;">isset</span></a><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">self</span><span style="color: #339933;">::</span><span style="color: #000088;">$stack</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$key</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">return</span> <span style="color: #000000; font-weight: bold;">self</span><span style="color: #339933;">::</span><span style="color: #000088;">$stack</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$key</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; <br />
&nbsp; <span style="color: #000000; font-weight: bold;">public</span> static <span style="color: #000000; font-weight: bold;">function</span> has<span style="color: #009900;">&#40;</span><span style="color: #000088;">$key</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #b1b100;">return</span> <a href="http://www.php.net/isset"><span style="color: #990000;">isset</span></a><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">self</span><span style="color: #339933;">::</span><span style="color: #000088;">$stack</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$key</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; <br />
<span style="color: #009900;">&#125;</span></div></td></tr></tbody></table></div>
<p>ამ პატარა კლასის დახმარებით ძალიან მარტივად და ელეგანტურად შეგვიძლია ვიმუშავოთ სისტემის გლობალურ ცვლადებთან, მაგალითად:</p>
<div class="codecolorer-container php blackboard" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><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 /></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;">//მონაცემების დამატება</span><br />
Registry<span style="color: #339933;">::</span><span style="color: #004000;">add</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'encoding'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'UTF-8'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
Registry<span style="color: #339933;">::</span><span style="color: #004000;">add</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'url'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'http://www.code.ge'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
Registry<span style="color: #339933;">::</span><span style="color: #004000;">add</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'test'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'testvar'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #666666; font-style: italic;">//მონაცემების წაკითხვა</span><br />
Registry<span style="color: #339933;">::</span><span style="color: #004000;">get</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'encoding'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
Registry<span style="color: #339933;">::</span><span style="color: #004000;">get</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'url'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
Registry<span style="color: #339933;">::</span><span style="color: #004000;">get</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'test'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p>როგორც ხედავთ ყველაფერი ძალიან მარტივია, და რაც მთავარია არ ვიყენებთ საშინელ $GLOBALS მასივს&#8230;</p>
<p>რაც შეეხება თავად ტექსტს, და მასში ძიებას, პირველ რიგში განვიხილოთ მსგავსი ტექსტი:</p>
<pre>
&lt;ul&gt;
    &lt;li&gt;&lt;strong&gt; {var:encoding} &lt;/strong&gt;&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt; {var:url} &lt;/strong&gt;&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt; {var:test} &lt;/strong&gt;&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt; {var:fake_variable} &lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
</pre>
<p>ეს არის ჩვეულებრივი HTML კოდი რომელშიც ჩასმული გვაქვს ე.წ. ცვლადები, შემდეგი სახით: {var:encoding}, {var:url} და ა.შ. ასეთი ტექსტისათვის რეგულარული გამოსახულების შაბლონის დაწერა ძალიან მარტივია <strong>/\{(?:var:)(\w+)}/</strong>, მისი მეშვეობით შეგვიძლია მოვძებნოთ ყველა საჭირო ფრაგმენტი ტექსტში:</p>
<div class="codecolorer-container php blackboard" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><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: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><a href="http://www.php.net/preg_match_all"><span style="color: #990000;">preg_match_all</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'/\{(?:var:)(\w+)}/'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$template</span><span style="color: #339933;">,</span> <span style="color: #000088;">$vars</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'&lt;pre&gt;'</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <a href="http://www.php.net/print_r"><span style="color: #990000;">print_r</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$vars</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'&lt;/pre&gt;'</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span></div></td></tr></tbody></table></div>
<p>კოდის შესრულების შედეგად ვღებულობთ მასივს, რომლის პირველი ელემენტი შეიცავს ყველა მოძებნილი ფრაგმენტის მასივს, ხოლო მეორე ელემენტი შეიცავს უშუალოდ ამ ფრაგმენტებიდან ამოღებულ ცვლადების სახელებს:</p>
<pre>
Array
(
    [0] => Array
        (
            [0] => {var:encoding}
            [1] => {var:url}
            [2] => {var:test}
            [3] => {var:fake_variable}
        )

    [1] => Array
        (
            [0] => encoding
            [1] => url
            [2] => test
            [3] => fake_variable
        )

)</pre>
<p>მაშ ასე, ხელთ გვაქვს ყველაფერი, ერთადერთი რჩება ამ ფრაგმენტების ჩანაცვლება ნამდვილი ცვლადების მნიშვნელობებით:</p>
<div class="codecolorer-container php blackboard" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><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: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><a href="http://www.php.net/preg_match_all"><span style="color: #990000;">preg_match_all</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'/\{(?:var:)(\w+)}/'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$template</span><span style="color: #339933;">,</span> <span style="color: #000088;">$vars</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; <span style="color: #000088;">$values</span> <span style="color: #339933;">=</span> <a href="http://www.php.net/array_map"><span style="color: #990000;">array_map</span></a><span style="color: #009900;">&#40;</span><a href="http://www.php.net/array"><span style="color: #990000;">array</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Registry'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'get'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$vars</span><span style="color: #009900;">&#91;</span>1<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; <span style="color: #000088;">$template</span> <span style="color: #339933;">=</span> <a href="http://www.php.net/str_replace"><span style="color: #990000;">str_replace</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$vars</span><span style="color: #009900;">&#91;</span>0<span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$values</span><span style="color: #339933;">,</span> <span style="color: #000088;">$template</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><br />
<span style="color: #b1b100;">echo</span> <span style="color: #000088;">$template</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p>ამ კოდის შესრულების შედეგად მივიღებთ უკვე დამუშავებულ შედეგს:</p>
<pre>
&lt;ul&gt;
    &lt;li&gt;&lt;strong&gt; UTF-8 &lt;/strong&gt;&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt; http://www.code.ge &lt;/strong&gt;&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt; Test Variable &lt;/strong&gt;&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;  &lt;/strong&gt;&lt;/li&gt;
 &lt;/ul&gt;
</pre>
<p>როგორ მუშაობს ეს კოდი:</p>
<ol>
<li>
<strong>preg_match_all</strong> ფუნქციის და რეგულარული გამოსახულების მეშვეობით ვპოულობთ ყველა საჭირო ფრაგმენტს;</li>
<li>
<strong>array_map</strong> ფუნქციის მეშვეობით ვამზადებთ მნიშვნელობების მასივს. თუმცა ამ ფუნქციის მუშაობა უფრო დეტალურ განხილვას ითხოვს.</p>
<p>ამ ფუნქცის პირველი პარამეტრი არის ე.წ. <strong>callback</strong> ტიპის. თავისთავად callback PHP &#8211; ში წარმოადგენს რთულ ტიპს, ნებისმიერი ფუნქცია რომელიც ღებულობს ამ ტიპის პარამეტრს, შეგვიძლია გადავცეთ ნებისმიერი ფუნქციის სახელი, მაგ: array_map(&#8216;trim&#8217;). მასივის მეშვეობით შეგვიძლია გადავცეთ კლასის სახელი და კლასის მეთოდი, მაგ: array_map(array(&#8216;Registry&#8217;, &#8216;get&#8217;)) სადაც Registry არის კლასის სახელი, ხოლო get სტატიკური მეთოდის სახელი, და ასევე შეგვიძლია მასივის მეშვეობით გადავცეთ ნებისმიერი კლასის ობიექტი და მეთოდის სახელი, მაგ: array_map(array(new MyClass, &#8216;myMethod&#8217;)).</p>
<p>მეორე პარამეტრად კი მას გადაეცემა მასივი. ეს ფუნქცია მასივის ყოველ ელემენტს გადასცემს callback ფუნქციას/მეთოდს ხოლო ამ მნიშვნელობას ჩაანაცვლებს callback ფუნქციის მიერ დაბრუნებული მნიშვნელობით. საბოლოო ჯამში კი მივიღებთ მასივს ჩვენი სურვილის მიხედვით დამუშავებული მნიშვნელობებით.</p>
<p>სწორედ ამ ფუნქციის მეშვეობით ვიღებთ Registry კლასიდან ჩვენთვის საჭირო მნიშვნელობებს (რამდენადაც get მეთოდს გადაეცემა $vars მასივის პირველი ელემენტის სათითაო ელემენტი იგი დაგვიბრუნებს შესაბამის მნიშვნელობას ამ key &#8211; სთვის, თუ ასეთი არსებობს) და ვანიჭებთ მის მიერ დაბრუნებულ მასივს   $values ცვლადს.</li>
<li><strong>str_replace</strong> ფუნქციის მეშვეობით ვახორციელებთ საჭირო ფრაგმენტების ჩანაცვლებას მოპოვებული მნიშვნელობებით. ამ ფუნქციას პირველ პარამეტრად გადავცემთ ჩასანაცვლებელი ფრაგმენტების მასივს ($vars[0] მასივი) და მეორე პარამეტრად გადავცმეთ საბოლოო მნიშვნელობებს (array_map &#8211; ის მეშვეობით მოვპოვებული $values მასივი), ხოლო მესამე პარამეტრად დაუმუშავებელ შაბლონს, შედეგად ვღებულობთ უკვე დამუშავებულ ტექსტს.</li>
</ol>
<p>შედეგად მივიღეთ ძალიან მარტივი, სწრაფი და ეფექტური გადაწყვეტა ყოველგვარი ზედმეტი იტერაციებისა და დამატებითი არასაჭირო ოპერაციების გარეშე.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.code.ge/posts/registry-pattern-array-map-and-pattern-search-in-texts/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Registry პატერნი &#8211; php4</title>
		<link>http://www.code.ge/posts/registry-pattern-php4</link>
		<comments>http://www.code.ge/posts/registry-pattern-php4#comments</comments>
		<pubDate>Fri, 23 Feb 2007 22:18:53 +0000</pubDate>
		<dc:creator>იოსები</dc:creator>
				<category><![CDATA[Design Patterns]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://localhost/wordpress/?p=11</guid>
		<description><![CDATA[Registry პატერნი გამოიყენება გლობალურ მონაცემებთან სამუშაოდ (გლობალური ცვლადები). ამ პატერნის მეშვეობით შესაძლებელია ორგანიზება გავუკეთოთ ნებისმიერ გლობალურ მონაცემს და შედმგომში ადვილად გამოვიყენოთ ეს მონაცემები. ნაცვლად იმისა რომ გლობალური მონაცემები შევინახოთ PHP-ს გლობალურ $GLOBAL მასივში (რომლის გამოყენებაც აპლიკაციის წერისას არცთუ სასიამოვნო პროცესია), ბევრად ეფექტური იქნება თუ ასეთ მონაცემებთან სამუშაოდ გვექნება რაიმე ჩამოყალიბებული და მოქნილი მექანიზმი. სწორედ ასეთ [...]]]></description>
			<content:encoded><![CDATA[<p>Registry პატერნი გამოიყენება გლობალურ მონაცემებთან სამუშაოდ (გლობალური ცვლადები). ამ პატერნის მეშვეობით შესაძლებელია ორგანიზება გავუკეთოთ ნებისმიერ გლობალურ მონაცემს და შედმგომში ადვილად გამოვიყენოთ ეს მონაცემები. ნაცვლად იმისა რომ გლობალური მონაცემები შევინახოთ PHP-ს გლობალურ $GLOBAL მასივში (რომლის გამოყენებაც აპლიკაციის წერისას არცთუ სასიამოვნო პროცესია), ბევრად ეფექტური იქნება თუ ასეთ მონაცემებთან სამუშაოდ გვექნება რაიმე ჩამოყალიბებული და მოქნილი მექანიზმი. სწორედ ასეთ მექანიზმს წარმოადგენს Registry პატერნი.<span id="more-11"></span></p>
<p>PHP-ში გლობალურ მონაცემებთან ორი გზით არის შესაძლებელი:</p>
<ul>
<li>global &#8211; საკვანძო სიტყვის გამოყენებით</li>
<li>$GLOBALS &#8211; PHP-ს უკვე არსებული მასივი რომელზეც წვდომა შესაძლებელია კოდის ნებისმიერ ადგილიდან</li>
</ul>
<p><strong>მაგალითში ნაჩვენებია ორივე მეთოდის გამოყენება:</strong></p>
<div class="codecolorer-container php blackboard" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><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 /></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: #000088;">$myVar</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;sample text&quot;</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #666666; font-style: italic;">/*$myVar ცვლადი ამ შემთხვევაში ფუნქციის <br />
&nbsp; &nbsp;ლოკალური ცვლადია და არაფერი საერთო არ გააჩნია <br />
&nbsp; &nbsp;ფუნქციის გარეთ აღწერილ იგივე ცვლადთან<br />
*/</span><br />
<span style="color: #000000; font-weight: bold;">function</span> printMyVar<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$myVar</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><br />
<br />
<span style="color: #666666; font-style: italic;">/*ამ ფუნქციაში $myVar ცვლადზე წვდომა ხორციელდება<br />
&nbsp; &nbsp;global-ის გამოყენებით. ფუნქციის შიდა ცვლადი და მის <br />
&nbsp; &nbsp;გარეთ აღწერილი ცვლადი ერთი და იგივეა<br />
*/</span><br />
<span style="color: #000000; font-weight: bold;">function</span> printMyVar<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">global</span> <span style="color: #000088;">$myVar</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$myVar</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><br />
<br />
<span style="color: #666666; font-style: italic;">/*ამ შემთხვევაში $myVar ცვლადს მივმართავთ $GLOBALS<br />
&nbsp; &nbsp;მასივის მეშვეობით<br />
*/</span><br />
<span style="color: #000000; font-weight: bold;">function</span> printMyVar<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #000088;">$myVar</span> <span style="color: #339933;">=</span> <span style="color: #339933;">&amp;</span><span style="color: #000088;">$GLOBALS</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'myVar'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$myVar</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><br />
<br />
<span style="color: #666666; font-style: italic;">/*პირდაპირ გამოიყენება $GLOBALS['myVar']*/</span><br />
<span style="color: #000000; font-weight: bold;">function</span> printMyVar<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$GLOBALS</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'myVar'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span></div></td></tr></tbody></table></div>
<p>როგორც მაგალითებიდან ჩანს გლობალურ მონაცემებთან მუშაობა (თუ ასეთ მონაცემებს ვიყენებთ) შეიძლება საკმაოდ არასასიამოვნო პროცესად იქცეს როდესაც მუშაობა გვიწევს დიდი ზომის სისტემებზე.</p>
<p>ამ პრობლემის არიდება თავისუფლად შესაძლებელია Registry პატერნის გამოყენებით. ამ პატერნის მარტივი რეალიზაცია ნაჩვენებია ქვემოთ მოყვანილ კოდში.</p>
<div class="codecolorer-container php blackboard" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><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 /></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;*@access public<br />
&nbsp;*@package util<br />
&nbsp;*/</span><br />
<span style="color: #000000; font-weight: bold;">class</span> Registry <span style="color: #009900;">&#123;</span><br />
<br />
<span style="color: #009933; font-style: italic;">/** @ignore */</span><br />
<span style="color: #000000; font-weight: bold;">var</span> <span style="color: #000088;">$stack</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #009933; font-style: italic;">/**<br />
&nbsp;*Default private constructor<br />
&nbsp;*@access private<br />
&nbsp;*/</span><br />
<span style="color: #000000; font-weight: bold;">function</span> Registry<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">stack</span> <span style="color: #339933;">=</span> <a href="http://www.php.net/array"><span style="color: #990000;">array</span></a><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><br />
<br />
<span style="color: #009933; font-style: italic;">/**<br />
&nbsp;*@access public<br />
&nbsp;*@param string a string specifying object's key<br />
&nbsp;*@param mixed an item to be stored during the request<br />
&nbsp;*/</span><br />
<span style="color: #000000; font-weight: bold;">function</span> add<span style="color: #009900;">&#40;</span><span style="color: #000088;">$key</span><span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span><span style="color: #000088;">$item</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #000088;">$reg</span> <span style="color: #339933;">=</span> <span style="color: #339933;">&amp;</span>Registry<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;">;</span><br />
&nbsp; &nbsp; <span style="color: #000088;">$reg</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">stack</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$key</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #339933;">&amp;</span><span style="color: #000088;">$item</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><br />
<br />
<span style="color: #009933; font-style: italic;">/**<br />
&nbsp;*@param string a string specifying object's key<br />
&nbsp;*@return mixed an object if it exists in the object stack or null<br />
&nbsp;*/</span><br />
<span style="color: #000000; font-weight: bold;">function</span> <span style="color: #339933;">&amp;</span>get<span style="color: #009900;">&#40;</span><span style="color: #000088;">$key</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #000088;">$reg</span> <span style="color: #339933;">=</span> <span style="color: #339933;">&amp;</span>Registry<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;">;</span><br />
&nbsp; &nbsp; <span style="color: #b1b100;">return</span> <span style="color: #000088;">$reg</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">stack</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$key</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><br />
<br />
<span style="color: #009933; font-style: italic;">/**<br />
&nbsp;*@param string a string specifying object's key<br />
&nbsp;*@return boolean true if an object exists in the object stack or false<br />
&nbsp;*/</span><br />
<span style="color: #000000; font-weight: bold;">function</span> has<span style="color: #009900;">&#40;</span><span style="color: #000088;">$key</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #000088;">$reg</span> <span style="color: #339933;">=</span> <span style="color: #339933;">&amp;</span>Registry<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;">;</span><br />
&nbsp; &nbsp; <span style="color: #b1b100;">return</span> <span style="color: #339933;">!</span><a href="http://www.php.net/is_null"><span style="color: #990000;">is_null</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$reg</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">get</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$key</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><br />
<br />
<span style="color: #009933; font-style: italic;">/**<br />
&nbsp;*@return Registry the Registry instance<br />
&nbsp;*/</span><br />
<span style="color: #000000; font-weight: bold;">function</span> <span style="color: #339933;">&amp;</span>getInstance<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; static <span style="color: #000088;">$registry</span> <span style="color: #339933;">=</span> <a href="http://www.php.net/array"><span style="color: #990000;">array</span></a><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #000088;">$registry</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$registry</span><span style="color: #009900;">&#91;</span>0<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">&amp;new</span> Registry<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; <span style="color: #b1b100;">return</span> <span style="color: #000088;">$registry</span><span style="color: #009900;">&#91;</span>0<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><br />
<br />
<span style="color: #009900;">&#125;</span></div></td></tr></tbody></table></div>
<p>კოდი შედგება ოთხი მეთოდისგან ესენია:</p>
<ul>
<li>
<strong>add</strong> &#8211; მეთოდი მონაცემების მასივში ამატებს ახალ ობიექტს მითითებული სახელით</li>
<li>
<strong>get</strong> &#8211; მეთოდი დააბრუნებს ობიექტს მითითებული სახელით, თუ მსგავსი ინახება ობიექტების მასივში</li>
<li><strong>has</strong> &#8211; მეთოდი ამოწმებს არსებობს თუ არა ობიექტი მითითებული სახელით ობიექტების მასივში </li>
<li><strong>getInstance</strong> &#8211; მეთოდი აბრუნებს უკვე არსებულ Registry კლასის ობიექტს (თუ იგი არ არსებობს წინასწარ ქმნის მასე, ასე რომ ამ მეთოდის პირველი გამოყენების თანავე Registry კლასის ობიექტი იქმნება ერთხელ და ინახება $registry სტატიკურ(static) ცვლადში რაც იძლევე იმის გარანტიას რომ ამ მეთოდის ხელმეორე გამოყენების შემთხვევაში  $registry ცვლადი ხელმეორედ აღარ შეიქმნება)</li>
</ul>
<p>Registry კლასის რეალიზაციაში ცხადად ჩანს რომ იგი რეალიზებულია Singleton პატერნის მეშვეობით.</p>
<p>ამ კლასის გამოყენების მაგალითები მოყვანილია ქვემოთ:</p>
<div class="codecolorer-container php blackboard" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><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 /></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: #000000; font-weight: bold;">class</span> Test <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">var</span> <span style="color: #000088;">$testData</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">function</span> Test<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">testData</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;this is my test data&quot;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
<span style="color: #009900;">&#125;</span><br />
<br />
<span style="color: #000088;">$test</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">&amp;new</span> Test<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
Registry<span style="color: #339933;">::</span><span style="color: #004000;">add</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'test'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$test</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #000000; font-weight: bold;">function</span> useTest<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #000088;">$test</span> <span style="color: #339933;">=</span> <span style="color: #339933;">&amp;</span>Registry<span style="color: #339933;">::</span><span style="color: #004000;">get</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'test'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$test</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">testData</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><br />
<br />
<span style="color: #000000; font-weight: bold;">class</span> DatabaseConnection<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">var</span> <span style="color: #000088;">$connection</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">function</span> DatabaseConnection<span style="color: #009900;">&#40;</span><span style="color: #000088;">$host</span><span style="color: #339933;">,</span> <span style="color: #000088;">$user</span><span style="color: #339933;">,</span> <span style="color: #000088;">$pass</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">connection</span> <span style="color: #339933;">=</span> <a href="http://www.php.net/mysql_connect"><span style="color: #990000;">mysql_connect</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$host</span><span style="color: #339933;">,</span> <span style="color: #000088;">$user</span><span style="color: #339933;">,</span> <span style="color: #000088;">$pass</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">function</span> getConnection<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">return</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">connection</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; <br />
<span style="color: #009900;">&#125;</span><br />
<br />
<span style="color: #000088;">$dbConn</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">&amp;new</span> DatabaseConnection<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
Registry<span style="color: #339933;">::</span><span style="color: #004000;">add</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'db'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$dbConn</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #000000; font-weight: bold;">function</span> useDbConnection<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #000088;">$db</span> <span style="color: #339933;">=</span> Registry<span style="color: #339933;">::</span><span style="color: #004000;">get</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'db'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #666666; font-style: italic;">//$db-&gt;getConnection();</span><br />
<span style="color: #009900;">&#125;</span></div></td></tr></tbody></table></div>
<p>მაგალითებში ნათლად ჩანს თუ რამდენად მარტივი და ეფექტურია Registry კლასის გამოყენება. გარდა კლასის ობიექტებისა მისი მეშვეობით შეგვიძლია შევინახოთ ნებისმიერი სხვა ტიპის მონაცემი, იქნება ეს მასივი, სტრიქონი თუ სხვა ნებისმიერი რესურსი.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.code.ge/posts/registry-pattern-php4/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Singleton პატერნი &#8211; PHP4 და PHP5</title>
		<link>http://www.code.ge/posts/singleton-pattern-in-php4-and-php5</link>
		<comments>http://www.code.ge/posts/singleton-pattern-in-php4-and-php5#comments</comments>
		<pubDate>Fri, 23 Feb 2007 03:01:53 +0000</pubDate>
		<dc:creator>იოსები</dc:creator>
				<category><![CDATA[Design Patterns]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://localhost/wordpress/?p=10</guid>
		<description><![CDATA[შესაძლებელია თუ არა ამ საჭირო პატერნის რეალიზაცია PHP4 &#8211; ში? მიუხედავად იმისა რომ უმრავი რამ არის ნათქვამი PHP-ს ამ ვერსიის არასრულფასოვან ობიექტზე ორიენტირებულ შესაძლებლობებზე &#8211; ეს შესაძლებელია თუმცა გარკვეულწილად ეს არის ხელოვნური და შედარებით რთული გზა ვიდრე PHP5-სა და Java-ში. (დეტალურად ამ პატერნის შესახებ შეგიძლიათ წაიკითხოთ ამ პოსტში). რითია ეს სირთულე გამოწვეული ეს სირთულე PHP4 [...]]]></description>
			<content:encoded><![CDATA[<p>შესაძლებელია თუ არა ამ საჭირო პატერნის რეალიზაცია PHP4 &#8211; ში? მიუხედავად იმისა რომ უმრავი რამ არის ნათქვამი PHP-ს ამ ვერსიის არასრულფასოვან ობიექტზე ორიენტირებულ შესაძლებლობებზე &#8211; ეს შესაძლებელია თუმცა გარკვეულწილად ეს არის ხელოვნური და შედარებით რთული გზა ვიდრე PHP5-სა და Java-ში. (დეტალურად ამ პატერნის შესახებ შეგიძლიათ წაიკითხოთ <a href="?p=9" title="Singleton პატერნი - Java">ამ</a> პოსტში).<span id="more-10"></span></p>
<p>რითია ეს სირთულე გამოწვეული ეს სირთულე PHP4 &#8211; ში? ამის რამდენიმე მიზეზია რომელსაც ჩამოვთვლილია ქვევით:</p>
<ol>
<li>არ არსებობს წვდომის მოდიფიკატორები(public, protected, private) კლასის ცვლადებისა და მეთოდებისათვის.</li>
<li>არ არსებობს სტატიკური (static) კლასის ცვლადები.</li>
</ol>
<p>სწორედ ზემოთაღნიშნული მიზეზები ღდის ამ პატერნის რეალიზაციას ხელოვნურს, თუმცა მისი გამოყენება მაინც შესაძლებელია.</p>
<p><strong>განვიხილოთ მაგალითი:</strong></p>
<div class="codecolorer-container php blackboard" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><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 /></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: #000000; font-weight: bold;">class</span> Singleton <span style="color: #009900;">&#123;</span> &nbsp; &nbsp;<br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #666666; font-style: italic;">//private constructor</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">function</span> Singleton<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span> <br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">function</span> <span style="color: #339933;">&amp;</span>getInstance<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; static <span style="color: #000088;">$singleton</span> <span style="color: #339933;">=</span> <a href="http://www.php.net/array"><span style="color: #990000;">array</span></a><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #000088;">$singleton</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$singleton</span><span style="color: #009900;">&#91;</span>0<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">&amp;new</span> Singleton<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">return</span> <span style="color: #000088;">$singleton</span><span style="color: #009900;">&#91;</span>0<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
<br />
<span style="color: #009900;">&#125;</span></div></td></tr></tbody></table></div>
<p>თუმცა PH5 &#8211; სთვის საქმე გაცილებით უკეთ არის და მისი რეალიზაცია თითქმის იდენტურია Java-ს რეალიზაციისა.</p>
<p><strong>მაგალითი PHP5 &#8211; სთვის:</strong></p>
<div class="codecolorer-container php blackboard" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><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 /></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: #000000; font-weight: bold;">class</span> Singleton <span style="color: #009900;">&#123;</span><br />
<br />
&nbsp; &nbsp; static <span style="color: #000000; font-weight: bold;">private</span> <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 />
&nbsp; &nbsp; <span style="color: #666666; font-style: italic;">//private constructor</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">function</span> __construct<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <span style="color: #009900;">&#125;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">public</span> static <span style="color: #000000; font-weight: bold;">function</span> getInstance<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">self</span><span style="color: #339933;">::</span><span style="color: #000088;">$instance</span> <span style="color: #339933;">==</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">self</span><span style="color: #339933;">::</span><span style="color: #000088;">$instance</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Singleton<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">return</span> <span style="color: #000000; font-weight: bold;">self</span><span style="color: #339933;">::</span><span style="color: #000088;">$instance</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
<br />
<span style="color: #009900;">&#125;</span></div></td></tr></tbody></table></div>
<p>მოცემულ კოდში განსხვავებით პირველი მაგალითისგან თვალში გხვდება რამოდენიმე ახალი საკვანძო სიტყვა:</p>
<ol>
<li><strong>static</strong> &#8211; გამოიყენება როგორც კლასის ცვლადის ასევე კლასის მეთოდთან.</li>
<li><strong>public, private &#8211; </strong>წვდომის მოდიფიკატორები რომლებიც მანამდე არ არსებობდა PHP &#8211; ში.</li>
<li><strong>_counstruct </strong>- PHP5 &#8211; ში კონსტრუქტორის სახელი (კლასის სახელი გამოყენება წინა ვერსიაში ავტომატურად გულისხმობდა რომე ეს ფუნქცია იყო კონსტრუქტორი)</li>
<li><strong>self</strong> &#8211; ეს საკვანძო სიტყვა გულისხმობს მიმდინარე კლასს, მხოლოდ სტატიკურ კონტექსტში.</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://www.code.ge/posts/singleton-pattern-in-php4-and-php5/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Singleton პატერნი &#8211; Java</title>
		<link>http://www.code.ge/posts/singleton-pattern-java</link>
		<comments>http://www.code.ge/posts/singleton-pattern-java#comments</comments>
		<pubDate>Fri, 23 Feb 2007 02:16:49 +0000</pubDate>
		<dc:creator>იოსები</dc:creator>
				<category><![CDATA[Design Patterns]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://localhost/wordpress/?p=9</guid>
		<description><![CDATA[ყველა სახელმძღვანელო რომელიც წამიკითხავს იწყება სწორედ ამ პატერნის აღწერით, რაც უდავოდ გამოწვეულია იმით რომ იგი წარმოადგენს ყველაზე მარტივს არსებულ პატერნებს შორის. ამ პატერნის გამოყენებით შესაძლებელია კონკრეტული ტიპის(კლასის) ერთი და მხოლოდ ერთი ობიექტის (ეგზემპლარის) შექმნა რომელიც გამოყენებული იქნება გლობალურად გარკვეულ კონტექსტში. ზოგიერთ პროგრამირების ენაში (მაგ. C, PHP) არსებობს ე.წ. გლობალური ცვლადის ცნება, რომლის ინიციალიზაციაც ხდება ფუნქციებისა [...]]]></description>
			<content:encoded><![CDATA[<p>ყველა სახელმძღვანელო რომელიც წამიკითხავს იწყება სწორედ ამ პატერნის აღწერით, რაც უდავოდ გამოწვეულია იმით რომ იგი წარმოადგენს ყველაზე მარტივს არსებულ პატერნებს შორის.<span id="more-9"></span></p>
<p>ამ პატერნის გამოყენებით შესაძლებელია კონკრეტული ტიპის(კლასის) ერთი და მხოლოდ ერთი ობიექტის (ეგზემპლარის) შექმნა რომელიც გამოყენებული იქნება გლობალურად გარკვეულ კონტექსტში. ზოგიერთ პროგრამირების ენაში (მაგ. C, PHP) არსებობს ე.წ. გლობალური ცვლადის ცნება, რომლის ინიციალიზაციაც ხდება ფუნქციებისა და კლასების კონტექსტ მიღმა და მისი გამოყენება შესაძლებელია ნებისმიერ ფუნქციასა თუ კლასში. მიუხედავად იმისა რომ Java არ არის აღჭურვილი მსგავსი შესაძლებლობით Singleton პატერნის მეშვეობით შესაძლებელია მივიღოთ იგივე(თუმცა უფრო დახვეწილი და მოქნილი) შედეგი რაც მიიღება გლობალური ცვლადებით სხვა ენებში.</p>
<p>თავისი უმარტივესი ფორმით ეს პატერნი შეიძლება ჩავწეროთ შემდეგნაირად:</p>
<div class="codecolorer-container java blackboard" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><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="java codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">class</span> Singleton <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">static</span> Singleton singleton <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//private static variable to store reference to the singleton instance</span><br />
<br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">private</span> Singleton<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span> <span style="color: #666666; font-style: italic;">//private constructor</span><br />
<br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> Singleton getInstance<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>singleton <span style="color: #339933;">==</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; singleton <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Singleton<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">return</span> singleton<span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//return the reference</span><br />
<br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
<br />
<span style="color: #009900;">&#125;</span></div></td></tr></tbody></table></div>
<p>მთავარი დეტალი ამ პატერნის გამოყენებისას არის ის რომ კლიენტს(პროგრამის სხვა კოდი რომელიც იყენებს ამ კლასს) არ უნდა შეეძლოს ამ კლასის ობიექტის ცხადად შექმნა (new-ს გამოყენებით) რაც მიიღწევა ამ კლასის კონსტრუქტორის როგორც private წევრად აღწერით. ერთი შეხედვით შეიძლება უცნაურად(და სულელურად) გეჩვენოთ private კონსტრუქტორი კლასში, მაგრამ გარდა იმისა რომ ეს სავსებით დასაშვებია Java-ში ასევე არის ერთადერთი გზა რათა კლიენტს შევუზუდოთ ამ კლასის ობიექტების შექმნა.</p>
<p>private კონსტრუქტორს გარდა იმ  ამოცანისა რაც აღნიშნული იყო ზევით ასევე გააჩნია სხვა დანიშნულება, იმ შემთხვევაში თუ კლასში არ განვსაზღვრავთ ერთ კონსტრუქტორს (ამ შემთხვევაში private) მაინ, მაშინ კომპილატორი თავად დააგენერირებს ნაგულისხმევ კონსტრუქტორს ფაილის კომპილაციისას რაც თავისთავად გულისხმობს იმას რომ ამ კლასის მემკვიდრეებსა და იმავე პაკეტში არსებულ სხვა კლასებს მისცემს მისი ობიექტების ცხადად შექმნის საშუალებას.</p>
<p>ნაცვლად Singleton კლასის ობიექტის ცხადად შექმნის შესაძლებლობისა კლიენტს უნდა შევთავაზოთ მეთოდი(მეთოდები) რომლებიც იზრუნებენ ამ კლასის ობიექტის შექმნასა და მის დაბრუნებაზე. ზემოთ აღწერილ მაგალითში ასეთი მეთოდია getInstance() რომელიც არის public და ასევე static რაც გულისხმობს იმას რომ ამ მეთოდზე წვდომა შესაძლებელია მისი კლასის ობიექტის არსებობის გარეშე.</p>
<p>თავისთავად მეთოდი მარტივია და აკეთებს ორ ძირითად რამეს:</p>
<ol>
<li>ამოწმებს არსებობს თუ არა Singleton კლასის ობიექტი, თუ არ არსებობს ქმნის მას.</li>
<li>აბრუნებს უკვე არსებულ ობიექტს.</li>
</ol>
<p>ასევე აღსანიშნავია ლოკალური singleton ცვლადი რომელიც არის private და static რაც თავისთავად გულისხმობს რომ მასთან წვდომა გააჩნიათ მხოლოდ იგივე კლასის სხვა წევრებს და მისი ინიციალიზაციისათვის არ არის აუცილებელი კლასის ობიექტის შექმნა.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.code.ge/posts/singleton-pattern-java/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

