<?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; PHP</title>
	<atom:link href="http://www.code.ge/posts/tag/php/feed" rel="self" type="application/rss+xml" />
	<link>http://www.code.ge</link>
	<description>ბლოგი ვებ პროგრამირებისა და ტექნოლოგიების შესახებ</description>
	<lastBuildDate>Mon, 03 May 2010 14:38:57 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>STL: Simple Template Language Preview</title>
		<link>http://www.code.ge/posts/stl-simple-template-language-preview</link>
		<comments>http://www.code.ge/posts/stl-simple-template-language-preview#comments</comments>
		<pubDate>Wed, 02 Dec 2009 08:41:15 +0000</pubDate>
		<dc:creator>იოსები</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[RegExp]]></category>
		<category><![CDATA[stl]]></category>
		<category><![CDATA[template language]]></category>

		<guid isPermaLink="false">http://www.code.ge/?p=428</guid>
		<description><![CDATA[დიდი ხნის პაუზის შემდეგ მინდა წარმოგიდგინოთ ერთი ახალი პროექტი რომელზეც გარკვეული პერიოდია ვმუშაობ. ჯერჯერობით ეს არის პრივიუ რელიზი რომელიც მალე საბოლოო ფაზაში შევა და სრულ დოკუმენტაციასა და მაგალითებს შესაბამისად წარმოგიდგენთ. მანამდე კი მისი ნახვა და გადმოწერა შეგიძლიათ შემდეგი მისამართიდან: STL Library. რა არის STL? როგორც სათაურმა მიგანიშნათ ეს არის PHP &#8211; ზე დაწერილი მარტივი და [...]]]></description>
			<content:encoded><![CDATA[<p>დიდი ხნის პაუზის შემდეგ მინდა წარმოგიდგინოთ ერთი ახალი პროექტი რომელზეც გარკვეული პერიოდია ვმუშაობ. ჯერჯერობით ეს არის პრივიუ რელიზი რომელიც მალე საბოლოო ფაზაში შევა და სრულ დოკუმენტაციასა და მაგალითებს შესაბამისად წარმოგიდგენთ. მანამდე კი მისი ნახვა და გადმოწერა შეგიძლიათ შემდეგი მისამართიდან: <a href="http://github.com/ioseb/STL/blob/master/stl.lib.php">STL Library</a>.</p>
<p>რა არის STL? როგორც სათაურმა მიგანიშნათ ეს არის PHP &#8211; ზე დაწერილი მარტივი და მოქნილი შაბლონების ენა და ამ ენის პროცესორი. STL არის მარტივად გამოყენებადი შაბლონების ენა რომელიც არის საკმაოდ მარტივად ასათვისებელი თუ თქვენ გაგაჩნიათ ნებისმიერ მსგავს შაბლონების ენასთან  სულ მცირედი მუშაობის გამოცდილებაც კი. მისი სინტაქსი წააგავს Django, Jinja2, Smarty და სხვა მსგავსი შაბნოლენბის ენებს.</p>
<p>ბიბლიოთეკას არ აქვს არანაირი დამოკიდებულება სხვა გარე ბიბლიოთეკებზე და PHP &#8211; ს სპეციფიურ მოდულებზე. კი არის სრულად ე.წ. standalone და მისი გამოყენება შეგიძლიათ ნებისმიერ PHP პროექტში. <span id="more-428"></span></p>
<p>რა არის საჭირო მისი გამოყენებისთვის? სულ მცირედი: 1) თქვენს პროექტში უნდა ჩატვირთოთ <strong>stl.lib.php</strong> რომლის გადაწერაც შეგიძლიათ ზემოთ მითითებული მისამართიდან; 2) შექმნათ შაბლონი ნებისმიერ ტექსტურ ფორმატში(html, txt, xml და ა.შ); 3) შექმნათ STL_template კლასის ობიექტი, გადასცეთ მას საჭირო ტექსტური შაბლონი და კონტესტური ცვლადები და შეასრულოთ. სულ ეს არის და ეს. როგორ? მაგალითი იხილეთ ქვემოთ:</p>
<p><strong>HTML შაბლონი &#8211; test.html</strong></p>
<div class="codecolorer-container html4strict 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="html4strict codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">{if students}<br />
&nbsp; <span style="color: #009900;">&lt;<a href="http://december.com/html/4/element/h1.html"><span style="color: #000000; font-weight: bold;">h1</span></a>&gt;</span>This is students list<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><a href="http://december.com/html/4/element/h1.html"><span style="color: #000000; font-weight: bold;">h1</span></a>&gt;</span><br />
&nbsp; <span style="color: #009900;">&lt;<a href="http://december.com/html/4/element/ul.html"><span style="color: #000000; font-weight: bold;">ul</span></a>&gt;</span><br />
&nbsp; {for student in students}<br />
&nbsp; &nbsp; <span style="color: #009900;">&lt;<a href="http://december.com/html/4/element/li.html"><span style="color: #000000; font-weight: bold;">li</span></a>&gt;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #009900;">&lt;<a href="http://december.com/html/4/element/h2.html"><span style="color: #000000; font-weight: bold;">h2</span></a>&gt;</span>{fn:ucfirst(strtolower(%student.name%))}<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><a href="http://december.com/html/4/element/h2.html"><span style="color: #000000; font-weight: bold;">h2</span></a>&gt;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #009900;">&lt;<a href="http://december.com/html/4/element/ul.html"><span style="color: #000000; font-weight: bold;">ul</span></a>&gt;</span><br />
&nbsp; &nbsp; &nbsp; {for friend in student.friends}<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&lt;<a href="http://december.com/html/4/element/li.html"><span style="color: #000000; font-weight: bold;">li</span></a>&gt;</span>%friend.name%<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><a href="http://december.com/html/4/element/li.html"><span style="color: #000000; font-weight: bold;">li</span></a>&gt;</span><br />
&nbsp; &nbsp; &nbsp; {/for}<br />
&nbsp; &nbsp; &nbsp; <span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><a href="http://december.com/html/4/element/ul.html"><span style="color: #000000; font-weight: bold;">ul</span></a>&gt;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><a href="http://december.com/html/4/element/li.html"><span style="color: #000000; font-weight: bold;">li</span></a>&gt;</span><br />
&nbsp; {/for}<br />
&nbsp; <span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><a href="http://december.com/html/4/element/ul.html"><span style="color: #000000; font-weight: bold;">ul</span></a>&gt;</span><br />
{else}<br />
&nbsp; <span style="color: #009900;">&lt;<a href="http://december.com/html/4/element/h1.html"><span style="color: #000000; font-weight: bold;">h1</span></a>&gt;</span>The students list is empty :(<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><a href="http://december.com/html/4/element/h1.html"><span style="color: #000000; font-weight: bold;">h1</span></a>&gt;</span><br />
{/if}</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 />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 /></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 />
<span style="color: #000088;">$tpl</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> STL_template<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'test.html'</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #666666; font-style: italic;">//შაბლონში მონაცემების დამატება</span><br />
<span style="color: #000088;">$tpl</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">put</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'students'</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><br />
&nbsp; <a href="http://www.php.net/array"><span style="color: #990000;">array</span></a><span style="color: #009900;">&#40;</span><br />
&nbsp; &nbsp; <span style="color: #0000ff;">'name'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'John'</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; <span style="color: #0000ff;">'friends'</span> <span style="color: #339933;">=&gt;</span> <a href="http://www.php.net/array"><span style="color: #990000;">array</span></a><span style="color: #009900;">&#40;</span><br />
&nbsp; &nbsp; &nbsp; <a href="http://www.php.net/array"><span style="color: #990000;">array</span></a><span style="color: #009900;">&#40;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0000ff;">'name'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'Ann'</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; &nbsp; <a href="http://www.php.net/array"><span style="color: #990000;">array</span></a><span style="color: #009900;">&#40;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0000ff;">'name'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'Suzan'</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; &nbsp; <a href="http://www.php.net/array"><span style="color: #990000;">array</span></a><span style="color: #009900;">&#40;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0000ff;">'name'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'Tom'</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#41;</span><br />
&nbsp; <span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span><br />
&nbsp; <a href="http://www.php.net/array"><span style="color: #990000;">array</span></a><span style="color: #009900;">&#40;</span><br />
&nbsp; &nbsp; <span style="color: #0000ff;">'name'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'Tom'</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; <span style="color: #0000ff;">'friends'</span> <span style="color: #339933;">=&gt;</span> <a href="http://www.php.net/array"><span style="color: #990000;">array</span></a><span style="color: #009900;">&#40;</span><br />
&nbsp; &nbsp; &nbsp; <a href="http://www.php.net/array"><span style="color: #990000;">array</span></a><span style="color: #009900;">&#40;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0000ff;">'name'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'David'</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; &nbsp; <a href="http://www.php.net/array"><span style="color: #990000;">array</span></a><span style="color: #009900;">&#40;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0000ff;">'name'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'Mary'</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#41;</span><br />
&nbsp; <span style="color: #009900;">&#41;</span><br />
<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #666666; font-style: italic;">//შაბლონის პროცესინგი, შესრულება და გამობეჭდვა</span><br />
<span style="color: #b1b100;">echo</span> <span style="color: #000088;">$tpl</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">process</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>ნაჩვენები კოდის შესრულების შედეგად მიიღებთ სურათზე ნაჩვენებ შედეგს:</p>
<p><a href="http://www.code.ge/wp-content/uploads/Picture-28.png"><img src="http://www.code.ge/wp-content/uploads/Picture-28.png" alt="Picture 28" title="Picture 28" width="454" height="466" class="aligncenter size-full wp-image-431" /></a></p>
<p>რაც შეეხება თავად ენის სინტაქსს როგორც მაგალითიდან ჩანს იგი საკმაოდ მარტივია, თუმცა ყურადღებას შეფაჩერებ რამდენიმე დეტალზე.</p>
<p><strong>if/elseif/else ოპერატორი</strong><br />
ეს არის ერთერთი ყველაზე ხშირად გამოყენებადი ოპერატორი და შესაბამისად მაქსიმუმი გავაკეთე იმისთვის რომ მისი გამოყენება მაქსიმალურად ეფექტურად იყოს შესაძლებელი. მაგალითში ნაჩვენები კოდის ფრაგმენტი &#8220;{if students}&#8221; უბრალოდ ამოწმებს არის თუ არა აღწერილი ცვლადი სახელით &#8220;students&#8221; და აქვს თუ არა მას მინიჭებული საწყისი მნიშვნელობა. თუმცა პირობა შესაძლებელია იყოს გაცილებით უფრო კომპლექსური. ქვემოთ ნაჩვენებია ამ ოპერატორის გამოყენების ნიმუშები:</p>
<div class="codecolorer-container html4strict 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 /></div></td><td><div class="html4strict codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">{if students <span style="color: #ddbb00;">&amp;&amp; someOtherVariable==&quot;some test value&quot; || testValue in someCollection}</span><br />
<span style="color: #ddbb00;">Do something</span><br />
<span style="color: #ddbb00;">{elseif !students &amp;&amp; !someOtherVariable}</span><br />
<span style="color: #ddbb00;">Do something else</span><br />
<span style="color: #ddbb00;">{else}</span><br />
<span style="color: #ddbb00;">UPS :D </span><br />
<span style="color: #ddbb00;">{/if}</span></div></td></tr></tbody></table></div>
<p>გარდა if/elseif/else ოპერატორისა ასევე შეგიძლიათ პოპულარული და უმნიშვნელოვანი foreach ოპერატორის გამოყენება, მაგ:</p>
<div class="codecolorer-container html4strict 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 /></div></td><td><div class="html4strict codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">{for student in students}<br />
%student.name%<br />
{/for}</div></td></tr></tbody></table></div>
<p>ნაჩვენებ მაგალითში მოხდება &#8220;students&#8221; კოლექციის იტერაცია ხოლო ყოველი მომდევნო ელემენტის ახალ &#8220;student&#8221; ცვლადზე მინიჭება. მოგვიანებით კი შეგიძლიათ ახალი &#8220;student&#8221; ობიექტისა და მისი თვისებების გამოყენება.</p>
<p>ცვლადების გამობეჭდვა ხდება სპეციალური ფორმატის მეშვეობით, კერძოდ კი ცვლადი უნდა განათავსოთ პროცენტის(%) სიმბოლოებში.</p>
<p>ამ მომენტისათვის ასევე უკვე არსებობს ფუნქციების გამოძახების საშუალება, მაგალითში ნჩვენები ფრაგმენტი:</p>
<div class="codecolorer-container html4strict 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 /></div></td><td><div class="html4strict codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">{fn:ucfirst(strtolower(%student.name%))}</div></td></tr></tbody></table></div>
<p>ფრაგმენტიდან ჩანს რომ ხდება ორი ფუნქციის გამოძახება: 1) strtolower() PHP ფუნქცია რომელიც მნიშვნელობას გადაიყვანს ქვედა რეგისტრის სიმბოლოებში; 2) ucfirst PHP ფუნქცია რომელიც სტრიქონის პირველ სიმბოლოს გადაიყვანს ზედა რეგისტრის სიმბოლოში.</p>
<p>ასევე STL &#8211; ს აქვს მოდულების მხარდაჭერა თუმცა ამაზე ოდნავ მოგვიანებით შეგატყობინებთ პროექტის დარელიზების შემდეგ.</p>
<p>ამ მომენტისათვის სულ ეს არის, დოკუმენტაციასა და უფრო ვრცელ მაგალითებს შემოგთავაზებთ სულ მალე <img src='http://www.code.ge/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.code.ge/posts/stl-simple-template-language-preview/feed</wfw:commentRss>
		<slash:comments>38</slash:comments>
		</item>
		<item>
		<title>PHP: Array Tricks Part 1</title>
		<link>http://www.code.ge/posts/php-array-tricks</link>
		<comments>http://www.code.ge/posts/php-array-tricks#comments</comments>
		<pubDate>Sat, 07 Feb 2009 09:42:40 +0000</pubDate>
		<dc:creator>იოსები</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.code.ge/?p=174</guid>
		<description><![CDATA[ამ პოსტს ჩემი ერთი მეგობრის თხოვნით ვწერ რომელთანაც გუშინ საუბარი მქონდა PHP &#8211; ს მასივებსა და for/foreach კონსტრუქციებთან მუშაობის შესახებ. მასივები PHP &#8211; ს ერთერთი ყველაზე ძლიერი და განვითარებული მხარეა და შესაბამისად შეიცავს უამრავ ნიუანსს. ხშირ შემთხვევაში ასეთი ნიუანსები გამოუცდელი თუ გამოცდილი პროგრამისტების მიერ იგნორირებული რჩება და ამის შედეგად ვღებულობთ საკმაოდ დაუხვეწავ და სრულიად ზედმეტ [...]]]></description>
			<content:encoded><![CDATA[<p>ამ პოსტს ჩემი ერთი მეგობრის თხოვნით ვწერ რომელთანაც გუშინ საუბარი მქონდა PHP &#8211; ს მასივებსა და for/foreach კონსტრუქციებთან მუშაობის შესახებ.</p>
<p>მასივები PHP &#8211; ს ერთერთი ყველაზე ძლიერი და განვითარებული მხარეა და შესაბამისად შეიცავს უამრავ ნიუანსს. ხშირ შემთხვევაში ასეთი ნიუანსები გამოუცდელი თუ გამოცდილი პროგრამისტების მიერ იგნორირებული რჩება და ამის შედეგად ვღებულობთ საკმაოდ დაუხვეწავ და სრულიად ზედმეტ კოდს.</p>
<p>ამ პოსტში მაქსიმალურად შევეცდები გადმოვცე ის დეტალები რაც PHP &#8211; სთან წლების მანძილზე მუშაობით შევიძინე და იმედი მაქვს რომ ეს ინფორმაცია თქვენთვისაც სასარგებლო იქნება.<span id="more-174"></span> მაშ ასე შევუდგეთ საქმეს <img src='http://www.code.ge/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<h2>ფუნქციიდან მასივის დაბრუნება</h2>
<p>ხშირად მინახავს ასეთი ფუნქციები რომლებიც გარკვეული პირობის შესაბამისად აბრუნებენ ან მასივს ან null მნიშვნელობას(ასეთი შეცდომა მეც არაერთხელ მომსვლია და ამაში ტრაგიკული არაფერია). რეალურად ეს აბსოლუტურად ზედმეტი და არასაჭირო ქმედებაა რადგან შემდგომ დამატებითი კოდის წერის საჭიროებას იწვევს. ასეთ შემთხვევაში უმჯობესია ფუნქციამ დააბრუნოს უბრალოდ ცარიელი მასივი და არა null. მაგალითისათვის განვიხილოთ შემდეგი კოდი:</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 /></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;">function</span> getArray<span style="color: #009900;">&#40;</span><span style="color: #000088;">$flag</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>&nbsp; <br />
&nbsp; &nbsp;<span style="color: #b1b100;">return</span> <span style="color: #000088;">$flag</span> <span style="color: #339933;">==</span> <span style="color: #009900; font-weight: bold;">true</span> ? <a href="http://www.php.net/array"><span style="color: #990000;">array</span></a><span style="color: #009900;">&#40;</span>1<span style="color: #339933;">,</span> 2<span style="color: #339933;">,</span> 3<span style="color: #009900;">&#41;</span> <span style="color: #339933;">:</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span></div></td></tr></tbody></table></div>
<p>ეს ფუნქცია პარამეტრის მნიშვნელობიდან გამომდინარე დააბრუნებს ან მასივს ან null მნიშვნელობას. ახლა შევეცადოთ მისი გამოყენება:</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 /></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 />
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$array</span> <span style="color: #339933;">=</span> getArray<span style="color: #009900;">&#40;</span><span style="color: #009900; font-weight: bold;">true</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;">foreach</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$array</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$key</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$value</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; <a href="http://www.php.net/printf"><span style="color: #990000;">printf</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'key = %s and value = %s&lt;br /&gt;'</span><span style="color: #339933;">,</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: #339933;">;</span><br />
&nbsp; &nbsp;<span style="color: #009900;">&#125;</span><br />
<span style="color: #009900;">&#125;</span></div></td></tr></tbody></table></div>
<p>ნჩვენებ კოდში ვიძახებთ <strong>getArray(true)</strong> ფუნქციას და ვანიჭებთ მას $array ცვლადს, რადგან ეს ხდება IF პირობის ოპერატორში მნიშვნელობის შემოწმებაც მომენტალურად ხდება და მისი არსებობის შემთხვევაში მასივის ელემენტები გამოიბეჭდება ეკრანზე.</p>
<p>დამეთანხმებით რომ ძალიან ჩვეულებრივი და ტიპიური შემთხვევაა. მაგრამ ისეთ შემთხვევაში თუ უბრალოდ მასივის ელემენტების გამობეჭდვა გვესაჭიროება და მეტი არაფერი ეს დაწერილი კოდი სავსებით ზედმეტია. ნაჩვენები მაგალითI შეგვიძლია გადავაკეთოთ შემდეგნაირად:</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 />
<span style="color: #000000; font-weight: bold;">function</span> getArray<span style="color: #009900;">&#40;</span><span style="color: #000088;">$flag</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>&nbsp; <br />
&nbsp; &nbsp;<span style="color: #b1b100;">return</span> <span style="color: #000088;">$flag</span> <span style="color: #339933;">==</span> <span style="color: #009900; font-weight: bold;">true</span> ? <a href="http://www.php.net/array"><span style="color: #990000;">array</span></a><span style="color: #009900;">&#40;</span>1<span style="color: #339933;">,</span> 2<span style="color: #339933;">,</span> 3<span style="color: #009900;">&#41;</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: #000088;">$array</span> <span style="color: #339933;">=</span> getArray<span style="color: #009900;">&#40;</span><span style="color: #009900; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #b1b100;">foreach</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$array</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$key</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$value</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp;<a href="http://www.php.net/printf"><span style="color: #990000;">printf</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'key = %s and value = %s&lt;br /&gt;'</span><span style="color: #339933;">,</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: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span></div></td></tr></tbody></table></div>
<p>ამ კოდის შესრულების შემდეგ აბსოლუტურად იდენტურ შედეგს მივიღებთ, თუმცა ერთი ძალიან მნიშნველოვანი განსხვავებით, რომ, IF პირობის გამოყენება სრულიად აცილებულია თავიდან რადგან ფუნქცია ნებისმიერ შემთხვევაში აბრუნებს მასივს, ხოლო ასეთ შემოწმებას თავად foreach ახდენს ავტომატურად. </p>
<p>ახლა ბუნებრივად უნდა დაიბადოს შეკითხვა თუ რა მოვიგეთ განსაკუთრებული? აქ კიდევ ერთ ნიუანსზე შევაჩერებ თქვენს ყურადღებას და getArray ფუნქციის გამოყენების რამდენიმე სასარგებლო დეტალს შევეხები. ამისათვის საჭიროა კოდში შევიტანოთ პატარა ცვლილება:</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 /></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 />
<span style="color: #000000; font-weight: bold;">function</span> getArray<span style="color: #009900;">&#40;</span><span style="color: #000088;">$flag</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp;<span style="color: #666666; font-style: italic;">//ფუნქციის გამოძახების ინდიკატორი</span><br />
&nbsp; &nbsp;<span style="color: #b1b100;">echo</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'invoked&lt;br /&gt;'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>&nbsp; <br />
&nbsp; &nbsp;<span style="color: #b1b100;">return</span> <span style="color: #000088;">$flag</span> <span style="color: #339933;">==</span> <span style="color: #009900; font-weight: bold;">true</span> ? <a href="http://www.php.net/array"><span style="color: #990000;">array</span></a><span style="color: #009900;">&#40;</span>1<span style="color: #339933;">,</span> 2<span style="color: #339933;">,</span> 3<span style="color: #009900;">&#41;</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: #666666; font-style: italic;">//getArray() ფუნქციის გამოძახება foreach კონსტრუქციაში</span><br />
<span style="color: #b1b100;">foreach</span><span style="color: #009900;">&#40;</span>getArray<span style="color: #009900;">&#40;</span><span style="color: #009900; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$key</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$value</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp;<a href="http://www.php.net/printf"><span style="color: #990000;">printf</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'key = %s and value = %s&lt;br /&gt;'</span><span style="color: #339933;">,</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: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span></div></td></tr></tbody></table></div>
<p>ამ კოდის შესრულების შემდეგ მივიღებთ ანალოგიურ შედეგს, თუმცა უნდა აღინიშნოს, რომ, ამჯერად getArray() ფუნქცია გამოიძახება პირდაპირ foreach() კონსტრუქციაში და არა მის გარეთ. ეს ძალიან მნიშნელოვანი დეტალია რადგან ბევრ პროგრამისტს რატომღაც შეცდომად მიაჩნია ფუნქციის ამგვარი გამოძახება. რატომ? რადგან ფუნქცია გამოიძახება foreach &#8211; ში მიიჩნევა რომ მისი გამოძახება მოხდება იმდენჯერ რამდენი იტერაციაც იქნება ციკლში. თუმცა ეს ბუნებრივია ასე არ არის რასაც ზემოთ ნაჩვენები მაგალითიც ამტკიცებს. </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 /></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;">//getArray() ფუნქციის დაბრუნებული მნიშვნელობის მინიჭება</span><br />
<span style="color: #b1b100;">foreach</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$array</span> <span style="color: #339933;">=</span> getArray<span style="color: #009900;">&#40;</span><span style="color: #009900; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$key</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$value</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp;<a href="http://www.php.net/printf"><span style="color: #990000;">printf</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'key = %s and value = %s&lt;br /&gt;'</span><span style="color: #339933;">,</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: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span></div></td></tr></tbody></table></div>
<p>რატომღაც ცვლადზე ფუნქციის მიერ დაბრუნებული მნიშვნელობის ეს მეთოდიც ხშირად არის იგნორირებული, თუმცა ასეთი მინიჭება სრულებით დასაშვებია და ყოველგვარი პრობლემების გარეშე მუშაობს.</p>
<p>და ასევე ბონუსის სახით გეტყვით რომ თუ მაინც გვესაჭიროება IF პირობის შესრულება ისე როგორც ეს ნაჩვენები იყო პირველ მაგალითში არც ამაზეა არანაირი პრობლემა <img src='http://www.code.ge/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>პირველ მაგალითში ნაჩვენები პირობა, ანუ:</p>
<pre>
if ($array = getArray(false)) {
   //rest of code here
}
</pre>
<p>იმუშავებს ერთნაირად მიუხედავად იმისა ფუნქცია დააბრუნებს ცარიელ მასივსა თუ null მნიშვნელობას რადგან PHP fale, null, array() და 0 მნიშვნელობის ასეთი შემოწმების შემთხვევაში ყოველთვის დააბრუნებს false &#8211; ს.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.code.ge/posts/php-array-tricks/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>PHP: Document Root for FTP Client?</title>
		<link>http://www.code.ge/posts/php-document-root-for-ftp-client</link>
		<comments>http://www.code.ge/posts/php-document-root-for-ftp-client#comments</comments>
		<pubDate>Sat, 17 Jan 2009 13:52:29 +0000</pubDate>
		<dc:creator>იოსები</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.code.ge/?p=157</guid>
		<description><![CDATA[ვებ სერვერზე PHP &#8211; თი ფაილებთან მუშაობა არაერთ სიურპრიზს გვთავაზობს, რაც ზოგჯერ საინტერესოა ზოგჯერ კი მართლა მოსაბეზრებელი თუმცა არის ერთი საკითხი რაზეც ამჯერად შევაჩერებ თქვენს ყურადღებას. სერვერზე ფაილებთან მუშაობა PHP &#8211; ს შესაბამისი ფუნქციებით(fopen, fwrite, touch და ა.შ) საკმაოზე უფრო მოუხერხებელია უსაფრთხოების დეტალების გამო. არავისთვის არ წარმოადგენს საიდუმლოს რომ ვებ სერვერზე განთავსებულ ფაილებს უნდა გააჩნდეთ [...]]]></description>
			<content:encoded><![CDATA[<p>ვებ სერვერზე PHP &#8211; თი ფაილებთან მუშაობა არაერთ სიურპრიზს გვთავაზობს, რაც ზოგჯერ საინტერესოა ზოგჯერ კი მართლა მოსაბეზრებელი <img src='http://www.code.ge/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  თუმცა არის ერთი საკითხი რაზეც ამჯერად შევაჩერებ თქვენს ყურადღებას.</p>
<p>სერვერზე ფაილებთან მუშაობა PHP &#8211; ს შესაბამისი ფუნქციებით(fopen, fwrite, touch და ა.შ) საკმაოზე უფრო მოუხერხებელია უსაფრთხოების დეტალების გამო. არავისთვის არ წარმოადგენს საიდუმლოს რომ ვებ სერვერზე განთავსებულ ფაილებს უნდა გააჩნდეთ შექმნის, ჩაწერის, წაკითხვისა და წაშლის შეზღუდვები. </p>
<p>ასეთ შემთხვევაში ფაილებთან მუშაობის ერთადერთ სწორ და ეფექტურ გზად რჩება PHP FTP მოდულის გამოყენება, ან soeket &#8211; ებზე დაყრდნობით შექმნილი შესაბამისი რეალიზაციის გამოყენება, რაც ფაქტიურად ერთი და იგივეა.<span id="more-157"></span></p>
<p>რატომ FTP? იმიტომ, რომ სწორედ FTP მომხმარებელს გააჩნია ფაილებთან წვდომის შესაბამისი პერმიშენები, განსხვავებით იმ მომხმარებლისგან რომელიც ტრადიცულად აქვს PHP &#8211; ს.</p>
<p><strong>პრობლემა</strong><br />
რამდენადაც ყველასათვის ცონბილია ვებ აპლიკაცია მუშაობს ე.წ. DOCUMENT_ROOT &#8211; ის შიგნით. მაგ:</p>
<pre>
/home/code.ge/public_html
</pre>
<p>სწორედ ამ მისამართის ქვეშ არის განლაგებული ვებ აპლიკაციის ყველა ფაილი, თუმცა იგივეს ვერ ვიტყვით სერვერთან FTP კლიენტით დაკავშირების შემთხვევაში. როდესაც სერვერს ვუკავშირდებით FTP კლიენტით მისამართი განსხვავდება და ხელთ გვაქვს მსგავსი ტიპის მისამართი:</p>
<pre>
/
</pre>
<p>ასეთ შემთხვევაში ერთსა და იმავე ფაილთან აღნისნული მეთოდებით მუშაობისას მივიღებთ ორ განსხვავებულ მისამართს:</p>
<pre>
//ტრადიციული შემთხვევა
/home/code.ge/public_html/dir/some-file.gif
//FTP - ს კლიენტის გამოყენების შემთხვევაში
/public_html/dir/some-file.gif
</pre>
<p>განსხვავება თვალსაჩიანოა? <img src='http://www.code.ge/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>ცხადია ფაილებთან მუშაობისას საჭიროა რაიმე კონსისტენტური გზის გამონახვა რომელიც ერთნაირად ეფექტურად იმუშავებს როგორც ზემოთხსენებული ჩვეულებრივი ფაილებთან სამუშაო ფუნქციების გამოყენებით, ასევე PHP &#8211; ს FTP გაფართოვების ფუნქციების გამოყენების მეშვეობით. </p>
<p>მარტივ შემთხვევაში ამ პრობლემის გადასაჭრელად უბრალოდ საკმარისია მსგავსი PHP კოდის დაწერა:</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 /></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;">$ftp_mode</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #339933;">;</span><br />
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$ftp_mode</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <a href="http://www.php.net/define"><span style="color: #990000;">define</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'_DOC_ROOT'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'/public_html'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <a href="http://www.php.net/define"><span style="color: #990000;">define</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'_DOC_ROOT'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$_SERVER</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'DOCUMENT_ROOT'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span></div></td></tr></tbody></table></div>
<p>ამ შემთხვევაში ფაილებთან მუშაობისას გაუგებრობების თავიდან ასარიდებლად ყოველი ფაილის მისამართის წინ უბრალოდ შეგვიძლია &#8220;_DOC_ROOT&#8221; კონსტანტის გამოყენება, მაგ:</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 /></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;">//FTP მოდულის გამოყენებით</span><br />
<a href="http://www.php.net/ftp_mkdir"><span style="color: #990000;">ftp_mkdir</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$conn</span><span style="color: #339933;">,</span> _DOC_ROOT <span style="color: #339933;">.</span> <span style="color: #0000ff;">'/foldername'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #666666; font-style: italic;">//ან უბრალოდ</span><br />
<a href="http://www.php.net/mkdir"><span style="color: #990000;">mkdir</span></a><span style="color: #009900;">&#40;</span>_DOC_ROOT <span style="color: #339933;">.</span> <span style="color: #0000ff;">'/foldername'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p>მაგრამ დამეთანხმებით ეს მიდგომა ყოველად მიუღებელია ისეთ შემთხვევაში როდესაც პროგრამა სხვადასხვა სერვერებზე გამოიყენება და ყოველ ჯერზე კონფიგურაციის ხელით კეთება ნამდვილად არასასიამოვნოა <img src='http://www.code.ge/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p><strong>გამოსავალი</strong><br />
სიზარმაციდან და პრაქტიკული მოსაზრებებიდან გამომდინარე საჭიროა პატარა კოდის დაწერა რომელიც ამ პრობლემას მოგვიგვარებს და ავტომატურად გამოთვლის მისამართებს ორივე შემთხვევისათვის:</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 /></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;">//მიმდინარე დირექტორია FTP კლიენტისათვის</span><br />
<span style="color: #000088;">$pwd</span> <span style="color: #339933;">=</span> <a href="http://www.php.net/ftp_pwd"><span style="color: #990000;">ftp_pwd</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$conn</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #666666; font-style: italic;">//ვინდოუსის შემთხვევაში დავიზღვიოთ თავი და შევცვალოთ მარცხენა სლეში მარჯვენათი</span><br />
<span style="color: #000088;">$pwd</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: #0000ff;">'\', '</span><span style="color: #339933;">/</span><span style="color: #0000ff;">', $pwd);<br />
<br />
//თუ მიმდინარე დირექტორია არ არის უბრალოდ &quot;/&quot;, მოვაშალოთ თავსა და ბოლოში სლეშები<br />
if ($pwd !== '</span><span style="color: #339933;">/</span><span style="color: #0000ff;">') {<br />
&nbsp; &nbsp;$pwd = trim($pwd, '</span>\<span style="color: #339933;">/</span><span style="color: #0000ff;">');<br />
}<br />
<br />
//აპლიკაციის ინსტალაციის დირექტორია, იგულისხმება რომ იგი ავტომატურად გამოთვლილია სკრიპტის მიერ<br />
define('</span>_APP_PATH<span style="color: #0000ff;">', '</span><span style="color: #339933;">/</span>my<span style="color: #339933;">-</span>app<span style="color: #339933;">-</span>path<span style="color: #0000ff;">');<br />
<br />
//დავამუშავოთ ვებ სერვერის DOCUMENT_ROOT და მივამატოთ მას აპლიკაციის ინსტალაციის დირექტორია<br />
$docroot = preg_replace(<br />
&nbsp; &nbsp;array('</span>~\\\~<span style="color: #0000ff;">', '</span>~^<span style="color: #009900;">&#91;</span>a<span style="color: #339933;">-</span>z<span style="color: #009900;">&#93;</span><span style="color: #339933;">:</span>~i<span style="color: #0000ff;">', '</span>~^<span style="color: #339933;">/|/</span>$~<span style="color: #0000ff;">'), <br />
&nbsp; &nbsp;array('</span><span style="color: #339933;">/</span><span style="color: #0000ff;">', '</span><span style="color: #0000ff;">', '</span><span style="color: #0000ff;">'), <br />
&nbsp; &nbsp;$_SERVER['</span>DOCUMENT_ROOT<span style="color: #0000ff;">']<br />
) . _APP_PATH;<br />
<br />
//დამხმარე ფუნქცია დროებითი მისამართის გენერაციისათვის<br />
function path($pwd, $path) {<br />
&nbsp; &nbsp;$tokens = array();<br />
&nbsp; &nbsp;if ($pwd = trim($pwd, '</span>\<span style="color: #339933;">/</span><span style="color: #0000ff;">')) {<br />
&nbsp; &nbsp; &nbsp; $tokens[] = $pwd;<br />
&nbsp; &nbsp;}<br />
&nbsp; &nbsp;$tokens[] = $path;<br />
&nbsp; &nbsp;return '</span><span style="color: #339933;">/</span><span style="color: #0000ff;">' . implode('</span><span style="color: #339933;">/</span><span style="color: #0000ff;">', $tokens);<br />
}<br />
<br />
//DOCUMENT_ROOT დავყოთ ნაწილებად<br />
$tokens &nbsp;= explode('</span><span style="color: #339933;">/</span><span style="color: #0000ff;">', $docroot);<br />
$apppath = null;<br />
<br />
//შევასრულოთ ftp_chdir ფუნქცია იქამდე სანამ იგი არ დაგვიბრუნებს &quot;true&quot; - ს<br />
while(ftp_chdir($conn, $apppath = path($pwd, implode('</span><span style="color: #339933;">/</span><span style="color: #0000ff;">', $tokens))) !== true) {<br />
&nbsp; &nbsp;//DOCUMENT_ROOT მასივიდან ყოველ იტერაციაზე ამოვაგდოთ მასივის დასაწყისში მყოფი ელემენტი<br />
&nbsp; &nbsp;array_shift($tokens);<br />
&nbsp; &nbsp;$apppath = null;<br />
}<br />
<br />
//გამოვბეჭდოთ გამოთვლილი დირექტორია<br />
echo $apppath;</span></div></td></tr></tbody></table></div>
<p>სულ ეს არის <img src='http://www.code.ge/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  </p>
]]></content:encoded>
			<wfw:commentRss>http://www.code.ge/posts/php-document-root-for-ftp-client/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Mac Os X XAMPP: Tidy &#8211; ს ინსტალაცია PHP-5.2.6 &#8211; სთვის</title>
		<link>http://www.code.ge/posts/mac-os-x-xampp-tidy-installation-for-php-5-2-6</link>
		<comments>http://www.code.ge/posts/mac-os-x-xampp-tidy-installation-for-php-5-2-6#comments</comments>
		<pubDate>Thu, 18 Dec 2008 08:35:50 +0000</pubDate>
		<dc:creator>იოსები</dc:creator>
				<category><![CDATA[Apache]]></category>
		<category><![CDATA[Mac OS X]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.code.ge/?p=154</guid>
		<description><![CDATA[ამ პოსტში მინდა მოგითხროთ პატარა ისტორია Mac OS X &#8211; ზე PHP &#8211; ს რეკომპილაციით მიღებულ &#8220;სიამოვნებასა&#8221; და უსაზღვრო &#8220;კომფორტზე&#8221; რომელიც ბოლო ორი დღის განმავლობაში მივიღე. მაშ ასე, თუ თქვენ იყენებთ XAMPP &#8211; ს და გესაჭიროებათ PHP &#8211; სთვის tidy გაფართოვების დამატება რომელიც სამწუხაროთ XAMPP &#8211; ს არ მოყვება, გაგახარებთ და გეტყვით რომ საკმაოდ სერიოზული [...]]]></description>
			<content:encoded><![CDATA[<p>ამ პოსტში მინდა მოგითხროთ პატარა ისტორია Mac OS X &#8211; ზე PHP &#8211; ს რეკომპილაციით მიღებულ &#8220;სიამოვნებასა&#8221; და უსაზღვრო &#8220;კომფორტზე&#8221; რომელიც ბოლო ორი დღის განმავლობაში მივიღე.</p>
<p>მაშ ასე, თუ თქვენ იყენებთ XAMPP &#8211; ს და გესაჭიროებათ PHP &#8211; სთვის <strong>tidy</strong> გაფართოვების დამატება რომელიც სამწუხაროთ XAMPP &#8211; ს არ მოყვება, გაგახარებთ და გეტყვით რომ საკმაოდ სერიოზული პრობლემის წინაშე დგახართ <img src='http://www.code.ge/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> <span id="more-154"></span></p>
<p>რა არის საჭირო ამ მიზნის მისაღწევად? მივყვეთ ნაბიჯ ნაბიჯ:</p>
<ol>
<li>შეინახეთ ყველა არსებული პროექტი უსაფრთხო ადგილას;</li>
<li>გაანადგუროთ ყველა არსებული PHP ინსტალაცია, ამისათვის ტერმინალში აკრიფეთ შემდეგი ბრძანებები:
<p></p>
<pre>
sudo rm -rf /Applications/xampp
sudo rm -rf /usr/include/php
sudo rm -rf /usr/lib/php
</pre>
</li>
<li>გადმოწეროთ <a href="http://www.apachefriends.org/download.php?xampp-macosx-0.7.4.dmg">XAMPP ის ბოლო ვერსია</a> და დააინსტალირეთ;</li>
<li>გადმოწერეთ <a href="http://www.apachefriends.org/download.php?xampp-macosx-0.7.4-dev.tar.gz">XAMPP &#8211; ის დეველოპერ პაკეტი</a> ნებისმიერ ადგილას, შედით შესაბამის კატალოგში და დააინსტალირეთ შემდეგი ბრძანებით:<br />
</p>
<pre>
sudo tar xvfpz xampp-macosx-0.7.4-dev.tar.gz -C /Applications/xampp
</pre>
</li>
<li>გადმოწერეთ <a href="http://www.php.net/releases/">PHP 5.2.6 &#8211; ის დისტრიბუტივი</a> და გახსენით არქივი ნებისმიერ მისამართზე, მაგ:<br />
</p>
<pre>
/Users/iosebdzmanashvili/Documents/PHP/php-5.2.6
</pre>
</li>
<li>გაუშვით XAMPP, შექმენით ნებისმიერი PHP ფაილი და გამობეჭდეთ phpinfo.
<p>მიღებული რეზულტატიდან დააკოპირეთ და შეინახეთ კონფიგურაციის პარამეტრები, ეს ნაბიჯი აუცილებელია არსებული კონფიგურაციის შესანარჩუნებლად. ორიგინალი დაახლოვებით გამოიყურება ასე:</p>
<p></p>
<pre style="overflow: auto;">
./configure --prefix=/Applications/xampp/xamppfiles --program-suffix=-5.2.6 --libdir=/Applications/xampp/xamppfiles/lib/php/php5 --includedir=/Applications/xampp/xamppfiles/include/php/php5 --with-apxs2=/Applications/xampp/xamppfiles/bin/apxs --with-config-file-path=/Applications/xampp/etc --with-mysql=/Applications/xampp/xamppfiles --disable-debug --enable-bcmath --enable-calendar --enable-ctype --enable-dbase --enable-discard-path --enable-exif --enable-filepro --enable-force-cgi-redirect --enable-ftp --enable-gd-imgstrttf --enable-gd-native-ttf --with-ttf --enable-magic-quotes --enable-memory-limit --enable-safe-mode --enable-shmop --enable-sigchild --enable-sysvsem --enable-sysvshm --enable-track-vars --enable-trans-sid --enable-wddx --enable-yp --with-ftp --with-ncurses=/Applications/xampp/xamppfiles --with-gdbm=/Applications/xampp/xamppfiles --with-jpeg-dir=/Applications/xampp/xamppfiles --with-png-dir=/Applications/xampp/xamppfiles --with-freetype-dir=/Applications/xampp/xamppfiles --without-xpm --with-zlib=yes --with-zlib-dir=/Applications/xampp/xamppfiles --with-openssl=/Applications/xampp/xamppfiles --with-expat-dir=/Applications/xampp/xamppfiles --enable-xslt=/Applications/xampp/xamppfiles --with-xsl=/Applications/xampp/xamppfiles --with-dom=/Applications/xampp/xamppfiles --with-ldap=/Applications/xampp/xamppfiles --with-gd=/Applications/xampp/xamppfiles --with-mysql-sock=/Applications/xampp/xamppfiles/var/mysql/mysql.sock --with-mcrypt=/Applications/xampp/xamppfiles --with-mhash=/Applications/xampp/xamppfiles --enable-sockets --with-curl=/Applications/xampp/xamppfiles --enable-mbregex --enable-zend-multibyte --with-zip=/Applications/xampp/xamppfiles --enable-exif --with-sqlite --with-libxml-dir=/Applications/xampp/xamppfiles --enable-soap --enable-pcntl --enable-dbx --with-mysqli=/Applications/xampp/xamppfiles/bin/mysql_config --with-bz2=/Applications/xampp/xamppfiles --with-ming=shared,/Applications/xampp/xamppfiles --with-pear=/Applications/xampp/xamppfiles/lib/php/pear --with-mssql=/Applications/xampp/xamppfiles --with-imap-dir=/Applications/xampp/xamppfiles --with-imap=/Applications/xampp/xamppfiles --enable-mbstring=all,/usr --with-gettext=/Applications/xampp/xamppfiles --with-pdo-mysql=/Applications/xampp/xamppfiles
</pre>
</li>
</ol>
<p>ახლა იწყება ყველაზე საინტერესო და არასასიამოვნო პროცესი რომლის გარკვევაზეც არცთუ ცოტა დრო დამეხარჯა:</p>
<ol>
<li>გახსენით ფაილი:<br />
</p>
<pre>
/Users/iosebdzmanashvili/Documents/PHP/php-5.2.6/ext/tidy/tidy.c
</pre>
<p>მოძებნეთ გახსნილ ფაილში <strong>#include &#8220;tidy.h&#8221;</strong> და გადაიტანეთ იგი ფაილის დასაწყისში.</p>
</li>
<li>
<strong>tidy</strong> &#8211; ს <strong>xampp</strong> &#8211; ში დასაკოპირებლად ტერმინალში აკრიფეთ შემდეგი ბრძანება:<br />
</p>
<pre style="overflow: auto;">
sudo ditto /usr/include/tidy /Applications/xampp/xamppfiles/include
</pre>
<p>ეს პროცედურა მნიშნველოვანია რადგან PHP &#8211; სთან არსებული კონფლიქტის გამო საჭიროა tidy &#8211; ს ფაილებში ცვლილების შეტანა, ხოლო XAMPP &#8211; ში tidy არ დევს.
</li>
<li>
ახლად დაკოპირებული კატალოგიდან გახსენით ფაილი:<br />
</p>
<pre style="overflow: auto;">
/Applications/xampp/xamppfiles/include/tidy/platform.h
</pre>
<p>და 526 &#8211; ე ხაზიდან 531 ხაზის ჩათვლით არსებული კოდი:<br />
</p>
<pre style="overflow: auto;">
#if !defined(HPUX_OS) &#038;&#038; !defined(CYGWIN_OS) &#038;&#038; !defined(MAC_OS_X) &#038;&#038; !defined(BE_OS) &#038;&#038; !defined(SOLARIS_OS) &#038;&#038; !defined(BSD_BASED_OS) &#038;&#038; !defined(OSF_OS) &#038;&#038; !defined(IRIX_OS) &#038;&#038; !defined(AIX_OS) &#038;&#038; !defined(LINUX_OS)
typedef unsigned int uint;
#endif
#if defined(HPUX_OS) || defined(CYGWIN_OS) || defined(MAC_OS) || defined(BSD_BASED_OS) || defined(_WIN32)
typedef unsigned long ulong;
#endif
</pre>
<p>ჩაანაცვლეთ შემდეგი კოდით რათა თავიდან ავირიდოთ PHP &#8211; სთან არათავსებადობის პრობლემა:<br />
</p>
<pre style="overflow: auto;">
#if !defined(HPUX_OS) &#038;&#038; !defined(CYGWIN_OS) &#038;&#038; !defined(MAC_OS_X) &#038;&#038; !defined(BE_OS) &#038;&#038; !defined(SOLARIS_OS) &#038;&#038; !defined(BSD_BASED_OS) &#038;&#038; !defined(OSF_OS) &#038;&#038; !defined(IRIX_OS) &#038;&#038; !defined(AIX_OS) &#038;&#038; !defined(LINUX_OS)
#undef uint; /* avoid conflict with PHP */
typedef unsigned int uint;
#endif
#if defined(HPUX_OS) || defined(CYGWIN_OS) || defined(MAC_OS) || defined(BSD_BASED_OS) || defined(_WIN32)
#undef ulong; /* avoid conflict with PHP */
typedef unsigned long ulong;
#endif
</pre>
</li>
<li>
შენახულ PHP &#8211; ს კონფიგურაციას დაამატეთ შემდეგი ორი პარამეტრი.</p>
<p>იმ შემთხვევაში <strong>iconv</strong> არ არის თქვენს კონფიგურაციაში, საჭიროა მისი ცხადად მითითება, წინააღმდეგ შემთხვევაში კომპილაცია წარუმატებელი იქნება:<br />
</p>
<pre>
--with-iconv=/Applications/xampp/xamppfiles
</pre>
<p>ასევე მიუთითეთ <strong>tidy</strong> &#8211; ს გასააქტიურებლად საჭირო პარამეტრი:<br />
</p>
<pre>
--with-tidy=/Applications/xampp/xamppfiles
</pre>
</li>
<li>
კონფიგურაციის პარამეტრების მომზადების შემდეგ ტერმინალიდან გადადით PHP &#8211; ს დისტრიბუტივის კატალოგში:<br />
</p>
<pre>
cd /Users/iosebdzmanashvili/Documents/PHP/php-5.2.6
</pre>
<p>და ტერმინალში შეასრულეთ შემდეგი ბრძანება:<br />
</p>
<pre style="overflow: auto;">
./configure --prefix=/Applications/xampp/xamppfiles --program-suffix=-5.2.6 --libdir=/Applications/xampp/xamppfiles/lib/php/php5 --includedir=/Applications/xampp/xamppfiles/include/php/php5 --with-apxs2=/Applications/xampp/xamppfiles/bin/apxs --with-config-file-path=/Applications/xampp/etc --with-mysql=/Applications/xampp/xamppfiles --disable-debug --enable-bcmath --enable-calendar --enable-ctype --enable-dbase --enable-discard-path --enable-exif --enable-filepro --enable-force-cgi-redirect --enable-ftp --enable-gd-imgstrttf --enable-gd-native-ttf --with-ttf --enable-magic-quotes --enable-memory-limit --enable-safe-mode --enable-shmop --enable-sigchild --enable-sysvsem --enable-sysvshm --enable-track-vars --enable-trans-sid --enable-wddx --enable-yp --with-ftp --with-ncurses=/Applications/xampp/xamppfiles --with-gdbm=/Applications/xampp/xamppfiles --with-jpeg-dir=/Applications/xampp/xamppfiles --with-png-dir=/Applications/xampp/xamppfiles --with-freetype-dir=/Applications/xampp/xamppfiles --without-xpm --with-zlib=yes --with-zlib-dir=/Applications/xampp/xamppfiles --with-openssl=/Applications/xampp/xamppfiles --with-expat-dir=/Applications/xampp/xamppfiles --enable-xslt=/Applications/xampp/xamppfiles --with-xsl=/Applications/xampp/xamppfiles --with-dom=/Applications/xampp/xamppfiles --with-ldap=/Applications/xampp/xamppfiles --with-gd=/Applications/xampp/xamppfiles --with-mysql-sock=/Applications/xampp/xamppfiles/var/mysql/mysql.sock --with-mcrypt=/Applications/xampp/xamppfiles --with-mhash=/Applications/xampp/xamppfiles --enable-sockets --with-curl=/Applications/xampp/xamppfiles --enable-mbregex --enable-zend-multibyte --with-zip=/Applications/xampp/xamppfiles --enable-exif --with-sqlite --with-libxml-dir=/Applications/xampp/xamppfiles --enable-soap --enable-pcntl --enable-dbx --with-mysqli=/Applications/xampp/xamppfiles/bin/mysql_config --with-bz2=/Applications/xampp/xamppfiles --with-ming=shared,/Applications/xampp/xamppfiles --with-pear=/Applications/xampp/xamppfiles/lib/php/pear --with-mssql=/Applications/xampp/xamppfiles --with-imap-dir=/Applications/xampp/xamppfiles --with-imap=/Applications/xampp/xamppfiles --enable-mbstring=all,/usr --with-gettext=/Applications/xampp/xamppfiles --with-pdo-mysql=/Applications/xampp/xamppfiles --with-iconv=/Applications/xampp/xamppfiles --with-tidy=/Applications/xampp/xamppfiles
</pre>
</li>
<li>
./configure ოპერაციის დასრულების შემდეგ ტერმინალში აკრიფეთ შემდეგი სამი ბრძანება:<br />
<br />
პროცესის დასრულების შემდეგ:</p>
<pre style="overflow: hidden;">
make clean //გაუგებრობების თავიდან ასაცილებლად
make //აქ შეგიძლიათ ყავა მოიმზადოთ, სიგარეტი მოწიოთ და კურიერს უყუროთ <img src='http://www.code.ge/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' />  <img src='http://www.code.ge/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' />
sudo make install
</pre>
</li>
</ol>
<p>გილოცავთ! ინსტალაცია დასრულებულია <img src='http://www.code.ge/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' />  გადატვირთეთ Apache და განაგრძეთ მუშაობა <img src='http://www.code.ge/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>P.S.<br />
ფაილების მისამართებში გამოყენებული მომხმარებელის სახელი &#8220;iosebdzmanashvili&#8221; უნდა შეცვალოთ თქვენი მომხმარებლის სახელით <img src='http://www.code.ge/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.code.ge/posts/mac-os-x-xampp-tidy-installation-for-php-5-2-6/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>PHP 5.3 alpha1 &#8211; ცვლილებები ენაში</title>
		<link>http://www.code.ge/posts/php-53-alpha1-%e1%83%aa%e1%83%95%e1%83%9a%e1%83%98%e1%83%9a%e1%83%94%e1%83%91%e1%83%94%e1%83%91%e1%83%98-%e1%83%94%e1%83%9c%e1%83%90%e1%83%a8%e1%83%98</link>
		<comments>http://www.code.ge/posts/php-53-alpha1-%e1%83%aa%e1%83%95%e1%83%9a%e1%83%98%e1%83%9a%e1%83%94%e1%83%91%e1%83%94%e1%83%91%e1%83%98-%e1%83%94%e1%83%9c%e1%83%90%e1%83%a8%e1%83%98#comments</comments>
		<pubDate>Thu, 28 Aug 2008 13:14:14 +0000</pubDate>
		<dc:creator>იოსები</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.code.ge/?p=147</guid>
		<description><![CDATA[მაშ ასე, ცხოვრება წინ მიიწევს და რა თქმა უნდა ტექნოლოგიებიც ვითარდება&#8230; აგვისტოს დასაწყისსში გამოჩნდა PHP &#8211; ს ახალი 5.3 ალფა ვერსია რომელშიც ენის უმნიშვნელოვანესი გაუმჯობესებებია შეტანილი. თუმცა ამ ფაქტის შესახებ დაწერა ვერ მოვასწარი&#8230; ჯერ ქალაქში არ ვიყავი, შემდეგ კი ყველასათვის ის ავადსახსენებელი მოვლენები დაიწყო&#8230; თუმცა, მიუხედავად ყველაფრისა ცხოვრება გრძელდება და მეც ვცდილობ დავუბრუნდე ჩვეულ რითმს, [...]]]></description>
			<content:encoded><![CDATA[<p>მაშ ასე, ცხოვრება წინ მიიწევს და რა თქმა უნდა ტექნოლოგიებიც ვითარდება&#8230; აგვისტოს დასაწყისსში გამოჩნდა <a href="http://www.php.net/archive/2008.php#id2008-08-01-1">PHP &#8211; ს ახალი 5.3 ალფა ვერსია</a> რომელშიც ენის უმნიშვნელოვანესი გაუმჯობესებებია შეტანილი. თუმცა ამ ფაქტის შესახებ დაწერა ვერ მოვასწარი&#8230; ჯერ ქალაქში არ ვიყავი, შემდეგ კი ყველასათვის ის ავადსახსენებელი მოვლენები დაიწყო&#8230; </p>
<p>თუმცა, მიუხედავად ყველაფრისა ცხოვრება გრძელდება და მეც ვცდილობ დავუბრუნდე ჩვეულ რითმს, რასაც ამ მცირე მიმოხილვით დავიწყებ <img src='http://www.code.ge/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>მიმდინარე წლის დასაწყისში ენდი გუტმანსმა <a href="http://andigutmans.blogspot.com/2008/01/predictions-for-2008.html">გააკეთა გარკვეული პროგნოზები თუ როგორი იქნებოდა ტექნოლოგიუირი 2008 წელი</a> </p>
<p>გარკვეული პერიოდის შემდეგ Google &#8211; ს თანამშროლმელმა და ajaxian.com &#8211; ის რედაქტორმა, Dion Almaer &#8211; მა, დაწერა საპასუხო პოსტი &#8211; <a href="http://almaer.com/blog/andi-gutmans-predicts">Andi Gutmans Predicts</a> &#8211;  ენდის პროგნოზების შესახებ&#8230; რომლის ბოლო აბზაციც თავად PHP &#8211; განვითარებასა და მომავალს ეხება:</p>
<blockquote><p>I wonder what 2008 will be like for PHP, Andi. I have no doubt that it will continue to power a huge number of websites. But, what is PHP doing in 2008 to increase its share in the non-hacker-kiddie crowd? Is the Zend Framework going to compete with Rails and the like? How is PHP going to evolve? I want to be able to do richer DSLs with full open classes and meta-support.</p></blockquote>
<p><span id="more-147"></span></p>
<p>გადაიდგა თუ არა რაიმე ნაბიჯები PHP &#8211; ს განვითარებისთვის? დიახ გადაიდგა, და ჩემის აზრით საკმაოდ მნიშვნელოვანი ნაბიჯები&#8230; ყველა PHP &#8211; ს მომხმარებელმა კარგად იცის თუ რამდენი სასარგებლო ფუნქცია და ბიბლიოთეკა გააჩნია ამ ენას. სწორედ ეს მზამზარეული დეტალები ქმნის პროგრამირების კომფორტს, თუმცა ამ დადებითი დეტალების მიღმა PHP როგორც ენა საკმაოდ შეზღუდულია. მეხუთე ვერსიაში განხორციელებული ნახტომი რომელიც მოიცავდა OOP &#8211; ს საგრძნობ გაუმჯობესებას მაინც არ არის საკმარისი იმისათვის რომ PHP &#8211; სგან უფრო მეტი არ მოვითხოვთ&#8230; </p>
<p>მაშ ასე რა ცვლილებებთან გვაქვს საქმე?</p>
<p><strong>Namespace</strong></p>
<p>ნეიმსპეისები, რომელიც პირველი PHP 5 &#8211; ის ალფა რელიზში იყო და შემდეგ უკვე გაუგებარი მიზეზების გამო რამდენიმე წლით გაქრა&#8230; ეს არის ძალიან, ძალიან სასარგებლო თვისება ენისა კოდის უკეთესი ორგანიზებისათვის. იგივე შესაძლებლობა გვხდება C# &#8211; ში, ანალოგიური სახელით და ასევე Java &#8211; ში პაკეტების სახელით.</p>
<p><strong>Late Static Bindings და __callStatic()</strong></p>
<p>სტატიკური გვიანი დაკავშირება. OOP &#8211; ს მცოდნეთათვის არ არის უცხო გვიანი დაკავშირების(Late Binding) კონცეფცია, და დამეთანხმებით რომ იგი მიეკუთვნება ობიექტზე ორიენტირებული პრინციპების ერთერთ უმნიშვნელოვანეს შესაძლებლობათა რიცხვს. PHP &#8211; ში გვიანი დაკავშირება აქამდე ვრცელდებოდა მხოლოდ ობიექტების იერარქიის კონტექსტში. ამიერიდან ეს უკვე შესაძლებელია სტატიკური მემკვიდრეობის კონტექსტშიც. ჩემის აზრით ენის ეს ახალი შესაძლებლობა ძალიან მნიშვნელოვანია.</p>
<p>ასევე ამ განახლების რიგს მიეუკთვნება ე.წ. ჯადოსნური(magic) <strong>__callStatic</strong> მეთოდის გამოჩენა&#8230; PHP 5 &#8211; ის მცოდნეთათვის არ არის უცხო <strong>__call</strong> ჯადოსნური მეთოდი რომელიც გამოიძახება არ არსებულ მეთოდზე მიმართვის შემთხვევაში, და იგი ძალიან მოქნილი მექანიზმია მსგავსი სიტუაციების კონტროლისათვის. <strong>__call</strong> მეთოდი მასიურად არის გამოყენებული PHP &#8211; ს SOAP გაფართოვებაში. ვისაც გიმუშავიათ ამ გაფართოვებასთან გამოცდილი გექნებათ აღნიშნული მეთოდის სიმძლავრე&#8230; თუმცა აქამდე ეს მეთოდი მხოლოდ ობიექტის კონტექსტში მუშაობდა და სტატიკურ კონტექსტში მისი გამოყენების არანაირი შანსი არ არსებობდა&#8230; ახალი ჯადოსნური <strong>__callStatic</strong> მეთოდით, რომელიც გამოჩნდა ამ განახლებაში უკვე კლასის სტატიკურ კონტექსტსაც გაცილებით უფრო მოქნილსა და სასარგებლოს გახდის.</p>
<p><strong>Lambda functions and closures</strong></p>
<p>ანონიმური ფუნქციები(closures) ეს არის ჩემის აზრით ერთერთი უმნიშვნელოვანესი დამატება ენისათვის, რაც ბევრად უფრო მეტ მოქნილობას შესძენს PHP &#8211; ს. არანაირად არ მეპარება ეჭვი რომ ენის ეს შესაძლებლობა ნებისმიერი გამოცდილი სკრიპტული ენის პროგრამისტის ხელში უმნიშვნელოვანესი ინსტრუმენტი იქნება. განსაკუთრებით სასიხარული ეს შესაძლებლობა იქნება ისეთი პროგრამისტებისათვის ვისაც აქვს JavaScript &#8211; თან ან Python &#8211; თან მუშაობის გამოცდილება.</p>
<p>თუმცა იგივე JavaScript &#8211; ისგან განსხვავებით, არსებობს რამდენიმე ისეთი დეტალი რაც ყურადღებას იმსახურებს&#8230; ეს გამოწვეულია ამ ენებს შორის არსებული სკოუპების იმპლემენტაციის განსხვავების გამო. ანუ PHP &#8211; ს ანონიმური ფუნქციის გარკვეულ სკოუპში აღწერისას ავტომატურად არ უზრუნველყოფს მის მშობელ სკოუპში აღწერილი ცვლადების ხილვადობას. ამისათვის გამოიყენება სპეციალური <strong>use</strong> კონსტრუქცია რომელშიც უნდა მოხდეს საჭირო ცვლადების მითითება:</p>
<pre>
   function replace_in_array ($search, $replacement, $array) {
     $map = function ($text) use ($search, $replacement) {
       if (strpos ($text, $search) > 50) {
         return str_replace ($search, $replacement, $text);
       } else {
         return $text;
       }
     };
     return array_map ($map, $array);
   }
</pre>
<p>ასევე საგულისხმოა კლასებში <strong>_ _invoke</strong> ჯადოსნური მეთოდის გამოჩენა. ეს მეთოდი ე.წ. callable object კონცეფციის ნაწილია. ქვემოთ მოყვანილ კოდში ნაჩვენებია ამ მეთოდის გამოყენების მაგალითი:</p>
<pre>
class Example {
  public function __invoke () {
    echo "Hello World!\n";
  }
}
$foo = new Example;
$foo ();
</pre>
<p>enjoy <img src='http://www.code.ge/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.code.ge/posts/php-53-alpha1-%e1%83%aa%e1%83%95%e1%83%9a%e1%83%98%e1%83%9a%e1%83%94%e1%83%91%e1%83%94%e1%83%91%e1%83%98-%e1%83%94%e1%83%9c%e1%83%90%e1%83%a8%e1%83%98/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>PHP: nl2p(aragraph) vs nl2br</title>
		<link>http://www.code.ge/posts/php-nl2paragraph-vs-nl2br</link>
		<comments>http://www.code.ge/posts/php-nl2paragraph-vs-nl2br#comments</comments>
		<pubDate>Fri, 18 Jul 2008 15:51:49 +0000</pubDate>
		<dc:creator>იოსები</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[RegExp]]></category>

		<guid isPermaLink="false">http://www.code.ge/?p=131</guid>
		<description><![CDATA[როგორ იქცევით ისეთ შემთხვევაში, როდესაც საჭიროა HTML textarea ელემენტიდან მიღებული ტექსტის, HTML დოკუმენტში უცვლელად გამობეჭვდაა საჭირო ანუ ტექსტის ფორმატირების გათვალისწინებით? ამ შემთხვევაში, ტექსტის აბზაცებად ფორმატირებას ვგულისხმობ, სადაც აბზაცების გამოყოფად იგულისხმება ახალი სტრიქონის სიმბოლო. მაგალითად ასეთი ტექსტი: ეს არის ჩვეულებრივი აბზაცი. ეს არის შემდეგი აბზაცი... და კიდევ ერთი აბზაცი.. ამ შემთხვევაში ტექსტის გამოსაბეჭდად გამოვიყენე &#60;pre&#62; ტეგი, [...]]]></description>
			<content:encoded><![CDATA[<p>როგორ იქცევით ისეთ შემთხვევაში, როდესაც საჭიროა HTML textarea ელემენტიდან მიღებული ტექსტის, HTML დოკუმენტში უცვლელად გამობეჭვდაა საჭირო ანუ ტექსტის ფორმატირების გათვალისწინებით?</p>
<p>ამ შემთხვევაში, ტექსტის აბზაცებად ფორმატირებას ვგულისხმობ, სადაც აბზაცების გამოყოფად იგულისხმება ახალი სტრიქონის სიმბოლო.</p>
<p>მაგალითად ასეთი ტექსტი:</p>
<pre>
ეს არის ჩვეულებრივი აბზაცი.

ეს არის შემდეგი აბზაცი...

და კიდევ ერთი აბზაცი..
</pre>
<p>ამ შემთხვევაში ტექსტის გამოსაბეჭდად გამოვიყენე &lt;pre&gt; ტეგი, რომელიც ტექსტს ახალი სტრიქონის სიმბოლოების გათვალისწინებით ბეჭდავს და არ უკარგავს მას ფორმატირებას. თუმცა, &lt;pre&gt; სრულიად გამოუსადეგარია ბლოგ პოსტის ან ამ ბლოგის მომხმარებლების მიერ დაპოსტილი კომენტარების გამოსატანად.</p>
<p>PHP &#8211; ს გააჩნია ფუნქცია სახელად <strong>nl2br</strong> რომელსაც ყოველი ახალი სტრიქონის სიმბოლო გადაჰყავს &lt;br /&gt; ტეგში, თუმცა არც ეს არის დიდი ხეირი რადგან,<br />
როგორც HTML სპეციფიკაცია გვეუბნება, აბზაცების ფორმატირებისათვის უნდა გამოვიყენოთ &lt;p&gt; ტეგი, თუმცა PHP &#8211; ს ასეთი ფუნქცია არ გააჩნია.</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 /></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;">function</span> nl2p<span style="color: #009900;">&#40;</span><span style="color: #000088;">$input</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/preg_replace"><span style="color: #990000;">preg_replace</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'~^\s*(.*?)\s*$~smx'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'&lt;p&gt;$1&lt;/p&gt;'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$input</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span></div></td></tr></tbody></table></div>
<p>თუ ამ ფუნქციას გამოვიყენებთ ზემოთ მოყვანილი ტექსტის დასამუშავებლად, მივიღებთ ასეთ შედეგს:</p>
<pre>
&lt;p&gt;ეს არის ჩვეულებრივი აბზაცი.&lt;/p&gt;
&lt;p&gt;ეს არის შემდეგი აბზაცი...&lt;/p&gt;
&lt;p&gt;და კიდევ ერთი აბზაცი..&lt;/p&gt;
</pre>
<p>აღსანიშნავია რომ, ეს ფუნქცია იგნორირებას უკეთებს ერთმანეთის მიყოლებით აკრეფილ ახალი სტრიქონის სიმბოლოებს.</p>
<p>როგორ მუშაობს თავად რეგულარული გამოსახულება:</p>
<pre>
$regex = '~
    ^            # 1) შევამოწმოთ სტრიქონის დასაწყისი
    \s*          # 2) ნებისმიერი რაოდენობის უხილავი სიმბოლო
    (.*?)        # 3) ნებისმიერი რაოდენობის ნებისმიერი სიმბოლო
    \s*          # 4) ნებისმიერი რაოდენობის უხილავი სიმბოლო
    $            # 5) შევამოწმოთ სტრიქონის დასასრული
~smx'            # 6) smx - გამოსახულების მოდიფიკატორები
</pre>
<p>ბრჩხილებში მოქცეული გამოსახულების მესამე პუნქტის მეშვეობით ვინახავთ ჩვენთვის საჭირო ტექსტს, იმისათვის რომ მოგვიანებით შევძლოთ მისი გამოყენება, გამოსახულების დანარჩენი ნაწილი კი უბრალოდ ტექსტის შემოწმებისათვის არის საჭირო.</p>
<p>თავად გამოსახულებაზე უფრო საინტერესო მოცემულ შემთხვევაში არის, გამოყენებული რეგულარული გამოსახულების მოდიფიკატორები <strong>s</strong> და <strong>m</strong>.</p>
<p><strong>.</strong> &#8211; წერტილი, რეგულარულ გამოსახულებაში ნიშნავს ნებისმიერ სიმბოლოს ახალი სტრიქონის სიმბოლოს გარდა. ხოლო <strong>s</strong> მოდიფიკატორი გამოსახულების ბოლოს წერტილს უცვლის მნიშვნელობას და იგი უკვე სხვა ნებისმიერ სიმბოლოსთან ერთად ახალი სტრიქონის სიმბოლოებსაც მოიცავს. </p>
<p><strong>m</strong> მოდიფიკატორი თავის მხრივ ცვლის ტექსტის დასაწყისისა(^) და ტექსტის დასასრულის($) სიმბოლოების ქცევას. რაც ნიშნავს იმას, რომ, ეს სიმბოლოები მიუთითებენ არა მთლიანი ტექსტის დასაწყისსა და დასასრულს არამედ ახალი ხაზის სიმბოლოთი გამოყოფილ სტრიქონის დასაწყისსა და დასასრულს.</p>
<p>გამოსახულებაში ასევე მნიშვნელოვანია მეორე და მეოთხე პუნქტები. გამოსახულება უბრალოდ აღნიშნავს ნებისმიერი რაოდენობის უხილავ სიმბოლოს(უხილავ სიმბოლოებს განეკუთვნება ახალი სტრიქონის სიმბოლოც). გამოსახულების ეს ნაწილია საჭიროა იმისათვის რომ ტექსტში არსებულ ერთზე მეტ ახალი სტრიქონის სიმბოლოებს გავუკეთოთ იგნორეირება რათა არ მივიღოთ ცარიელი &lt;p&gt;p&lt;/p&gt; ტეგების კომბინაცია. </p>
<p>სულ ეს არის და ეს <img src='http://www.code.ge/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.code.ge/posts/php-nl2paragraph-vs-nl2br/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>RoR &#8211; ის მამა PHP &#8211; აქებს?</title>
		<link>http://www.code.ge/posts/the-immediacy-of-php</link>
		<comments>http://www.code.ge/posts/the-immediacy-of-php#comments</comments>
		<pubDate>Tue, 15 Jul 2008 00:35:56 +0000</pubDate>
		<dc:creator>იოსები</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.code.ge/?p=130</guid>
		<description><![CDATA[ძალიან უცნაური, მოულოდნელი და საინტერესო ბლოგ პოსტი(მადლობა გიორგის) წავიკითხე&#8230; ბევრი წერით არ შეგაწყენთ თავს. უბრალოდ ვიტყვი რომ ეს პოსტი ეკუთვნის თავად David Heinemeier Hansson ცნობილი ფრეიმვორკის Ruby on Rails &#8211; ის ავტორს! The immediacy of PHP I&#8217;ve been writing a little bit of PHP again today. That platform has really received an unfair reputation. For [...]]]></description>
			<content:encoded><![CDATA[<p>ძალიან უცნაური, მოულოდნელი და საინტერესო ბლოგ პოსტი(მადლობა გიორგის) წავიკითხე&#8230; </p>
<p>ბევრი წერით არ შეგაწყენთ თავს. უბრალოდ ვიტყვი რომ ეს პოსტი ეკუთვნის თავად <strong>David Heinemeier Hansson</strong> ცნობილი ფრეიმვორკის <strong>Ruby on Rails</strong> &#8211; ის ავტორს!</p>
<p><a href="http://www.loudthinking.com/posts/23-the-immediacy-of-php">The immediacy of PHP</a></p>
<blockquote><p>I&#8217;ve been writing a little bit of PHP again today. That platform has really received an unfair reputation. For the small things I&#8217;ve been used it for lately, it&#8217;s absolutely perfect.</p>
<p>I love the fact that it&#8217;s all just self-contained. That the language includes so many helpful functions in the box. And that it managed to get distributed with just about every instance of Apache out there.</p>
<p>For the small chores, being quick and effective matters far more than long-term maintenance concerns. Or how pretty the code is. PHP scales down like no other package for the web and it deserves more credit for tackling that scope.</p></blockquote>
<p>ჩემის აზრით ფრიად საინტერესო და საღი დამოკიდებულებაა PHP &#8211; სადმი <img src='http://www.code.ge/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' />  </p>
]]></content:encoded>
			<wfw:commentRss>http://www.code.ge/posts/the-immediacy-of-php/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>PHP: callback ფსევდო ტიპი</title>
		<link>http://www.code.ge/posts/php-callback-pseudo-type</link>
		<comments>http://www.code.ge/posts/php-callback-pseudo-type#comments</comments>
		<pubDate>Thu, 25 Oct 2007 09:23:15 +0000</pubDate>
		<dc:creator>იოსები</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.code.ge/php/php-callback-pseudo-type</guid>
		<description><![CDATA[PHP &#8211; ში არსებობს ე.წ. ფესევდო ტიპის ცნება. ფსევდო ტიპები რამდენიმეა და ერთერთი ყველაზე საინტერესო მათ შორის არის callback ფსევდო ტიპი. ცნობილია რომ ამ ენაში, მთელ რიგ ფუნქციებს შესაძლებელია callback პარამეტრები გადავცეთ, რომელიც უმეტეს შემთხვევაში წარმოადგენს ჩვეულებრივ PHP ფუნქციის(ან თავად ენაში არსებული, ან ჩვენს მიერ შექმნილი) სახელს. თუმცა დოკუმენტაციაში მითითებულია რომ გარდა ფუნქციებისა შესაძლებელია გადავცეთ [...]]]></description>
			<content:encoded><![CDATA[<p>PHP &#8211; ში არსებობს ე.წ. <a href="http://www.php.net/manual/sv/language.pseudo-types.php">ფესევდო ტიპის ცნება</a>. ფსევდო ტიპები რამდენიმეა და ერთერთი ყველაზე საინტერესო მათ შორის არის <strong>callback</strong> ფსევდო ტიპი. </p>
<p>ცნობილია რომ ამ ენაში, მთელ რიგ ფუნქციებს შესაძლებელია callback პარამეტრები გადავცეთ, რომელიც უმეტეს შემთხვევაში წარმოადგენს ჩვეულებრივ PHP ფუნქციის(ან თავად ენაში არსებული, ან ჩვენს მიერ შექმნილი) სახელს. თუმცა დოკუმენტაციაში მითითებულია რომ გარდა ფუნქციებისა შესაძლებელია გადავცეთ ასევე კლასის როგორც სტატიკური ასევე არასტატიკური მეთოდები.<span id="more-85"></span></p>
<p>როგორ გადავცეთ ფუნქციას კლასის მეთოდი callback პარამეტრად? ამის გაკეთება ძლიან მარტივია, ამისათვის საკმარისია გამოვიყენოთ ჩვეულებრივი მასივია (array) და ფუნქციას პარამეტრი გადავცეთ შემდეგი სახით:</p>
<pre>
//კლასის სტატიკური მეთოდის გამოძახების შემთხვევაში
array('ClassName', 'methodName')

//კლასის არა სტატიკური მეთოდის გამოძახების შემთხვევაში
array(new ClassName(), 'methodName');
</pre>
<p>ეს მიიღწევა მასივის მეშვეობით. მასივის პირველი ელემენტი არის კლასის სახელი თუ გვესაჭიროება სტატიკური მეთოდის გამოძახება, ან კლასის ობიექტი თუ გვსურს არასტატიკური მეთოდის გამოძახება. ყველაფერი ძალიან მარტივია.</p>
<p>თუმცა PHP5 &#8211; ში, მეთოდებთან private წვდომის მოდიფიკატორის გამოყენების საშუალება არსებობს, ეს ძალიან სასარგებლოა ხშირ შემთხვევაში რადგან კლასის ინტერფეისისათვის ყოვლად უსარგებლო მეთოდებს მთლიანად ვმალავთ მომხმარებლისათვის. რა ხდება ასეთ დროს როდესაც ვცდილობთ კლასის private მეთოდის გამოყენებას callback პარამეტრის შემთხვევაში?</p>
<p>ჩემდა გასაოცრად, ძალიან სასარგებლო რამ აღმოვაჩინე რაც არ არის დოკუმენტაციაშია მითითებული, თუმცა ეს შესაძლებელი ყოფილა. იმ შემთხვევაში თუ კლასის რომელიმე მეთოდიდან შევეცდებით იმავე კლასის private მეთოდის გამოყენებას(არ აქვს მნიშვნელობა მეთოდი სტატიკურია თუ არა) callback პარამეტრისათვის კოდი იმუშავებს, რადგან როგორც მივხვდი კლასის კონტექსტის უგულებელყოფა არ ხდება და კოდი მთლიანად სრულდება მიმდინარე კლასის კონტექსტში.</p>
<p>მაგალითად:</p>
<div class="codecolorer-container php blackboard" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;height:300px;"><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 />63<br />64<br />65<br />66<br />67<br />68<br />69<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> CallBackTest <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #666666; font-style: italic;">//სტატიკური private მეთოდი რომელიც სტრიქონს გადაიყვანს ქვედა რეგისტრში</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">private</span> static <span style="color: #000000; font-weight: bold;">function</span> testStaticPrivateMethod<span style="color: #009900;">&#40;</span><span style="color: #000088;">$param</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">return</span> <a href="http://www.php.net/strtolower"><span style="color: #990000;">strtolower</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$param</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: #666666; font-style: italic;">//ობიექტის private მეთოდი რომელიც სტრიქონს გადაიყვანს ზედა რეგისტრში</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">function</span> testInstanceMethod<span style="color: #009900;">&#40;</span><span style="color: #000088;">$param</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">return</span> <a href="http://www.php.net/strtoupper"><span style="color: #990000;">strtoupper</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$param</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: #666666; font-style: italic;">//მასივის გამოსაბეჭდი დამხმარე მეთოდი</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">private</span> static <span style="color: #000000; font-weight: bold;">function</span> pre<span style="color: #009900;">&#40;</span><span style="color: #000088;">$arr</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'&lt;pre&gt;'</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &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;">$arr</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'&lt;/pre&gt;'</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #666666; font-style: italic;">//public მეთოდი, სტატიკური private testStaticPrivateMethod მეთოდის მუშაობის ტესტირებისათვის</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">public</span> static <span style="color: #000000; font-weight: bold;">function</span> staticTest<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; <span style="color: #000088;">$input</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><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0000ff;">'Test Value1'</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0000ff;">'Value Test'</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0000ff;">'Test TEST, TeSt'</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666; font-style: italic;">//callback პარამეტრს გადავცემთ მასივის სახით, </span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666; font-style: italic;">//რომლის პირველი ელემენტი არის self რომელიც მიუთითებს კლასის სტატიკურ კონტექსტს</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$r1</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;">'self'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'testStaticPrivateMethod'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$input</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666; font-style: italic;">//მასივის გამობეჭდვა</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">self</span><span style="color: #339933;">::</span><span style="color: #004000;">pre</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$r1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> &nbsp; &nbsp; &nbsp; &nbsp; <br />
<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666; font-style: italic;">//ამ შემთხვევაში ასევე დასაშვებია ქვემოთ მითითებული კონსტრუქციის გამოყენება</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666; font-style: italic;">//სადაც self - ის ნაცვლად ვუთითებთ პირდაპირ კლასის სახელს</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666; font-style: italic;">//$r1 = array_map(array('CallBackTest', 'testStaticPrivateMethod'), $input);</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #666666; font-style: italic;">//public მეთოდი, არასტატიკური private testInstanceMethod მეთოდის მუშაობის ტესტირებისათვის</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> instanceTest<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; <span style="color: #000088;">$input</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><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0000ff;">'Test Value1'</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0000ff;">'Value Test'</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0000ff;">'Test TEST, TeSt'</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666; font-style: italic;">//callback პარამეტრს გადავცემთ მასივის სახით, რომლის პირველი ელემენტი არის მიმდინარე კლასის ობიექტი</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$r2</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: #000088;">$this</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'testInstanceMethod'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$input</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: #666666; font-style: italic;">//მასივის გამობეჭდვა</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">self</span><span style="color: #339933;">::</span><span style="color: #004000;">pre</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$r2</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; <br />
<span style="color: #009900;">&#125;</span><br />
<br />
<span style="color: #666666; font-style: italic;">//სტატიკური სატესტო მეთოდის გამოძახება</span><br />
CallBackTest<span style="color: #339933;">::</span><span style="color: #004000;">staticTest</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #666666; font-style: italic;">//კლასის ობიექტის ინსტანციაცია</span><br />
<span style="color: #000088;">$o</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> CallBackTest<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #666666; font-style: italic;">//ობიექტის სატესტო მეთოდის გამოძახება</span><br />
<span style="color: #000088;">$o</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">instanceTest</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>კოდის შესრულების შედეგი CallBackTest::staticTest() გამოძახებისათვის იქნება:</p>
<pre>
Array
(
    [0] => test value1
    [1] => value test
    [2] => test test, test
)
</pre>
<p>მასივის ყველა მნიშვნელობა გადაყვანილია ქვედა რეგისტრში, ეს ნიშნავს იმას რომ private სტატიკურმა მეთოდმა იმუშავა.</p>
<p>ხოლოდ შედეგი $o->instanceTest() გამოძახებისათვის იქნება:</p>
<pre>
Array
(
    [0] => TEST VALUE1
    [1] => VALUE TEST
    [2] => TEST TEST, TEST
)
</pre>
<p>მასივის ყველა მნიშვნელობა გადაყვანილია ზედა რეგისტრში, ეს ნიშნავს იმას რომ ობიექტის private მეთოდმა იმუშავა.</p>
<p>კოდის კომენტარებიდან ნათლად ჩანს თუ როგორ მუშაობს კოდი, თუმცა ყურადღებას შევაჩერებ private სტატიკური მეთოდის გამოძახებაზე. testStaticPrivateMethod &#8211; ში, callback &#8211; ის გადაცემისას გამოყენებულია self მიმთითებელი რომელიც გაჩნდა PHP5 &#8211; ში, და სტატიკურ წევრებთან წვდომის უფრო ბუნებრივ საშუალებას გვაძლევს. სწორედ self იქნა გამოყენებული მაგალითში თუმცა ასევე დასაშვები იყო პირდაპირ კლასის სახელის მითითებაც. ნებისმიერ შემთხვევაში კოდის შესრულების შედეგი იქნებოდა ერთნაირი. მაგრამ ყველაზე მნიშნველოვანი არის ის რომ callback პარამეტრების გამოყენების დროს არ არის აუცილებელი რომ საჭირო მეთოდები ავღწეროთ როგორც public, რადგან ამ დროს კლასის კონტექსტის უგულებელყოფა არ ხდება. ეს კი ძალიან დადებითი დეტალია რადგან ერთის მხრივ არ ვიზღუდებით ამ შესაბამისი ფსევდო ტიპის გამოყენებაში, მეორეს მხრივ კი არ არის საჭირო კლასის დიზაინის დარღვევა და გარესამყაროსთვის არასაჭირო მეთოდების როგორც public წევრების აღწერა.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.code.ge/posts/php-callback-pseudo-type/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<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>PHP 4 end of life announcement &#8211; მეფე მოკვდა! გაუმარჯოს მეფეს!</title>
		<link>http://www.code.ge/posts/php-4-end-of-life-announcement</link>
		<comments>http://www.code.ge/posts/php-4-end-of-life-announcement#comments</comments>
		<pubDate>Tue, 14 Aug 2007 09:55:54 +0000</pubDate>
		<dc:creator>იოსები</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.code.ge/php/php-4-end-of-life-announcement</guid>
		<description><![CDATA[მართალია მოგვიანებით მაგრამ მაინც უნდა შევეხო ამ ფაქტს და გამოვხატო ჩემი როგორც PHP დეველოპერის უსაღვრო სიხარული მომხდარის გამო. PHP &#8211; ს ოფიციალურ საიტზე პირველსავე გვერდზეა გამოქვეყნებული ეს ინფორმაცია. გამომდინარე იქედან რომ არ ვიმყოფებოდი თბილისში და არანაირად არ მიმიწვდებოდა ხელი ინტერნეტზე ამ ფაქტის შესახებ ძალიან გვიან შევიტყვე, თუმცა ნამდვილად ღირებული და ჩემთვის პირადად ძალიან სასიხარულო განცხადებაა [...]]]></description>
			<content:encoded><![CDATA[<p>მართალია მოგვიანებით მაგრამ მაინც უნდა შევეხო ამ ფაქტს და გამოვხატო ჩემი როგორც PHP დეველოპერის უსაღვრო სიხარული მომხდარის გამო.</p>
<p><a href="http://www.php.net/">PHP &#8211; ს ოფიციალურ საიტზე</a> პირველსავე გვერდზეა გამოქვეყნებული ეს ინფორმაცია. გამომდინარე იქედან რომ არ ვიმყოფებოდი თბილისში და არანაირად არ მიმიწვდებოდა ხელი ინტერნეტზე ამ ფაქტის შესახებ ძალიან გვიან შევიტყვე, თუმცა ნამდვილად ღირებული და ჩემთვის პირადად ძალიან სასიხარულო განცხადებაა რადგან ამ დღეს დიდი ხანი ველოდი.</p>
<p><strong>მაშ ასე => მეფე მოკვდა! გაუმარჯოს მეფეს!</strong> <img src='http://www.code.ge/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p><span id="more-66"></span></p>
<p>მართალია ადრე თუ გვიან ეს დღე დადგებოდა თუმცა დამეთანხმებით რომ ძალიან ხანგრძლივი პროცესი აღმოჩნდა. ამისათვის უამრავი მიზეზი არსებობს და გარკვეულწილად ბუნებრივიც იყო რომ ამ ვერსიის(PHP 4) ასე მარტივად ამოღება ბაზრიდან ვერ მოხერხდებოდა მაგრამ მთავარი ის არის რომ ეს უკვე მოხდა და იმედია რომ ჰოსტინგ კომპანიები და სხვადასხვა პროდუქტების ვენდორები ამ ფაქტს სათანადოდ შეაფასებენ.</p>
<p>რითი არის(იყო) PHP4 ცუდი და რატომ არის PHP5  უკეთესი და რის გამო უნდა მოხდეს ენის ამ ვერსიაზე რაც შეიძლება სწრაფი გადასვლა? მათთვის ვისთვისაც ამ ორ ვერსიას შორის სხვაობა უცნობია შეუძლიათ წაიკითხონ <strong><a href="http://www.code.ge/php/whats-new-in-php5">ეს პოსტი</a></strong> რომელიც რამდენიმე წლის წინ ვთარგმნე, ანუ მაშინ როდესაც პირველი ოფიციალური რელიზი გამოვიდა. მას მერე უამრავი რამ შეიცვალა PHP5 &#8211; ში და საგრძნობლად დაიხვეწა თითქმის სრული ვერსია, თუმცა რაც ყველაზე მთავარი და მნიშვნელოვანია ჩემის აზრით ეს არის ის რომ PHP 5.1.6 ვერსიის გამოსვლის შემოდგომ უკუთავსებადობა PHP &#8211; ს წინა ვერსიასთან აყვანიალი 100% &#8211; ზე თუ არა 99% &#8211; ზე ნამდვილად, რაც უდავოდ უზარმაზარი პლიუსია.</p>
<p>რას მოგვცემს ჩვენ დეველოპერებს ამ ვერსიაზე საბოლოოდ გადასვლა? პირველ რიგში ეს არის ნორმალური პროგრამირების შესაძლებლობა!!! დახვეწილი OOP მოდელი რომელიც რეალიზებული იყო ამ ვერსიაში ნამდვილად რევოლუციის ტოლფასია PHP4 &#8211; ის კასტრირებულ OOP მოდელთან შედარებით (თუმცა Java და  C# დეველოპერებს ვისთვისაც ეს ენა უცხო გარკვეულ დისკომფორტს შეუქმნის თუნდაც ეს დახვეწილი OOP მოდელი) </p>
<p>იმედი მაქვს რომ ეს ერთი დეტალიც კი დეველოპერებს ძალიან დიდი კომფორტის შეგრძნებას გაუჩენს, მიუხედავად იმისა რომ პირადად მე საკმაოდ სკეფტიკური დამოკიდებულება მაქვს ზოგადად PHP დეველოპერების უდიდესი ნაწილისადმი(შესაძლოა ეს არაკოლეგიალურად ჟღერს მაგრამ ფაქტი ფაქტად რჩება!) და მიმაჩნია რომ მათმა დიდმა ნაწილმა გამომდინარე ამ ენის ბუნებიდან საერთოდ არ იცის რა არის აპლიკაციის დიზაინი, რა არის პატერნები და ა.შ. ანუ ის ძირეული დეტალები რაც საჭიროა მაღალი დონის პროგრამული კოდის შესაქმნელად (ასევე უნდა აღინიშნოს ის რომ პირველი დამნაშავე ამაში თავად PHP &#8211; ა). თუნდაც იძულებული გადასვლა ენის ამ ვერსიაზე მაძლევს იმის იმედს რომ თავად ენის ათვისება მოხდება უფრო საფუძვლიანად, უამრავი ე.წ. PHP დეველოპერი რომელსაც აქამდე წარმოდგენა არ ჰქონია ობიექტზე ორიენტირებულ პროგრამირების დეტალებზე, უკეთ აითვისებენ ამ ყოველივეს რაც თავისთავად უკეთესი პროდუქტების შექმნის გარანტი იქნება.</p>
<p>დანარჩენი უპირატესობების ჩამოთვლას აქ არ მოვყვები თუმცა ეს სია იმდენად ვრცელია რომ იმედი მაქვს ყველა იპოვის ამ ცვლილებებში მათთვის საჭირო და სასარგებლო დეტალებს.</p>
<p>მაშ ასე იმედია ეს ფაქტი ქართულ ჰოსტინგ პროვაიდერებსაც შეაბერტყინებს ყურებს და რაც შეიძლება მალე გადავლენ ამ შესანიშნავი ენის უახლეს ვერსიაზე <img src='http://www.code.ge/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  </p>
]]></content:encoded>
			<wfw:commentRss>http://www.code.ge/posts/php-4-end-of-life-announcement/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>PHP კლასის კონსტრუქტორი</title>
		<link>http://www.code.ge/posts/php-class-constructor</link>
		<comments>http://www.code.ge/posts/php-class-constructor#comments</comments>
		<pubDate>Fri, 01 Jun 2007 05:57:13 +0000</pubDate>
		<dc:creator>იოსები</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.code.ge/php/php-class-constructor</guid>
		<description><![CDATA[სრულიად შემთხვევით PHP &#8211; ს კლასის კონსტრუქტორის ძალიან უცნაურ ქცევას წავაწყდი და ცოტა არ იყოს გამიკვირდა. ის რომ PHP &#8211; ს ობიექტზე ორიენტირებული მხარე არასრულფასოვანია ამას ბევრი მტკიცება აღარ ესაჭიროება, ასევე კონსტრუქტორების მუშაობის პრინციპი და კლასების ინიციალიზაციის დეტალებიც განსხვავდება ჯავას კონსტრუქტორებისაგან და კლასების ინიციალიზაციისაგან. ეს დეტალები არ არის ახალი და მეც მეტნაკლებად დარწმუნებული ვიყავი რომ [...]]]></description>
			<content:encoded><![CDATA[<p>სრულიად შემთხვევით PHP &#8211; ს კლასის კონსტრუქტორის ძალიან უცნაურ ქცევას წავაწყდი და ცოტა არ იყოს გამიკვირდა. ის რომ PHP &#8211; ს ობიექტზე ორიენტირებული მხარე არასრულფასოვანია ამას ბევრი მტკიცება აღარ ესაჭიროება, ასევე კონსტრუქტორების მუშაობის პრინციპი და კლასების ინიციალიზაციის დეტალებიც განსხვავდება <a href="http://www.code.ge/java/constructors-in-java">ჯავას კონსტრუქტორებისაგან</a> და კლასების ინიციალიზაციისაგან.</p>
<p>ეს დეტალები არ არის ახალი და მეც მეტნაკლებად დარწმუნებული ვიყავი რომ ამომწურავად ვიცოდი, თუმცა შემთხვევით წავაწყდი ერთ ისეთ დეტალს რასთანაც აქამდე შეხება არ მქონია.<br />
<span id="more-63"></span></p>
<p>მაგალითად ჯავაში როდესაც ვქმნით კლასის ობიექტს მისი კონსტრუქტორის გამოძახებით, უშუალოდ ამ კონსტრუქტორის შიგნით არსებული კოდის შესრულებამდე პირველ რიგში იძახება ან მშობელი კლასის კონსტრუქტორი ან იმავე კლასის სხვა კონსტრუქტორი ავტომატურად ან ცხადად. PHP &#8211; ში კი მშობელი კლასის კონსტრუქტორის არავითარი ავტომატური გამოძახება არ არსებობს, თუ გვჭირდება იერარქიის სრული ინიციალიზაცია ამისათვის ცხადად უნდა გამოვიძახოთ მემკვიდრე კლასის კონსტრუქტორებიდან მშობელი კლასის კონსტრუქტორები.</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 /></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> Parent <span style="color: #009900;">&#123;</span><br />
&nbsp; <br />
&nbsp; <span style="color: #000000; font-weight: bold;">function</span> Parent<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: #0000ff;">'initializing parent'</span><span style="color: #339933;">;</span><br />
&nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; <br />
<span style="color: #009900;">&#125;</span><br />
<br />
<span style="color: #000000; font-weight: bold;">class</span> Child <span style="color: #000000; font-weight: bold;">extends</span> Parent <span style="color: #009900;">&#123;</span><br />
&nbsp; <br />
&nbsp; <span style="color: #000000; font-weight: bold;">function</span> Child<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; parent<span style="color: #339933;">::</span><span style="color: #004000;">Parent</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;">echo</span> <span style="color: #0000ff;">'&lt;br /&gt;initializing child'</span><span style="color: #339933;">;</span><br />
&nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; <br />
<span style="color: #009900;">&#125;</span><br />
<br />
<span style="color: #000000; font-weight: bold;">new</span> Child<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p>მემკვიდრე კლასიდან ცხადად ვიძახებთ მშობელი კლასის კონსტრუქტორს parent::Parent();. თუ მსგავსად არ იქნება გამოძახებული მშობელი კლასის კონსტრუქტორი იგი არასოდეს არ შესრულდება რამაც შესაძლებელია გარკვეული პრობლემები წარმოქმნას. თუმცა როგორც შემთხვევით აღმოვაჩინე (რამაც დამაბნია და გარკვეული დრო დამაკარგვინა სანამ მივხვდი <img src='http://www.code.ge/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' />  ) თუ მემკვიდრე კლასსში საერთოდ არ განვსაზღვრავთ კონსტრუქტორს მშობელი კლასის კონსტრუქტორის გამოძახება მოხდება ავტომატურად&#8230; </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 />36<br />37<br />38<br />39<br />40<br />41<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> Item <span style="color: #009900;">&#123;</span><br />
&nbsp; <br />
&nbsp; <span style="color: #000000; font-weight: bold;">var</span> <span style="color: #000088;">$name</span><span style="color: #339933;">;</span><br />
&nbsp; <br />
&nbsp; <span style="color: #000000; font-weight: bold;">function</span> Item<span style="color: #009900;">&#40;</span><span style="color: #000088;">$name</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;">name</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$name</span><span style="color: #339933;">;</span><br />
&nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; <br />
<span style="color: #009900;">&#125;</span><br />
<br />
<span style="color: #000000; font-weight: bold;">class</span> Parent <span style="color: #009900;">&#123;</span><br />
&nbsp; <br />
&nbsp; <span style="color: #666666; font-style: italic;">//class variable</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">var</span> <span style="color: #000088;">$item</span><span style="color: #339933;">;</span><br />
&nbsp; <br />
&nbsp; <span style="color: #009933; font-style: italic;">/**<br />
&nbsp; &nbsp;* Parent class constructor<br />
&nbsp; &nbsp;* @param Item $item<br />
&nbsp; &nbsp;*/</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">function</span> Parent<span style="color: #009900;">&#40;</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;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">item</span> <span style="color: #339933;">=</span> <span style="color: #339933;">&amp;</span><span style="color: #000088;">$item</span><span style="color: #339933;">;</span><br />
&nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; <br />
&nbsp; <span style="color: #666666; font-style: italic;">//abstract method</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">function</span> doSomething<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <a href="http://www.php.net/die"><span style="color: #990000;">die</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'method is not implemented'</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><br />
<br />
<span style="color: #000000; font-weight: bold;">class</span> Child <span style="color: #000000; font-weight: bold;">extends</span> Parent <span style="color: #009900;">&#123;</span><br />
&nbsp; <br />
&nbsp; <span style="color: #666666; font-style: italic;">//overrided method</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">function</span> doSomething<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: #0000ff;">'Implemented in '</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">item</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">name</span><span style="color: #339933;">;</span><br />
&nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; <br />
<span style="color: #009900;">&#125;</span><br />
<br />
<span style="color: #000088;">$o</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">&amp;new</span> Child<span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> Item<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'test item'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #000088;">$o</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">doSomething</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>კოდის შესრულების შედეგია:</p>
<pre>
Implemented in test item
</pre>
<p>მიუხედავად იმისა რომ Child კლასში არ გვაქვს განსაზღვრული კონსტრუქტორი new Child(new Item(&#8216;test item&#8217;)) გამოსახულების შესრულებით იძახება მშობელი(Parent) კლასის კონსტრუქტორი რომელიც პარამეტრად ღებულობს Item ტიპის ობიექტს. ხოლო შემდგომ doSomething() მეთოდში ხდება სწორედ Parent კონსტრუქტორისთვის პარამეტრად გადაცემული Item ობიექტის გამოყენება. აქედან დასკვნა:</p>
<p><strong><br />
თუ მემკვიდრე კლასში არ არის განსაზღვული კონსტრუქტორი, ეს ნიშნავს რომ ამ კლასის ობიექტის შექმნისას აუცილებლად გამოძახებული იქნება მშობელი კლასის კონსტრუქტორი.</strong></p>
<p>უფრო მეტიც, მაგალითად თუ შევასრულებთ ასეთ კოდს: <strong>new Child() </strong>მაშინ PHP გამოგვიტანს შემდეგ გაფრთხილებას <strong>Warning: Missing argument 1 for parent()</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.code.ge/posts/php-class-constructor/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>ფაილების მისამართებთან მუშაობა PHP &#8211; თი</title>
		<link>http://www.code.ge/posts/working-with-file-paths</link>
		<comments>http://www.code.ge/posts/working-with-file-paths#comments</comments>
		<pubDate>Wed, 30 May 2007 11:04:50 +0000</pubDate>
		<dc:creator>იოსები</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.code.ge/php/working-with-file-paths</guid>
		<description><![CDATA[ფაილების მისამართებთან მუშაობა PHP &#8211; თი საკმაოდ მარტივია, თუმცა ისეთ შემთხვევებში როდესაც ინტენსიურად არის საჭირო ფაილებთან დაკავშირებული ოპერაციების შესრულება ჩემთვის ძალიან დამღლელი და არასასიამოვნო პროცესია მუდმივად ერთი და იგივე ფუნქციების გამოყენება და განმეორებადი ოპერაციების შესრულება. გარდა ამისა ფაილების მისამართები განსხვავდება პლატფორმებს შორის (იგულისხმება windows და unix სისტემები). არსებული პრობლემები არცთუ ბევრია თუმცა მუდმივად მათი გათვალისწინება [...]]]></description>
			<content:encoded><![CDATA[<p>ფაილების მისამართებთან მუშაობა PHP &#8211; თი საკმაოდ მარტივია, თუმცა ისეთ შემთხვევებში როდესაც ინტენსიურად არის საჭირო ფაილებთან დაკავშირებული ოპერაციების შესრულება ჩემთვის ძალიან დამღლელი და არასასიამოვნო პროცესია მუდმივად ერთი და იგივე ფუნქციების გამოყენება და განმეორებადი ოპერაციების შესრულება. გარდა ამისა ფაილების მისამართები განსხვავდება პლატფორმებს შორის (იგულისხმება windows და unix სისტემები). არსებული პრობლემები არცთუ ბევრია თუმცა მუდმივად მათი გათვალისწინება მოსაბეზრებელია, რაც თავისუფლად შესაძლებელია ავირიდოთ თავიდან ერთი უნიფიცირებული მეთოდის ჩამოყალიბებით.<span id="more-62"></span></p>
<p>პლატფორმებს შორის არსებული სხვაობები:</p>
<ul>
<li><strong>ფაილების გამყოფი:</strong> ვინდოუსზე ფაილის გამყოფად გამოიყენება მარცხენა სლეში ანუ \ ხოლო უნიქს სისტემებში იგივე მიზნისთვის გამოიყენება მარჯვენა სლეში /</li>
<p><strong>განსხვავება ფაილის სრულ მისამართში:</strong> ვინდოუსში ფაილის სრული მისამართს თავში ემატები პარტიშენის სახელი (მაგ. c:/ ), უნიქს სისტემებში სრული მისამართი აუცილებლად იწყება მარჯვენა სლეშით /</ul>
<p>სხვა პრობლემატური ნიუანსები:	</p>
<ul>
<li>
<strong>არეული ფაილების გამყოფები: </strong> მაგალითად შემდეგი მისამართი გარკვეულ პრობლემებს იწვევს &#8211; c:\usr\local\www/appdir/datafolder/filename.php</li>
<li>
<strong>არასაჭირო(ზედმეტი) ფაილის გამყოფები: </strong> მაგ. /usr/local/www//appdir///datafolder/filename.php</li>
<li><strong>ზედმეტი წერტილები:</strong> მაგ. /usr/local/www//appdir///d..//../atafolder&#8230;..//filename.php</li>
</ul>
<p>ყოველივე ამის გათვალისწინებით საჭიროა ერთი გარკვეული მეთოდის ჩამოყალიბება რომელიც შემდგომ გამოყენებული იქნება მთელს სისტემაში, რაც თავისთავად იქნება გარანტია იმისა რომ ნებისმიერ დროს ნებისმიერ შემთხვევაში ფაილების მისამართები დამუშავდება ერთნაირად და ასეთი მისამართი გამოსადეგი იქნება ნებისმიერ პლატფორმაზე.</p>
<p>რა პირობებს უნდა აკმაყოფილებდეს ასეთი კლასი? </p>
<ol>
<li>იგი არ უნდა იყოს დამოკიდებული ე.წ. DOCUMENT_ROOT &#8211; ზე რადგან იმ შემთხვევაში თუ ფაილებთან მუშაობა გვიწევს ftp ფუნქციების მეშვეობით ნაცვლად სტანდარტული ფუნქციებისა, სხვაობა DOCUMENT_ROOT &#8211; სა და ftp მისამართებს შორის აუცილებლად იარსებებს;</li>
<li>
უნდა აღმოფხვრას ე.წ. არეული ფაილების გამყოფების პრობლემა</li>
<li>
გადაცემული მისამართიდან უნდა ააგოს: აპლიკაციის საწყისი მისამართი (დირექტორია სადაც რეალურად არის დაინსტალირებული აპლიკაცია), ფაილის სრული მისამართი (DOCUMENT_ROOT &#8211; ის ჩათვლით), ე.წ. relative მისამართი, უნდა გამოყოს ფაილის სახელი მისამართიდან(ფაილის სახელში მოიაზრება როგორც ჩვეულებრივი ფაილი სახელი ასევე დირექტორიის სახელი)</li>
</ol>
<p>ჩამოთვლილი მიზნების მისაღწევად სავსებით საკმარისია ქვემოთ ნაჩვენები პატარა კლასი:</p>
<div class="codecolorer-container php blackboard" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;height:300px;"><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 />63<br />64<br />65<br />66<br />67<br />68<br />69<br />70<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> FilePath <span style="color: #009900;">&#123;</span><br />
&nbsp; <br />
&nbsp; <span style="color: #000000; font-weight: bold;">var</span> <span style="color: #000088;">$docRoot</span><span style="color: #339933;">;</span> &nbsp;<span style="color: #666666; font-style: italic;">//document root of the site</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">var</span> <span style="color: #000088;">$appPath</span><span style="color: #339933;">;</span> &nbsp;<span style="color: #666666; font-style: italic;">//actual application path, document root + application installation folder</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">var</span> <span style="color: #000088;">$relPath</span><span style="color: #339933;">;</span> &nbsp;<span style="color: #666666; font-style: italic;">//relative path of the requested file</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">var</span> <span style="color: #000088;">$absPath</span><span style="color: #339933;">;</span> &nbsp;<span style="color: #666666; font-style: italic;">//absolute path of the file, $docRoot concatenated with $relPath</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">var</span> <span style="color: #000088;">$fileName</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//actual file/directory name</span><br />
&nbsp; <br />
&nbsp; <span style="color: #000000; font-weight: bold;">function</span> FilePath<span style="color: #009900;">&#40;</span><span style="color: #000088;">$path</span><span style="color: #339933;">,</span> <span style="color: #000088;">$docRoot</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; <br />
&nbsp; &nbsp; <span style="color: #009933; font-style: italic;">/**<br />
&nbsp; &nbsp; &nbsp;* if no $docRoot was passed used default DOCUMENT ROOT<br />
&nbsp; &nbsp; &nbsp;*/</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;">$docRoot</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #000088;">$docRoot</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$_SERVER</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'DOCUMENT_ROOT'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #666666; font-style: italic;">//cleanup document root</span><br />
&nbsp; &nbsp; <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">docRoot</span> &nbsp;<span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">cleanup</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$docRoot</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #666666; font-style: italic;">//cleanup application path</span><br />
&nbsp; &nbsp; <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">appPath</span> &nbsp;<span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">cleanup</span><span style="color: #009900;">&#40;</span><a href="http://www.php.net/dirname"><span style="color: #990000;">dirname</span></a><span style="color: #009900;">&#40;</span><span style="color: #009900; font-weight: bold;">__FILE__</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #666666; font-style: italic;">//cleanup relative path</span><br />
&nbsp; &nbsp; <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">relPath</span> &nbsp;<span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">cleanup</span><span style="color: #009900;">&#40;</span><a href="http://www.php.net/preg_replace"><span style="color: #990000;">preg_replace</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'!^'</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">appPath</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">'!'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">,</span> <span style="color: #000088;">$path</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #666666; font-style: italic;">//build absolute path</span><br />
&nbsp; &nbsp; <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">absPath</span> &nbsp;<span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">appPath</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">relPath</span><span style="color: #339933;">;</span> <br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #666666; font-style: italic;">//retrive file name from path</span><br />
&nbsp; &nbsp; <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">fileName</span> <span style="color: #339933;">=</span> <a href="http://www.php.net/basename"><span style="color: #990000;">basename</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">relPath</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <br />
&nbsp; &nbsp; <br />
&nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; <br />
&nbsp; <span style="color: #000000; font-weight: bold;">function</span> cleanup<span style="color: #009900;">&#40;</span><span style="color: #000088;">$path</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #000088;">$path</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: #0000ff;">''</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'/'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$path</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #000088;">$path</span> <span style="color: #339933;">=</span> <a href="http://www.php.net/preg_replace"><span style="color: #990000;">preg_replace</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'!\.+/!'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">,</span> <span style="color: #000088;">$path</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #000088;">$path</span> <span style="color: #339933;">=</span> <a href="http://www.php.net/trim"><span style="color: #990000;">trim</span></a><span style="color: #009900;">&#40;</span><a href="http://www.php.net/trim"><span style="color: #990000;">trim</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$path</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'\/'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #000088;">$path</span> <span style="color: #339933;">=</span> <a href="http://www.php.net/preg_replace"><span style="color: #990000;">preg_replace</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'!/+!'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'/'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$path</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><a href="http://www.php.net/preg_match"><span style="color: #990000;">preg_match</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'!^\w:!'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$path</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: #000088;">$path</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'/'</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$path</span><span style="color: #339933;">;</span>&nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; <span style="color: #b1b100;">return</span> <span style="color: #000088;">$path</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;">function</span> getDocRoot<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;">return</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">docRoot</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;">function</span> getAppPath<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;">return</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">appPath</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;">function</span> getRelativePath<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;">return</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">relPath</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;">function</span> getAbsolutePath<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;">return</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">absPath</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;">function</span> getFileName<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;">return</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">fileName</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;">function</span> getParent<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;">return</span> <a href="http://www.php.net/dirname"><span style="color: #990000;">dirname</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">absPath</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>კლასს გააჩნია ორ პარამეტრიანი კონსტრუქტორი, სადაც პირველი პარამეტრი არის უშუალოდ იმ ფაილის/დირექტორიის მისამართი რომელთანაც ვაპირებთ მუშაობას, ხოლო მეორე არასავალდებულო პარამეტრი არის ე.წ. DOCUMENT_ROOT &#8211; ისთვის რომლის გამოყენებაც შესაძლებელია იმ შემთხვევაში თუ ვმუშოაბთ ftp რეჟიმში(რადგან ftp &#8211; ს შემთხვევაში DOCUMENT_ROOT განსხვავდება).</p>
<p>გასათვალისწინებელია ასევე ის მომენტი რომ რომელი ფაილიდანაც არ უნდა გამოვიყენოთ ეს კლასი ფაილის მისამართის მითითება შესაძლებელია პირდაპირ ინსტალაციის დირექტორიასთან მიმართებაში.</p>
<p>მაგალითად თუ აპლიკაცია დაინსტალირებულია /public_html/blog/ დირექტორიაში, ხოლო კონკრეტული სკრიფტში(რომელიც განთავსებულია  მისამართზე /public_html/blog/dir/util/filemanager.php) რომლის მეშვეობითაც გვსურს გარკვეული მანიპულაციების ჩატარება /public_html/blog/data/uploads/images/img.gif ფაილზე, საკმარისია დავწეროთ შემდეგი კოდი:</p>
<pre>
$fp = &#038;new FilePath('data/uploads/images/img.gif);
</pre>
<p>როგორც მაგალითში ჩანს FilePath კონსტრუქტორში გადაცემული მისამართი პირდაპირ იწნება data დირექტორიით, რაც ნიშნავს იმას რომ თვით აპლიკაციის ინსტალაციის დირექტორიის მითითება არ არის საჭირო რადგან FilePath გამოითვლის მას ავტომატურად. ასევე საგულისხმოა ის დეტალი რომ რამდენად ღრმაც არ უნდა იყოს აპლიკაციის ინსტალაციის დირექტორიების სიღრმე ეს გამოთვლა ყოველთვის სწორად განხორციელდება.</p>
<p>FilePath კლასის გამოყენების მარტივი ნიმუში:</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 /></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;">$fp</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">&amp;new</span> FilePath<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'..//...../data/test...////....\////subdir//anot..../../.\hersubdir/'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'&lt;b&gt;Document Root:&lt;/b&gt; '</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$fp</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getDocRoot</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'&lt;br /&gt;&lt;br /&gt;'</span><span style="color: #339933;">;</span><br />
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'&lt;b&gt;Application Path:&lt;/b&gt; '</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$fp</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getAppPath</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'&lt;br /&gt;&lt;br /&gt;'</span><span style="color: #339933;">;</span><br />
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'&lt;b&gt;Relative Path:&lt;/b&gt; '</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$fp</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getRelativePath</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'&lt;br /&gt;&lt;br /&gt;'</span><span style="color: #339933;">;</span><br />
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'&lt;b&gt;Absolute Path:&lt;/b&gt; '</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$fp</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getAbsolutePath</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'&lt;br /&gt;&lt;br /&gt;'</span><span style="color: #339933;">;</span><br />
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'&lt;b&gt;Parent Directory:&lt;/b&gt; '</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$fp</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getParent</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'&lt;br /&gt;&lt;br /&gt;'</span><span style="color: #339933;">;</span><br />
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'&lt;b&gt;File Name:&lt;/b&gt; '</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$fp</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getFileName</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>კოდის შესრულების შედეგი გამოიყურება შემდეგნაირად:</p>
<pre>
<b>Document Root:</b> c:/program files/easyphp1-8/www

<b>Application Path:</b> c:/program files/easyphp1-8/www/test/io

<b>Relative Path:</b> /data/test/subdir/anothersubdir

<b>Absolute Path:</b> c:/program files/easyphp1-8/www/test/io/data/test/subdir/anothersubdir

<b>Parent Directory:</b> c:/program files/easyphp1-8/www/test/io/data/test/subdir

<b>File Name:</b> anothersubdir
</pre>
<p>შედეგიდან ჩანს რომ მიუხედავად იმისა რომ პარამეტრად გამოვიყენეთ ერთი შეხედვით ყოვლად არაფრისმთქმელი არეული მისამართი, კლასმა შეძლო მისი შესაბამისად გაფილტვრა და ასევე მისამართების სწორად აგება.</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 /></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;">$fp</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">&amp;new</span> FilePath<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'data/images/file.jpg'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><a href="http://www.php.net/is_dir"><span style="color: #990000;">is_dir</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$fp</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getAbsolutePath</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'is directory'</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><br />
<br />
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><a href="http://www.php.net/is_file"><span style="color: #990000;">is_file</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$fp</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getAbsolutePath</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'is file'</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><br />
<br />
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><a href="http://www.php.net/file_exists"><span style="color: #990000;">file_exists</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$fp</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getAbsolutePath</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'file exists'</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span></div></td></tr></tbody></table></div>
<p>როგორც მაგალითებიდან ჩანს აღწერილი კლასის გამოყენება ძალიან მარტივია, და რაც ყველაზე მთავარია ერთნაირი წარმატებით იმუშავებს ნებისმიერ პლატფორმაზე.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.code.ge/posts/working-with-file-paths/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Quercus &#8211; PHP in Java</title>
		<link>http://www.code.ge/posts/quercus-php-in-java</link>
		<comments>http://www.code.ge/posts/quercus-php-in-java#comments</comments>
		<pubDate>Wed, 28 Mar 2007 13:08:45 +0000</pubDate>
		<dc:creator>იოსები</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.code.ge/java/quercus-php5-java-implementation</guid>
		<description><![CDATA[აჟიტირებული ვარ სრული ამ სიტყვის მნიშნველობით&#8230; ასეთ რამეს მართლა არ ველოდი და ხელი მქონდა დიდი ხანია ჩაქნეული&#8230; ამასწინათ იკას ბლოგზე ვნახე პოსტი სათაურით: Breakthrough: Java Implementation of PHP5 თავისთავად დამაინტერესა(რატომღაც), დღეს გამოვნახე დრო და გავტესტე&#8230; სიმართლე უნდა ითქვას შედეგმა ყოველგვარ მოლოდინს გადააჭარბა&#8230; PHP და Java ერთად? რაოდენ ირონიულადაც არ უნდა ჟღერდეს თურმე ეს შესაძლებელია. რა [...]]]></description>
			<content:encoded><![CDATA[<p>აჟიტირებული ვარ სრული ამ სიტყვის მნიშნველობით&#8230; ასეთ რამეს მართლა არ ველოდი და ხელი მქონდა დიდი ხანია ჩაქნეული&#8230; ამასწინათ <a href="http://www.freshblurbs.com">იკას ბლოგზე</a> ვნახე პოსტი სათაურით: <a href="http://www.freshblurbs.com/breakthrough-java-implementation-php5"><strong>Breakthrough: Java Implementation of PHP5</strong></a> თავისთავად დამაინტერესა(რატომღაც), დღეს გამოვნახე დრო და გავტესტე&#8230; სიმართლე უნდა ითქვას შედეგმა ყოველგვარ მოლოდინს გადააჭარბა&#8230;</p>
<p>PHP და Java ერთად? რაოდენ ირონიულადაც არ უნდა ჟღერდეს თურმე ეს შესაძლებელია. რა საჭიროა? მიჭირს კონკრეტული მაგალითის მოყვანა, თუმცა გავიხსენებ ერთი წლის წინანდელ შემთხვევას როდესაც ერთერთი მეგა კომპანიის(არა ქართული) რეპორტინგის სისტემაზე  მუშაობისას როცა სკრიპტინგი აღმოჩნდა საჭირო(ამას გააჩნდა საფუძვლიანი მიზეზი) როგორ ვნატრობდი რომ <a href="http://groovy.codehaus.org/">Groovy</a> &#8211; ის ნაცვლად PHP &#8211; ზე შემძლებოდა წერა&#8230; თუმცა ამის შესაძლებლობა მაშინ არ მომეცა. </p>
<p>მიუხედავად იმისა რომ ეს ძრავი ჯერ არ მუშაობს ბევრისათვის კარგად ნაცნობ Tomcat &#8211; ზე მიმაჩნია რომ არც ეს არის შორეული პერსპექტივა&#8230; რაც შეეხება ტესტირების შედეგებს&#8230;<br />
<span id="more-51"></span></p>
<p>პირველ რიგში ამისათვის საჭიროა Resin Server &#8211; ი, რომელიც კარგად არის ნაცნობი Java დეველოპერებისათვის და იგი შეგიძლიათ გადმოწეროთ შემდეგი მისამართიდან: <a href="http://www.caucho.com/download/index.xtp">Resin Pro 3.1.0 Download</a>. </p>
<p>ასევე საჭიროა JDK 5 ან უფრო მაღალი ვერსია, მისი ინსტალაციის ინსტრუქცია შეგიძლიათ <a href="http://education.sapikhvno.com/tiki/tiki-index.php?page=%E1%83%AF%E1%83%90%E1%83%95%E1%83%90%E1%83%A1+%E1%83%98%E1%83%9C%E1%83%A1%E1%83%A2%E1%83%90%E1%83%9A%E1%83%90%E1%83%AA%E1%83%98%E1%83%98%E1%83%A1+%E1%83%98%E1%83%9C%E1%83%A1%E1%83%A2%E1%83%A0%E1%83%A3%E1%83%A5%E1%83%AA%E1%83%98%E1%83%90">ნახოთ ამ მისმართზე</a>.</p>
<p>Resin &#8211; ის გადმოწერის შემდეგ საჭიროა მისი დეარქივაცია, ჩემს შემთხვევაში ეს გავაკეთე <strong>C:\web\resin</strong> მისამართზე. მეტი ინსტალაციისათვის არაფერი არ არის საჭირო. სერვერის გასაშვებად საკმარისია <strong>httpd.exe</strong> ფაილის გაშვება, ხოლო http://localhost:8080/ მისამართის გახსნის შემდეგ დავინახავთ შესაბამის გვერდს რომელიც გვატყობინებს რომ Resin დასტარტულია.</p>
<p>როგორ გავუშვათ PHP სკრიპტი? ამისათვის საკმარისია <strong>C:\web\resin\webapps\ROOT</strong> კატალოგში შევქმნათ კატალოგი სასურველი სახელით, ჩემს შემთხვევაში კატალოგს დავარქვი test. შემდეგ ახლად შექმნილ კატალოგში უნდა შევქმნათ WEB-INF კატალოგი და მასში მოვათავსოთ <strong>web.xml </strong> ფაილი და ჩავწეროთ მასში შემდეგი ინსტრუქციები:</p>
<pre>
&lt;web-app xmlns="http://caucho.com/ns/resin"&gt;
  &lt;servlet-mapping url-pattern="*.php" servlet-class="com.caucho.quercus.servlet.QuercusServlet"&gt;
    &lt;init&gt;
      &lt;script-encoding&gt;iso-8859-1&lt;/script-encoding&gt;
    &lt;/init&gt;
  &lt;/servlet-mapping&gt;
&lt;/web-app&gt;
</pre>
<p>ეს არის და ეს ახალი ვებ აპლიკაციის კონფიგურაცია დასრულებულია და შეგვიძლია შევუდგეთ PHP &#8211; ზე წერას. test კატალოგში გააკეთეთ ჩვეულებრივი index.php ფაილი, ტესტირებისათვის შეგიძლიათ გამოიყენოთ შემდეგი კოდი:</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 /></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; <br />
&nbsp; <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000088;">$test</span><span style="color: #339933;">;</span><br />
&nbsp; <br />
&nbsp; <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><br />
&nbsp; &nbsp; <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">test</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;this is test&quot;</span><span style="color: #339933;">;</span><br />
&nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; <br />
&nbsp; static <span style="color: #000000; font-weight: bold;">function</span> runTest<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;">return</span> <span style="color: #0000ff;">&quot;This is static method&quot;</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> <span style="color: #000000; font-weight: bold;">function</span> getVar<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;">return</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">test</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> <span style="color: #000000; font-weight: bold;">function</span> testArrayList<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666; font-style: italic;">//create ArrayList object</span><br />
&nbsp; &nbsp; <span style="color: #000088;">$list</span> <span style="color: #339933;">=</span> java<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;java.util.ArrayList&quot;</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>1<span style="color: #339933;">,</span> 2<span style="color: #339933;">,</span> 3<span style="color: #339933;">,</span> 4<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666; font-style: italic;">//add instance of class Test into arraylist</span><br />
&nbsp; &nbsp; <span style="color: #000088;">$list</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">add</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> Test<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666; font-style: italic;">//create another ArrayList instance</span><br />
&nbsp; &nbsp; <span style="color: #000088;">$l1</span> <span style="color: #339933;">=</span> java<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;java.util.ArrayList&quot;</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: #0000ff;">&quot;Test Array List&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666; font-style: italic;">//add $l1 to $list arraylist object</span><br />
&nbsp; &nbsp; <span style="color: #000088;">$list</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">add</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$l1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666; font-style: italic;">//output object</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;">$list</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <br />
&nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; <br />
<span style="color: #009900;">&#125;</span><br />
<br />
<span style="color: #000088;">$t</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Test<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #000088;">$t</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">testArrayList</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #b1b100;">echo</span> <span style="color: #000088;">$t</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getVar</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'&lt;br /&gt;'</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #b1b100;">echo</span> Test<span style="color: #339933;">::</span><span style="color: #004000;">runTest</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>კოდის მუშაობის შედეგი შეგიძლიათ შემოწმოთ http://localhost:8080/test/index.php მისამართზე. როგორც მაგალითიდან ჩანს ჩვეულებრივ PHP &#8211; ს კოდთან გვაქვს საქმე რომელიც ისევე ჩვეულებრივად მუშაობს Resin &#8211; ზე როგორც იმუშავებდა PHP5/Apache2 ტანდემის შემთხვევაში, თუმცა ყურადღება უნდა მივაქციოთ <strong>testArrayList</strong> მეთოდს რომელიც უშუალოდ მუშაობს Java &#8211; ს ArrayList კლასთან.</p>
<p>java() ფუნქციის მეშვეობით შეგვიძლია ნებისმიერი Java &#8211; ს კლასის ობიექტის შექმნა და შემდეგ უკვე მისი გამოყენება PHP კოდში, როგორც მაგალითშია ნაჩვენები ამ ფუნქციას პირველ პარამეტრად გადაეცემა სასურველი Java კლასი, ხოლო შემდეგ პარამეტრებად პარამეტრები Java კლასის კონსტრუქტორის. (საგულისხმოა ის დეტალი რომ Quercus ავტომატურად ახორციელებს Java ობიექტების PHP ობიექტებად გარდაქმნას და პირიქით საჭიროების შემთხვევაში)</p>
<p>java() ფუნქციის მიერ დაბრუნებული ობიექტი შეგვიძლია გამოვიყენოთ ისევე როგორც ამას გავაკეთებდით Java &#8211; ში. მაგალითად: <strong>$list->add(new Test());</strong> ამ შემთხვევაში <strong>add</strong> არის ArrayList კლასის მეთოდი. გამომდინარე იქიდან რომ ArrayList არის კონტეინერი მისი იტერაცია შეგვიძლია PHP &#8211; ს foreach ოპერატორის გამოყენებით.</p>
<p>დამატებითი დეტალებისთვის დოკუმენტაცია იხილეთ შესაბამის მისამართებზე:<br />
<a href="http://www.caucho.com/resin-3.1/index.xtp"><strong>Resin Documentaion</strong></a><br />
<a href="http://www.caucho.com/resin-3.1/index.xtp"><strong>Quercus Documentaion</strong></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.code.ge/posts/quercus-php-in-java/feed</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>ბიტური ოპერატორები PHP &#8211; ში</title>
		<link>http://www.code.ge/posts/bitwise-operators-in-php</link>
		<comments>http://www.code.ge/posts/bitwise-operators-in-php#comments</comments>
		<pubDate>Tue, 20 Mar 2007 10:13:27 +0000</pubDate>
		<dc:creator>იოსები</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.ioseb.com/php/bitwise-operators-in-php</guid>
		<description><![CDATA[ბიტური ოპერატორების გამოყენება არცთუ ხშირად გვიწევს მაგრამ არის შემთხვევები როდესაც მათი გამოყენება შეიძლება სასარგებლო და ხშირ შემთხვევაში საუკეთესო გამოსავალიც კი იყოს. PHP აღჭურვილია შესაბამისი ოპერატორებით რომლებიც შეიძლება გამოვიყენოთ ბიტური ოპერაციების ჩატარებისათვის. პირველ რიგში მართებული იქნება თუ მიმოვიხილავთ ბაიტებსა და ბიტებს. ცნობილია რომ ბაიტი შედგება რვა(8) ბიტისაგან, ბიტს თავისთავად შეიძლება გააჩნდეს მხოლოდ ორი მნიშვნელობა 1(ერთი) ან [...]]]></description>
			<content:encoded><![CDATA[<p>ბიტური ოპერატორების გამოყენება არცთუ ხშირად გვიწევს მაგრამ არის შემთხვევები როდესაც მათი გამოყენება შეიძლება სასარგებლო და ხშირ შემთხვევაში საუკეთესო გამოსავალიც კი იყოს. PHP აღჭურვილია შესაბამისი ოპერატორებით რომლებიც შეიძლება გამოვიყენოთ ბიტური ოპერაციების ჩატარებისათვის.<span id="more-45"></span></p>
<p>პირველ რიგში მართებული იქნება თუ მიმოვიხილავთ ბაიტებსა და ბიტებს. ცნობილია რომ ბაიტი შედგება რვა(8) ბიტისაგან, ბიტს თავისთავად შეიძლება გააჩნდეს მხოლოდ ორი მნიშვნელობა 1(ერთი) ან 0(ნული). თუ ბიტის მნიშვნელობა უდრის 1 &#8211; ს ეს ნიშნავს რომ ბიტი მონიშნულია ხოლო თუ მისი მნიშვნელობა უდროს 0 &#8211; ს ეს ავტომატურად ნიშნავს რომ ბიტი არ არის მონიშნული. ბაიტის მაქსიმალური მნიშვნელობა განისაზღვრება 255 &#8211; ით, ანუ თუ ბაიტის შემადგენილი ყველა ბიტი არის მონიშნული ბაიტის მნიშვნელობა იქნება 255.</p>
<p>ბატი ვიზუალურად შეიძლება გამოვსახოთ შემდეგი ცხრილის სახით:</p>
<style type="text/css">table.bytes {
    width: 100%;
    font-weight: bold;
    text-align: right;
}table.bytes th {
    text-align: center;
    background-color: #EFEFEF;
}table.bytes, table.bytes th, table.bytes td {
    border: 1px solid black;
}table.bytes .idx tr {
    background-color: silver;
}table.bytes .bits tr {
    background-color: lightblue;
}table.bytes .flags tr {
    background-color: pink;
}table.operators {
        width: 100%;
}table.operators th {
    background-color: #EFEFEF;
}table.operators, table.operators th, table.operators td {
    border: 1px solid black;
}</style>
<table class="bytes">
<thead>
<tr>
<th colspan="11">1 ბაიტი (8 ბიტი)</th>
</tr>
</thead>
<colgroup>
<col width="25%" />
    </colgroup>
<tbody class="idx">
<tr>
<td align="left">ბიტის ინდექსი</td>
<td>7</td>
<td>6</td>
<td>5</td>
<td>4</td>
<td>3</td>
<td>2</td>
<td>1</td>
<td>0</td>
<td colspan="2">&nbsp;</td>
</tr>
</tbody>
<tbody class="bits">
<tr>
<td align="left">ბიტის მნიშვნელობა</td>
<td>128</td>
<td>64</td>
<td>32</td>
<td>16</td>
<td>8</td>
<td>4</td>
<td>2</td>
<td>1</td>
<td colspan="2">&nbsp;</td>
</tr>
</tbody>
</table>
<p>სადაც <strong>&#8220;ბიტის ინდექსი&#8221;</strong> ასახავს ბიტის პოზიციას ბაიტში(ინდექსაცია იწყება 0 &#8211; იდან). ხოლოდ <strong>&#8220;ბიტის მნიშნვნელობა&#8221;</strong> კონკრეტულ პოზიციაზე ბიტის შესაძლო მნიშვნელობას თუ იგი მონიშნულია(ანუ უდრის 1 &#8211; ს).</p>
<p>როგორც ზემოთ ავღნიშნე თუ ბაიტის შემადგენელი ყველა ბიტი არის მონიშნული მაშინ ბაიტის მნიშვნელობა იქნება 255 &#8211; ის ტოლი, რაც ვიზუალურად გამოსახულია შემდეგ ცხრილში:</p>
<table class="bytes">
<thead>
<tr>
<th colspan="11">1 ბაიტი (8 ბიტი)</th>
</tr>
</thead>
<colgroup>
<col width="25%" />
    </colgroup>
<tbody class="idx">
<tr>
<td align="left">ბიტის ინდექსი</td>
<td>7</td>
<td>6</td>
<td>5</td>
<td>4</td>
<td>3</td>
<td>2</td>
<td>1</td>
<td>0</td>
<td colspan="2">&nbsp;</td>
</tr>
</tbody>
<tbody class="bits">
<tr>
<td align="left">ბიტის მნიშვნელობა</td>
<td>128</td>
<td>64</td>
<td>32</td>
<td>16</td>
<td>8</td>
<td>4</td>
<td>2</td>
<td>1</td>
<td colspan="2">&nbsp;</td>
</tr>
</tbody>
<tbody class="flags">
<tr>
<td align="left">&nbsp;</td>
<td>1</td>
<td>1</td>
<td>1</td>
<td>1</td>
<td>1</td>
<td>1</td>
<td>1</td>
<td>1</td>
<td align="center">=</td>
<td align="left">255</td>
</tr>
</tbody>
</table>
<p>ცხრილის მესამე სტრიქონში ყველა ველში მითითებულია 1, რაც ნიშნავს რომ იგივე პოზიციაზე არსებული ბიტი არის მონიშნული, ხოლო რეზულტატი უდრის 255 &#8211; ს. როგორ მივიღეთ ეს რეზულტატი? რადგან ყველა ბიტი მონიშნულია ამის საფუძველზე შეგვიძლია დავწეროთ შემდეგი მარტივი არითმეტიკული გამოსახულება:</p>
<p>128 + 64 + 32 + 16 + 8 + 4 + 2 + 1 = 255</p>
<p>აქედან შეგვიძლია გავაკეთოთ დასკვნა, რომ თუ ბაიტის ბიტი ან ბიტები არის მონიშნული მათი შესაბამისი მნიშვნელობების დაჯამებით მივიღებთ ბაიტის ზუსტ მნიშვნელობას.</p>
<p>გამომდინარე აქედან შეგვიძლია გამოვითვალოთ მაგალითად რიცხვი 36:</p>
<table class="bytes">
<thead>
<tr>
<th colspan="11">1 ბაიტი (8 ბიტი)</th>
</tr>
</thead>
<colgroup>
<col width="25%" />
    </colgroup>
<tbody class="idx">
<tr>
<td align="left">ბიტის ინდექსი</td>
<td>7</td>
<td>6</td>
<td>5</td>
<td>4</td>
<td>3</td>
<td>2</td>
<td>1</td>
<td>0</td>
<td colspan="2">&nbsp;</td>
</tr>
</tbody>
<tbody class="bits">
<tr>
<td align="left">ბიტის მნიშვნელობა</td>
<td>128</td>
<td>64</td>
<td>32</td>
<td>16</td>
<td>8</td>
<td>4</td>
<td>2</td>
<td>1</td>
<td colspan="2">&nbsp;</td>
</tr>
</tbody>
<tbody class="flags">
<tr>
<td align="left">&nbsp;</td>
<td>0</td>
<td>0</td>
<td>1</td>
<td>0</td>
<td>0</td>
<td>1</td>
<td>0</td>
<td>0</td>
<td align="center">=</td>
<td align="left">36</td>
</tr>
</tbody>
</table>
<p>რატომ არის ამ გამოსახულების რეზულტატი 36 &#8211; ის ტოლი? რადგან ცხრილში ნაჩვენებია რომ მოვნიშნეთ მხოლოდ ორი ბიტი, სადაც ერთი ბიტის მნიშნელობა არის 32(პოზიცია ინდექსით 5) ხოლო მეორე ბიტის მნიშვნელობა კი 4(პოზიცია ინდექსით 2) შეგვიძლია დავწეროთ ასეთი გამოსახულება:</p>
<p>32 + 4 = 36</p>
<p>თუ რა საშუალებებს გვთავაზობს ბიტური ოპერაციების განსახორციელებლად PHP, დეტალური ინფორმაცია შეგიძლიათ იხილოთ <a href="http://ge.php.net/manual/en/language.operators.bitwise.php">შესაბამის მისამართზე</a>.</p>
<h2>PHP-ს ბიტური ოპერატორები</h2>
<p>შემდეგ ცხრილში მოცემულია ოპერატორების ცხრილი შესაბამისი განმარტებებით:</p>
<table class="operators">
<thead>
<tr>
<th>მაგალითი</th>
<th>დასახელება</th>
<th>რეზულტატი</th>
</tr>
</thead>
<tbody>
<tr>
<td>$a &#038; $b</td>
<td>And</td>
<td>ბიტები რომლებიც მონიშნულია(და საერთოა) ორივე $a და $b ცვლადებში.</td>
</tr>
<tr>
<td>$a | $b</td>
<td>Or</td>
<td>ბიტები რომლებიც მონიშნულია ან $a ან $b ცვლადებში.</td>
</tr>
<tr>
<td>$a ^ $b</td>
<td>Xor</td>
<td>ბიტები რომლებიც მონიშნულია ან $a ცვლადში ან $b ცვლადში მაგრამ არა ორივეში. </td>
</tr>
<tr>
<td>~ $a</td>
<td>Not</td>
<td>ბიტები რომლებიც  არ არის მონიშნული $a ცვლადში, და პირიქით. </td>
</tr>
<tr>
<td>$a &lt;&lt; $b</td>
<td>Shift left</td>
<td>$a ცვლადის ბიტების წაძვრა $b ბიჯით მარცხნივ(ყოველი ბიჯი ნიშნავს &#8220;გაამრავლზე ორზე&#8221;) </td>
</tr>
<tr>
<td>$a &gt;&gt; $b</td>
<td>Shift right</td>
<td>$a ცვლადის ბიტების წაძვრა $b ბიჯით მარჯვნი (ყოველი ბიჯი ნიშნავს &#8220;გაყავი ორზე&#8221;) </td>
</tr>
</tbody>
</table>
<p>განვიხილოთ ცხრილში მოცემული ყველა ოპერატორი:</p>
<p><strong><br />
AND(&#038;) ოპერატორი</strong><br />
&#038; ოპერატორი აბრუნებს გამოსახულების მარცხენა და მარჯვენა მხარეს არსებული მნიშვნელობების იმ ბიტების ჯამს რომლებიც საერთოა ორივესთვის, მაგალითად შემდეგ კოდის შესრულების შემდეგ ეკრანზე გამოიბეჭდება 6:</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 /></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;">$a</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">7</span><span style="color: #339933;">;</span><br />
<span style="color: #000088;">$b</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">6</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #b1b100;">echo</span> <span style="color: #000088;">$a</span> <span style="color: #339933;">&amp;</span> <span style="color: #000088;">$b</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p>თუ რატომ არის ამ გამოსახულების შედეგი 6 &#8211; ის ტოლი ნაჩვენებია ჩემდეგ ცხრილში:</p>
<table class="bytes">
<thead>
<tr>
<th colspan="11">1 ბაიტი (8 ბიტი)</th>
</tr>
</thead>
<colgroup>
<col width="25%" />
    </colgroup>
<tbody class="idx">
<tr>
<td align="left">ბიტის ინდექსი</td>
<td>7</td>
<td>6</td>
<td>5</td>
<td>4</td>
<td>3</td>
<td>2</td>
<td>1</td>
<td>0</td>
<td colspan="2">&nbsp;</td>
</tr>
</tbody>
<tbody class="bits">
<tr>
<td align="left">ბიტის მნიშვნელობა</td>
<td>128</td>
<td>64</td>
<td>32</td>
<td>16</td>
<td>8</td>
<td>4</td>
<td>2</td>
<td>1</td>
<td colspan="2">&nbsp;</td>
</tr>
</tbody>
<tbody class="flags">
<tr>
<td align="left">$a</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>1</td>
<td>1</td>
<td>1</td>
<td align="center">=</td>
<td align="left">7 (ანუ: 4+2+1)</td>
</tr>
<tr>
<td align="left">$b</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>1</td>
<td>1</td>
<td>0</td>
<td align="center">=</td>
<td align="left">6 (ანუ: 4+2)</td>
</tr>
</tbody>
</table>
<p>ცხრილში შეგვიძლია ვიზუალურად დავინახოთ რომ $a და $b ცვლადებს აქვთ მონიშნული საერთო ბიტები პოზიციებზე ინდექსით 1 და 2, რადგან მოცემულ პოზიციებზე ბიტების მნიშვნელობებია შესაბამისად 4 და 2 ამ რიცხვების ჯამი იქნება 6: 4+2 = 6</p>
<p><strong><br />
OR(|) ოპერატორი</strong><br />
| ოპერატორი აბრუნებს გამოსახულების მარცხენა და მარჯვენა მხარეს არსებული მნიშვნელობების იმ ბიტების ჯამს რომლებიც მონიშნულია ან მარცხენა ან მარჯვენა ოპერანდში, მაგალითად შემდეგ კოდის შესრულების შემდეგ ეკრანზე გამოიბეჭდება 15:</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 /></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;">$a</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">11</span><span style="color: #339933;">;</span><br />
<span style="color: #000088;">$b</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">6</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #b1b100;">echo</span> <span style="color: #000088;">$a</span> <span style="color: #339933;">|</span> <span style="color: #000088;">$b</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p>თუ რატომ არის ამ გამოსახულების შედეგი 15 &#8211; ის ტოლი ნაჩვენებია ჩემდეგ ცხრილში:</p>
<table class="bytes">
<thead>
<tr>
<th colspan="11">1 ბაიტი (8 ბიტი)</th>
</tr>
</thead>
<colgroup>
<col width="25%" />
</colgroup>
<tbody class="idx">
<tr>
<td align="left">ბიტის ინდექსი</td>
<td>7</td>
<td>6</td>
<td>5</td>
<td>4</td>
<td>3</td>
<td>2</td>
<td>1</td>
<td>0</td>
<td colspan="2">&nbsp;</td>
</tr>
</tbody>
<tbody class="bits">
<tr>
<td align="left">ბიტის მნიშვნელობა</td>
<td>128</td>
<td>64</td>
<td>32</td>
<td>16</td>
<td>8</td>
<td>4</td>
<td>2</td>
<td>1</td>
<td colspan="2">&nbsp;</td>
</tr>
</tbody>
<tbody class="flags">
<tr>
<td align="left">$a</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>1</td>
<td>0</td>
<td>1</td>
<td>1</td>
<td align="center">=</td>
<td align="left">11 (ანუ: 8+2+1)</td>
</tr>
<tr>
<td align="left">$b</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>1</td>
<td>1</td>
<td>0</td>
<td align="center">=</td>
<td align="left">6 (ანუ: 4+2)</td>
</tr>
</tbody>
</table>
<p>ცხრილიდან ჩანს რომ ორივე $a და $b ცვლადებისათვის ბიტები მონიშნულია ინდექსებზე 0, 1, 2 და 3 ხოლო ამ პოზიციებზე არსებული მნიშვნელობების დაჯამებით მივიღებთ 15-ს: 8+4+2+1=15</p>
<p><strong><br />
XOR(^) ოპერატორი</strong><br />
^ ოპერატორი აბრუნებს გამოსახულების მარცხენა და მარჯვენა მხარეს არსებული მნიშვნელობების იმ ბიტების ჯამს რომლებიც მონიშნულია ან მარცხენა ან მარჯვენა ოპერანდში მაგრამ არა ორივეში, მაგალითად შემდეგ კოდის შესრულების შემდეგ ეკრანზე გამოიბეჭდება 13:</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 /></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;">$a</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">11</span><span style="color: #339933;">;</span><br />
<span style="color: #000088;">$b</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">6</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #b1b100;">echo</span> <span style="color: #000088;">$a</span> ^ <span style="color: #000088;">$b</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p>თუ რატომ არის ამ გამოსახულების შედეგი 13-ის ტოლი ნაჩვენებია ჩემდეგ ცხრილში:</p>
<table class="bytes">
<thead>
<tr>
<th colspan="11">1 ბაიტი (8 ბიტი)</th>
</tr>
</thead>
<colgroup>
<col width="25%" />
</colgroup>
<tbody class="idx">
<tr>
<td align="left">ბიტის ინდექსი</td>
<td>7</td>
<td>6</td>
<td>5</td>
<td>4</td>
<td>3</td>
<td>2</td>
<td>1</td>
<td>0</td>
<td colspan="2">&nbsp;</td>
</tr>
</tbody>
<tbody class="bits">
<tr>
<td align="left">ბიტის მნიშვნელობა</td>
<td>128</td>
<td>64</td>
<td>32</td>
<td>16</td>
<td>8</td>
<td>4</td>
<td>2</td>
<td>1</td>
<td colspan="2">&nbsp;</td>
</tr>
</tbody>
<tbody class="flags">
<tr>
<td align="left">$a</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>1</td>
<td>0</td>
<td>1</td>
<td>1</td>
<td align="center">=</td>
<td align="left">11 (ანუ: 8+2+1)</td>
</tr>
<tr>
<td align="left">$b</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>1</td>
<td>1</td>
<td>0</td>
<td align="center">=</td>
<td align="left">6 (ანუ: 4+2)</td>
</tr>
</tbody>
</table>
<p>ამ შემთხვევაში $a ცვლადისათვის ისეთი ბიტები რომლებიც არ არის მონიშნული $b ცვლადში გვხვდება პოზიციებზე ინდექსებით 3 და 1, ხოლო $b ცვლადისათვის ასეთი ბიტი მდებარეობს პოზიციაზე ინდექსით 2. თუ დავაჯამებთ ამ პოზიციების შესაბამის მნიშვნელობებს მივიღებთ 13-ს: 8+4+1=13</p>
<p><strong><br />
NOT(~) ოპერატორი</strong><br />
თუ შევასრულებთ შემდეგ კოდს რომელშიც გამოიყენება ~ ოპერატორი, ეკრანზე გამოიბეჭდება 9:</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 /></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;">$a</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">11</span><span style="color: #339933;">;</span><br />
<span style="color: #000088;">$b</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">6</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #b1b100;">echo</span> <span style="color: #000088;">$a</span> <span style="color: #339933;">&amp;</span> ~<span style="color: #000088;">$b</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p>თუ რატომ არის ამ გამოსახულების შედეგი 9 &#8211; ის ტოლი ნაჩვენებია ჩემდეგ ცხრილში:</p>
<table class="bytes">
<thead>
<tr>
<th colspan="11">1 ბაიტი (8 ბიტი)</th>
</tr>
</thead>
<colgroup>
<col width="25%" />
</colgroup>
<tbody class="idx">
<tr>
<td align="left">ბიტის ინდექსი</td>
<td>7</td>
<td>6</td>
<td>5</td>
<td>4</td>
<td>3</td>
<td>2</td>
<td>1</td>
<td>0</td>
<td colspan="2">&nbsp;</td>
</tr>
</tbody>
<tbody class="bits">
<tr>
<td align="left">ბიტის მნიშვნელობა</td>
<td>128</td>
<td>64</td>
<td>32</td>
<td>16</td>
<td>8</td>
<td>4</td>
<td>2</td>
<td>1</td>
<td colspan="2">&nbsp;</td>
</tr>
</tbody>
<tbody class="flags">
<tr>
<td align="left">$a</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>1</td>
<td>0</td>
<td>1</td>
<td>1</td>
<td align="center">=</td>
<td align="left">11 (ანუ: 8+2+1)</td>
</tr>
<tr>
<td align="left">$b</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>1</td>
<td>1</td>
<td>0</td>
<td align="center">=</td>
<td align="left">6 (ანუ: 4+2)</td>
</tr>
</tbody>
</table>
<p>რადგან $a &#038; ~$b გამოსახულებაში ~ გამოიყენება $b-სთან, იგი შეგვიძლია განვმარტოთ შემდეგნაირად: დააბრუნე $a ცვლადის იმ ბიტების ჯამი რომლებიც არ არის მონიშნული $b ცვლადში. ხოლო როგორც ცხრილიდან ჩანს $a ცვლადისათვის ასეთი ბიტები გვხვდება პოზიციებზე ინდექსით 3 და ინდექსით 0, შედეგად 8+1=9</p>
<p><strong> &lt;&lt; ოპერატორი, მარცხნივ წაძვრის ოპერატორი</strong></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 /></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;">$a</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">4</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #b1b100;">echo</span> <span style="color: #000088;">$a</span> <span style="color: #339933;">&lt;&lt;</span> <span style="color: #cc66cc;">3</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p>კოდის შესრულების შედეგი იქნება 32.  ბიტების ცხრილის გამოყენებით ადვილად შეგვიძლია ამის დადგენა:</p>
<table class="bytes">
<thead>
<tr>
<th colspan="11">1 ბაიტი (8 ბიტი)</th>
</tr>
</thead>
<colgroup>
<col width="25%" />
</colgroup>
<tbody class="idx">
<tr>
<td align="left">ბიტის ინდექსი</td>
<td>7</td>
<td>6</td>
<td>5</td>
<td>4</td>
<td>3</td>
<td>2</td>
<td>1</td>
<td>0</td>
<td colspan="2">&nbsp;</td>
</tr>
</tbody>
<tbody class="bits">
<tr>
<td align="left">ბიტის მნიშვნელობა</td>
<td>128</td>
<td>64</td>
<td>32</td>
<td>16</td>
<td>8</td>
<td>4</td>
<td>2</td>
<td>1</td>
<td colspan="2">&nbsp;</td>
</tr>
</tbody>
<tbody class="flags">
<tr>
<td align="left">$a &#8211; საწყისი</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>1</td>
<td>0</td>
<td>0</td>
<td align="center">=</td>
<td align="left">4</td>
</tr>
<tr>
<td align="left">$a &#8211; წაძვრის შემდეგ</td>
<td>0</td>
<td>0</td>
<td>1</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td align="center">=</td>
<td align="left">32</td>
</tr>
</tbody>
</table>
<p>ცხრილიდან $a &#8211; ს საწყისი და საბოლოო შედეგების შედარებისას ნათელია რომ &lt;&lt; მეშვეობით მონიშნული ბიტი წავძარით მარცხნივ სამი(3) ბიჯით, გამომდინარე შედეგინდან, რათა უფრო მარტივი გასაგები გახდეს $a &lt;&lt;3 გამოსახულება შეიძლება ავსახოთ შემდეგნაირად: 4*2*2*2=32</p>
<p><strong><br />
&gt;&gt; ოპერატორი, მარჯვნივ წაძვრის ოპერატორი</strong><br />
ეს ოპერატორი მუშაობს წინა ოპერატორის მსგავსად მხოლოდ ბიტების წაძვრა ხდება მარცხნიდან მარჯვნივ, მაგალითად შემდეგი კოდის შესრულებით შედეგად მივიღებთ 4-ს:</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 /></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;">$a</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">32</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #b1b100;">echo</span> <span style="color: #000088;">$a</span> <span style="color: #339933;">&gt;&gt;</span> <span style="color: #cc66cc;">3</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p>ხოლო $a &gt;&gt; 3 ამ გამოსახულების გადაწერა შეიძლება შემდეგნაირად: 32/2/2/2=4</p>
]]></content:encoded>
			<wfw:commentRss>http://www.code.ge/posts/bitwise-operators-in-php/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>phpDocumentor &#8211; ის ინტეგრაცია PHPEclipse 3.2 &#8211; ში</title>
		<link>http://www.code.ge/posts/integrating-phpdocumentor-into-phpeclipse</link>
		<comments>http://www.code.ge/posts/integrating-phpdocumentor-into-phpeclipse#comments</comments>
		<pubDate>Wed, 14 Mar 2007 07:33:55 +0000</pubDate>
		<dc:creator>იოსები</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.ioseb.com/?p=30</guid>
		<description><![CDATA[პირველ რიგში რისთვის არის phpDocumentor და რა არის PHPEclipse? ორივე ძალიან საჭირო და სასარგებლო ინსტრუმენტია რომელიც საგრძნობლად აადვილებს საქმეს&#8230; phpDocumentor არის შესანიშნავი ინსტრუმენტი PHP &#8211; ს API დოკუმენტაციის დასაგენერირებლად ხოლო PHPEclipse ჩემის აზრით საუკეთესო IDE PHP &#8211; სთვის. ნებისმიერ PHP დეველოპერს ვინც არ იყენებს ამ ინსტრუმენტებს ვურჩევდი მათ გამოყენებას. phpDocumentor შეიძლება გადმოვიწეროთ ამ მისამართიდან ხოლო [...]]]></description>
			<content:encoded><![CDATA[<p>პირველ რიგში რისთვის არის phpDocumentor და რა არის PHPEclipse? ორივე ძალიან საჭირო და სასარგებლო ინსტრუმენტია რომელიც საგრძნობლად აადვილებს საქმეს&#8230; phpDocumentor არის შესანიშნავი ინსტრუმენტი PHP &#8211; ს API დოკუმენტაციის დასაგენერირებლად ხოლო PHPEclipse ჩემის აზრით საუკეთესო IDE PHP &#8211; სთვის. ნებისმიერ PHP დეველოპერს ვინც არ იყენებს ამ ინსტრუმენტებს ვურჩევდი მათ გამოყენებას. phpDocumentor შეიძლება გადმოვიწეროთ <a href="http://www.phpdoc.org/">ამ მისამართიდან</a> ხოლო PHPEclipse <a href="http://sourceforge.net/projects/phpeclipse">ამ მისამართიდან</a><span id="more-30"></span></p>
<p>დროს არ დავხარჯავ იმის ახსნით თუ როგორ მუშაობს phpDocumentor და როგორ გავაკეთოთ პროექტი PHPEclipse &#8211; ში, ორივე ინსტრუმენტი აღჭურვილია შესანიშნავი დოკუმენტაციით და მათი გარჩევა პრობლემას არ წარმოადგენს. ასევე იგულისხმება რომ ორივე ინსტრუმენტი უკვე დაინსტალირებულია და ორივეს ვიყენებთ შესაბამისად.</p>
<p>1) პირველ რიგში გავხსნათ შემდეგი დიალოგი (Run->External Tools->External Tools)</p>
<p><a href='http://www.ioseb.com/wp-content/uploads/2007/03/screen1.gif' title='screen1.gif'><img src='http://www.ioseb.com/wp-content/uploads/2007/03/screen1.thumbnail.gif' alt='screen1.gif' /></a></p>
<p>2) შემდეგ მოვნიშნოთ Program სექცია მარცხენა მენიუში და New ღილაკის მეშვეობით შევქმნათ ახალი კონფიგურაცია</p>
<p><a href='http://www.ioseb.com/wp-content/uploads/2007/03/screen22.gif' title='screen22.gif'><img src='http://www.ioseb.com/wp-content/uploads/2007/03/screen22.gif' alt='screen22.gif' /></a></p>
<ul>
<li><strong>Name</strong> &#8211; კონფიგურაციის დასახელება</li>
<li><strong>Location </strong>- მისამართი სადაც აყენია PHP &#8211; ს შესრულებადი ფაილი (php.exe)</li>
<li><strong>Working Directory</strong> &#8211; მისამართი სადაც უნდა დაგენერირდეს დოკუმენტაცია</li>
<li>
<strong>Arguments</strong> &#8211; phpDocumentor &#8211; ის შესასრულებლად საჭირო არგუმენტები</li>
</ul>
<p><strong>Working Directory</strong> &#8211; ს მისათითებლად ავირჩიოთ საჭირო კატალოგი (Browse Workspace ღილაკით გამოიძახება შემდეგი დიალოგი). დაგენერირებული API დოკუმენტაცია განთავსდება არჩეულ კატალოგში.</p>
<p><a href='http://www.ioseb.com/wp-content/uploads/2007/03/screen3.gif' title='screen3.gif'><img src='http://www.ioseb.com/wp-content/uploads/2007/03/screen3.gif' alt='screen3.gif' /></a></p>
<p>3) შევქმნათ phpDocumentor &#8211; ის კონფიგურაცია რათა შემდეგ მივუთითოთ <strong>Arguments</strong> ველში.<br />
ამისათვის საჭიროა phpDocumentor &#8211; ში არსებული user ქვეკატალოგში დავაკოპიროთ default.ini ფაილი(რომელიც განთავსებულია user კატალოგში) და დავარქვათ მას სასურველი სახელი (ჩემს შემთხვევაში ფაილს დავარქვი ioseb.ini) და მივუთითოთ შესაბამისი პარამეტრები.</p>
<p>როგორც სურათზე ჩანს Arguments ველში წერია შემდეგი მნიშვნელობა: </p>
<p>&#8220;C:\webservers\apache\www\PHPDOC\phpDocumentor\phpdoc.inc&#8221; -c ioseb</p>
<p>ბრჭყალებში განსაზღვრულია phpDocumentor &#8211; ის phpdoc.inc ფაილის მისამართი, შემდეგ -c ioseb რაც ნიშნავს რომ phpDocumentor დოკუმენტაციას დააგენერირებს სასურველი კონფიგურაციის მიხედვით ამ შემთხვევაში ioseb.ini.</p>
<p>4) გადავიდეთ Common განყოფილებაში და Display in favorites menu ველში მოვნიშნოთ External Tools</p>
<p><a href='http://www.ioseb.com/wp-content/uploads/2007/03/screen4.gif' title='screen4.gif'><img src='http://www.ioseb.com/wp-content/uploads/2007/03/screen4.gif' alt='screen4.gif' /></a></p>
<p>ამ ყველაფრის შესრულების შემდეგ საჭიროა შევინახოთ ახლად შექმნილი კონფიგურაცია Apply ღილაკით.</p>
<p>phpDocumentor &#8211; ის გაშვება უკვე შესაძლებელია პირდაპირ მენიუდან:</p>
<p><a href='http://www.ioseb.com/wp-content/uploads/2007/03/screen5.gif' title='screen5.gif'><img src='http://www.ioseb.com/wp-content/uploads/2007/03/screen5.gif' alt='screen5.gif' /></a></p>
<p>ხოლო შესრულების რეზულტატი გამოჩნდება Eclipse &#8211; ს კონსოლში.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.code.ge/posts/integrating-phpdocumentor-into-phpeclipse/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>რა არის ახალი PHP 5-ში</title>
		<link>http://www.code.ge/posts/whats-new-in-php5</link>
		<comments>http://www.code.ge/posts/whats-new-in-php5#comments</comments>
		<pubDate>Fri, 16 Feb 2007 23:19:54 +0000</pubDate>
		<dc:creator>იოსები</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://localhost/wordpress/?p=6</guid>
		<description><![CDATA[Andi Gutmans, Stig Bakken და Derick Rethans-ის ახალი წიგნის &#8220;PHP 5 Power Programming&#8221; II თავი. ორიგინალის მისამართი: http://www.zend.com/php5/andi-book-excerpt.php შესავალი ენის ახალი შესაძლებლობები ახალი ობიექტზე-ორიენტირებული მოდელი ახალი ობიექტზე-ორიენტირებული მიდგომა ენის სხვა ახალი შესაძლებლობები PHP-ში შესული ძირითადი ცვლილებები XML და ვებ სერვისები ახალი გაფართოება MySQLi (დახვეწილი MySQL) გაფართოება SQLite Tidy გაფართოება Perl გაფართოება PHP 5-ის სხვა სიახლეები [...]]]></description>
			<content:encoded><![CDATA[<p>Andi Gutmans, Stig Bakken და Derick Rethans-ის ახალი წიგნის &#8220;PHP 5 Power Programming&#8221; II თავი.</p>
<p>ორიგინალის მისამართი: http://www.zend.com/php5/andi-book-excerpt.php</p>
<ol>
<li>შესავალი</li>
<li>ენის ახალი შესაძლებლობები
<ul>
<li>ახალი ობიექტზე-ორიენტირებული მოდელი</li>
<li>ახალი ობიექტზე-ორიენტირებული მიდგომა ენის სხვა ახალი შესაძლებლობები</li>
</ul>
</li>
<li>PHP-ში შესული ძირითადი ცვლილებები
<ul>
<li>XML და ვებ სერვისები</li>
<li>ახალი გაფართოება MySQLi (დახვეწილი MySQL)</li>
<li>გაფართოება SQLite</li>
<li>Tidy გაფართოება</li>
<li>Perl გაფართოება</li>
<li>PHP 5-ის სხვა სიახლეები</li>
</ul>
</li>
<li>დასკვნა</li>
</ol>
<p><span id="more-6"></span><br />
საუკეთესო გზა რათა მოვემზადოთ მომავლისათვის &#8211; ეს არის მისი გამოგონება. John Sculley</p>
<p>შესავალი</p>
<p>მხოლოდ დრო გვაჩვენებს, იქნება PHP 5 ისეთივე წარმატებული, როგორც მისი წინამორბედები (PHP 3 და PHP 4). ახალი შესაძლებლობები და თვისებები მიმართულია PHP &#8211; ს სუსტი მხარეების აღმოსაფხვრელად, და ლიდერის სტატუსის შესანარჩუნებლად ვებში.</p>
<p>ეს წიგნი ეძღვნება PHP 5-ის ახალი შესაძლებლობების მიმოხილვას. თუ თქვენ კარგად იცნობთ PHP 4-ს და დაინტერესებული ხართ PHP 5-ის ახალი შესაძლებლობებით, მაშინ ეს განყოფილება განკუთვნილია თქვენთვის.</p>
<p>ამ განყოფილებაში განხილულ იქნება:</p>
<ul>
<li>ენის ახალი შესაძლებლობები;</li>
<li>სიახლეები, PHP &#8211; ს გაფართოებების (extensions) შესახებ;</li>
<li>სხვა ცვლილებები, რომლებიც ყურადღებას იმსახურებს.</li>
</ul>
<p><strong>ენის ახალი შესაძლებლობები</strong></p>
<p>ახალი ობიექტზე-ორიენტირებული მოდელი</p>
<p>როდესაც ზივ სერასკიმ (Zeev Suraski) დაამატა ობიექტზე-ორიენტირებული (ОО) სინტაქსი PHP 3-ში, ამის განხილვა შეიძლებოდა როგორც „სინტაქსური დამატკბობელი კლასების მხარდაჭერისათვის“ (&#8220;syntactic sugar for accessing collections&#8221;). ობიექტზე-ორიენტირებულმა მოდელმა მიიღო მემკვიდრეობის მხარდაჭერა და კლასსა (და ობიექტს) მიეცა საშუალება გაეერთიანებინა მეთოდები და თვისებები, მაგარამ არა უმეტეს. როდესაც ზივმა და ენდიმ გადაწერეს ძრავი PHP 4-სთვის, ეს იყო სრულიად ახალი ძრავი, რომელიც მუშაობდა საგრძნობლად სწრაფად, ბევრად სტაბილურად და დამატებით გააჩნდა სხვა უამრავი საშუალება. მაგრამ, ეს ცვლილებები პრაქტიკულად არ შეხებია ობიექზე-ორიენტირებულ მოდელს, რომელიც დანერგილი იყო ჯერ კიდევ PHP 3 &#8211; ში.</p>
<p>თუმცა ობიექტურ მოდელს გააჩნდა სერიოზული შეზღუდვები, ის ფართოდ გამოიყენებოდა, ხშირად ძალზე დიდ PHP აპლიკაციებში. ობიექტური მოდელის ასეთმა შეზღუდულმა სახემ PHP 4-ში, ცენტრალურ საკითხად აქცია აღნიშნული მოდელის შეცვლა PHP-ს ახალ რელიზში.</p>
<p>რა შეზღუდვები იყო PHP 3-სა და 4-ში? ყველაზე დიდი შეზღუდვა (რომელიც იწვევდა ყველა სხვა შეზღუდვას) იყო ის ფაქტი, რომ ობიექტის ეგზემპლარის სემანტიკა იყო იგივე, რაც მშობლიური ტიპებისათვის. როგორ აისახებოდა ეს პროგრამისტებზე? როდესაც თქვენ ანიჭებდით ცვლადს (რომელიც მიუთითებდა ობიექტზე) სხვა ცვლადს, იქმნებოდა ობიექტის დუბლიკატი. გარდა იმისა, რომ ეს ზემოქმედებას ახდენდა წარმადობაზე, ეს ფაქტი ხშირად იწვევდა შეცდომებს აპლიკაციაში, მიზეზი ამისა იყო ის, რომ ბევრი პროგრამისტი ფიქრობდა, რომ ორივე ცვლადი მიუთითებდა ერთსა და იმავე ობიექტს. სინამდვილეში ეს ცვლადები მიუთითებდნენ ერთი და იგივე ობიექტის სხვადასხვა დუბლიკატებს, ამიტომ, ერთი ობიექტის ცვლილებისას, ჩვენ არ ვცვლიდით მეორე ობიექტს.</p>
<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 />19<br />20<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> Person <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">var</span> <span style="color: #000088;">$name</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">function</span> getName<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;">name</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">function</span> setName<span style="color: #009900;">&#40;</span><span style="color: #000088;">$name</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;">name</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$name</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">function</span> Person<span style="color: #009900;">&#40;</span><span style="color: #000088;">$name</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;">setName</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$name</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
<br />
<span style="color: #009900;">&#125;</span><br />
<br />
<span style="color: #000000; font-weight: bold;">function</span> changeName<span style="color: #009900;">&#40;</span><span style="color: #000088;">$person</span><span style="color: #339933;">,</span> <span style="color: #000088;">$name</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #000088;">$person</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setName</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$name</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span></div></td></tr></tbody></table></div>
<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 /></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;">$person</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Person<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Andi&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
changeName<span style="color: #009900;">&#40;</span><span style="color: #000088;">$person</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;Stig&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #b1b100;">print</span> <span style="color: #000088;">$person</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getName</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>PHP 4-ში ეს კოდი გამოიტანს &#8220;Andi&#8221; &#8211; ს. მიზეზი მდგომარეობს იმაში, რომ ჩვენ ფუნქციას changeName() გადავცემთ $person ობიექტს მნიშვნელობით (By Value), და არა მისამართით (By Reference) ამგვარად, იბიექტი $person იქნება დუბლირებული, და ფუნქცია changeName() უკვე იმუშავებს $person ობიექტის დუბლიკატთან.</p>
<p>ასეთი ქმედება არ არის ინტუიციურად გასაგები. სინამდვილეში, ბევრი პროგრამისტი მოელოდა Java-ს მსგავს ქმედებას. Java-ში, ცვლადები ფაქტობრივად არიან მაჩვენებლები ობიექტზე, და ამიტომ დუბლირებისას მოხდება მაჩვენებლის კოპირება, და არა თვით ობიექტისა.</p>
<p>იყვნენ ორი სახის პროგრამისტები: ისინი, ვინც იცოდნენ ამ პრობლემის შესახებ, და ისინი, ვინც ეს არ იცოდნენ. უკანასკნელნი, ჩვეულებრივ, არ აწყდებოდნენ ამ პრობლემას, იმიტომ რომ მათი კოდი იყო დაწერილი ისე, რომ არ ქონდა მნიშვნელობა, არსებობდა თუ არა ასეთი პრობლემა. რა თქმა უნდა, ასეთი ტიპის პროგრამისტები ხშირად ატარებდნენ უძილო ღამეებს ასეთი „ზებუნებრივი“ შეცდომების ძიებაში. პირველ კატეგორიას ასევე გააჩნდა პრობლემა, რამდენადაც მათ ხელოვნურად უწევდათ ობიექტის მისამართით გადაცემა, რითიც უკრძალავდნენ ძრავს ობიექტების დუბლირებას, რის გამოც კოდი აჭრელებული იყო უამრვაი &#8216;&amp;&#8217; ნიშნით.</p>
<p>ძველი ობიექტური მოდელს მივყევართ არა მარტო ზემოთ ხსენებულ პრობლემებთან, არამედ ფარდას ხდის სხვა ფუნდამენტურ პრობლემებს, რომლებიც ხელს უშლიდნენ სხვა შესაძლებლობების განხორციელებას არსებულ ობიექტურ მოდელში.</p>
<p>PHP 5-ში ობიექტური მოდელი მთლიანად გადაწერილი იყო იმისათვის, რომ თავიდანვე შესაძლებელი გამხდარიყო ობიექტების მაჩვენებლებთან მუშაობა. თუ თქვენ ღიად არ ახდენთ ობიექტის კლონირებას, საკვანძო სიტყვა clone &#8211; ს გამოყენებით, მაშინ თქვენ არ მოგიწევთ ობიექტის დუბლიკატთან მუშაობა. PHP 5 &#8211; ში უკვე აღარ არის საჭირო ღიად ობიექტების გადაცემა მისამართით, ეს ხორციელდება ავტომატურად.</p>
<p>შენიშვნა: ღიად მისამართით გადაცემისა და მინიჭების მხარდაჭერა კვლავ ფუნქციონირებს, იმ შემთხვევისათვის, თუ თქვენ გინდათ ობიექტისა ან ცვლადის მნიშვნელობის შეცვლა.</p>
<p>ახალი ობიექტზე-ორიენტირებული მიდგომა</p>
<p>ობიექტური მოდელის ახალი შესაძლებლობები მეტად მრავალრიცხვოვანია, იმისათვის რომ სრულად იყოს განხილული ამ თავში. თავში, რომელიც ეძღვნება ობიექტურ მოდელს, დეტალურად იქნება განხილული ყველა ახალი შესაძლებლობა.</p>
<p>ქვევით მოყვანილია ძირითადი ცვლილებების მიმოხილვა:</p>
<p>1.public/private/protected &#8211; მოდიფიკატორები მეთოდებსა და თვისებებზე მიმართვისათვის.</p>
<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 /></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> MyClass <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000088;">$id</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">18</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> getId<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;">id</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>2. უნიფიცირებული კონსტრუქტორი __construct()</p>
<p>კონსტრუქტორი, რომელიც ადრე ემთხვეოდა კლასის სახელს, ამჟამად აუცილებელია გამოვაცხადოთ როგორც __construct(), რაც საშუალებას მოგვცემს უფრო მარტივად გადავაადგილოთ კლასები იერარქიაში.</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 /></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> MyClass <span style="color: #009900;">&#123;</span><br />
<br />
<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><br />
&nbsp; &nbsp; <span style="color: #b1b100;">print</span> <span style="color: #0000ff;">&quot;Inside constructor&quot;</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>3. კლასის დესტრუქტორის მხარდაჭერა, განსაზღვრული როგორც მეთოდი __destructor()</p>
<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 /></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> MyClass <span style="color: #009900;">&#123;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">function</span> __destruct<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;">print</span> <span style="color: #0000ff;">&quot;Destroying object&quot;</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>4. ინტერფეისები</p>
<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 /></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;">interface</span> Display <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">function</span> display<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: #000000; font-weight: bold;">class</span> Circle implements Display <span style="color: #009900;">&#123;</span><br />
<br />
<span style="color: #000000; font-weight: bold;">function</span> display<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;">print</span> <span style="color: #0000ff;">&quot;Displaying circle &quot;</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>5. ოპერატორი instanceof</p>
<p>სხვა ობიექტებზე დამოკიდებულების შემოწმების საშუალება. PHP 4 – ის ფუნქციის is_a() გამოყენება არ არის რეკომენდირებული, მის მაგივრად გამოიყენება instanceof:</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 /></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><span style="color: #000088;">$obj</span> instance of Circle<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
<br />
<span style="color: #b1b100;">print</span> <span style="color: #0000ff;">'$obj is a Circle'</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #009900;">&#125;</span></div></td></tr></tbody></table></div>
<p>6. final მეთოდები</p>
<p>საკვანძო სიტყვა final საშუალებას გაძლევთ მონიშნოთ მეთოდი, რათა მემკვიდრე კლასმა ვერ შესძლოს მისი გადატვირთვა.</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 /></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> MyClass <span style="color: #009900;">&#123;</span><br />
<br />
final <span style="color: #000000; font-weight: bold;">function</span> getBaseClassName<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
<br />
<span style="color: #b1b100;">return</span> <span style="color: #009900; font-weight: bold;">__CLASS__</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #009900;">&#125;</span><br />
<br />
<span style="color: #009900;">&#125;</span></div></td></tr></tbody></table></div>
<p>7. final კლასები</p>
<p>კლასი გამოცხადებული როგორც final არ შეიძლება იყოს მემკვიდრეობით მიღებული სხვა კლასის მიერ. შემდეგი მაგალითი გამოიწვევს შეცდომას:</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 /></div></td><td><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">final <span style="color: #000000; font-weight: bold;">class</span> FinalClass <span style="color: #009900;">&#123;</span> <span style="color: #009900;">&#125;</span><br />
<span style="color: #000000; font-weight: bold;">class</span> BogusClass <span style="color: #000000; font-weight: bold;">extends</span> FinalClass <span style="color: #009900;">&#123;</span> <span style="color: #009900;">&#125;</span></div></td></tr></tbody></table></div>
<p>8. ობიექტის ღიად კლონირება</p>
<p>იმისათვის რომ მოვახდინოთ ობიექტის კლონირება, თქვენ უნდა გამოიყენოთ საკვანძო სიტყვა clone. თქვენ შეგიძლიათ გამოაცხადოთ მეთოდი __clone(), რომელიც გამოძახებული იქნება ობიექტის კოპირებისას (მას შემდეგ, რაც ყველა თვისება იქნება კოპირებული საწყისი ობიექტიდან).</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 /></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> MyClass <span style="color: #009900;">&#123;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">function</span> __clone<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;">print</span> <span style="color: #0000ff;">&quot;Object is being cloned&quot;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
<br />
<span style="color: #009900;">&#125;</span><br />
<br />
<span style="color: #000088;">$obj</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> MyClass<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
clone <span style="color: #000088;">$obj</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p>9. კლასის კონსტანტები</p>
<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 /></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> MyClass <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">const</span> SUCCESS <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;Success&quot;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">const</span> FAILURE <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;Failure&quot;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><br />
<br />
<span style="color: #b1b100;">print</span> MyClass<span style="color: #339933;">::</span><span style="color: #004000;">SUCCESS</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p>10. კლასის სტატიკური</p>
<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 /></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>private <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; static <span style="color: #000000; font-weight: bold;">public</span> <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 />
<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 />
<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 />
<br />
<span style="color: #009900;">&#125;</span><br />
<br />
<span style="color: #009900;">&#125;</span></div></td></tr></tbody></table></div>
<p>11. სტატიკური მეთოდები</p>
<p>თქვენ უკვე შეგიძლიათ განსაზღვროთ სტატიკური მეთოდები, რაც საშუალებას მოგცემთ გამოიძახოთ ისინი ობიექტის კონტექსტს მიღმა. სტატიკური მეთოდები არ განისაღვრება $this ცვლადის მეშვეობით, რამდენადაც ისინი არ უნდა იყვნენ შეზღუდულნი ობიექტის განსაზღვრით.</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 /></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> MyClass <span style="color: #009900;">&#123;</span><br />
<br />
&nbsp; &nbsp; static <span style="color: #000000; font-weight: bold;">function</span> helloWorld<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;">print</span> <span style="color: #0000ff;">&quot;Hello, world&quot;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
<br />
<span style="color: #009900;">&#125;</span><br />
<br />
MyClass<span style="color: #339933;">::</span><span style="color: #004000;">helloWorld</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>12. აბსტრაქტული კლასები</p>
<p>კლასი შესაძლებელია გამოცხადებული იყოს როგორც აბსტრაქტული საკვანძო სიტყვა abstract-ის გამოყენებით, რათა ძრავის მიერ გამოირიცხოს მისი აღწერა, თუმცა თქვენ შეგიძლიათ აბსტრაქტული კლასის მემკვიდრეობით გადაცემა:</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 /></div></td><td><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">abstract <span style="color: #000000; font-weight: bold;">class</span> MyBaseClass <span style="color: #009900;">&#123;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">function</span> display<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;">print</span> <span style="color: #0000ff;">&quot;Default display routine being called&quot;</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>13. აბსტრაქტული მეთოდები</p>
<p>მეთოდი შესაძლებელია გამოცხადებული იყოს როგორც აბსტრაქტული, რითიც მისი განსაზღვრის პრეროგატივას ვუტოვებთ მემკვიდრე კლასს. კლასი, რომელიც შეიცავს აბსტრაქტულ მეთოდებს, უნდა იყოს გამოცხადებული როგორც abstract.</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 /></div></td><td><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">abstract <span style="color: #000000; font-weight: bold;">class</span> MyBaseClass <span style="color: #009900;">&#123;</span><br />
<br />
&nbsp; &nbsp; abstract <span style="color: #000000; font-weight: bold;">function</span> display<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #009900;">&#125;</span></div></td></tr></tbody></table></div>
<p>14. კლასის როგორც ტიპის მითითება</p>
<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 /></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;">function</span> expectsMyClass<span style="color: #009900;">&#40;</span>MyClass <span style="color: #000088;">$obj</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <span style="color: #009900;">&#125;</span></div></td></tr></tbody></table></div>
<p>16. იტერატორები</p>
<p>PHP 5 საშუალებას გვაძლევს მიმდევრობით მივმართოთ კლასის ელემენტებს froeach() კონსტრუქციის მეშვეობით.</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 /></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;">$obj</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> MyIteratorImplementation<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$obj</span> <span style="color: #b1b100;">as</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: #b1b100;">print</span> <span style="color: #0000ff;">&quot;<span style="color: #006699; font-weight: bold;">$value</span>&quot;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span></div></td></tr></tbody></table></div>
<p>17. __autoload()</p>
<p>მრავალი პროგრამისტი, რომლებიც წერენ ობიექტზე-ორიენტირებულ აპლიკაციებს, ქმნიან ერთ ფაილს, რომელიც შეიცავს კლასის განსაზღვრას. საკმაოდ მოუხერხებელია ყოველი სკრიპტის დასაწყისში ჩასართავი ფაილების გრძელი სიის ჩამოწერა (თითო ფაილი თითო კლასისათვის).<br />
PHP 5 &#8211; ში აღარ არსებობს ამის აუცილებლობა. თქვენ შეგიძლიათ განსაზღვროთ ფუნქცია __autoload(), რომელიც ავტომატურად იქნება გამოძახებული იმ კლასის გამოყენების შემთხვევაში რომელიც არ იყო ჩართული ფაილში მანამდე. აღნიშნული ფუნქციის გამოძახებით, Zend Engine იძლევა საშუალებას ფაილი ჩაიტვირთოს მანამდე, ვიდრე დაგენერირდება შეტყობინება შეცდომეის შესახებ და შეჩერდება სკრიპტის მუშაობა.</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 /></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;">function</span> __autoload<span style="color: #009900;">&#40;</span><span style="color: #000088;">$class_name</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #b1b100;">include_once</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$class_name</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot;php&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #009900;">&#125;</span><br />
<br />
<span style="color: #000088;">$obj</span> &nbsp;<span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> MyClass1<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #000088;">$obj2</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> MyClass2<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p>ენის სხვა ახალი შესაძლებლობები</p>
<p>1.შეცდომების დამუშავება</p>
<p>PHP 5 &#8211; ში დამატებულია შეცდომების დამუშავების დამუშავების ახალი მექანიზმი, try/throw/catch სტრუქტურის შემოტანით. თქვენ მხოლოდ გჭირდებათ ობიექტის შექმნა, რომელიც მემკვიდრეობით მიიღებს შეცდომების დამუშავების კლასს Exception.</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 />19<br />20<br />21<br />22<br />23<br />24<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> SQLException <span style="color: #000000; font-weight: bold;">extends</span> Exception <span style="color: #009900;">&#123;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000088;">$problem</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">function</span> __construct<span style="color: #009900;">&#40;</span><span style="color: #000088;">$problem</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;">problem</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$problem</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
<br />
<span style="color: #009900;">&#125;</span><br />
<br />
try <span style="color: #009900;">&#123;</span><br />
<br />
<span style="color: #339933;">...</span><br />
<br />
&nbsp; &nbsp; throw <span style="color: #000000; font-weight: bold;">new</span> SQLException<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Couldn’t connect to database&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #339933;">...</span><br />
<br />
<span style="color: #009900;">&#125;</span> catch <span style="color: #009900;">&#40;</span>SQLException <span style="color: #000088;">$e</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #b1b100;">print</span> <span style="color: #0000ff;">&quot;Caught an SQLException with problem <span style="color: #006699; font-weight: bold;">$obj-&gt;problem</span>&quot;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span> catch <span style="color: #009900;">&#40;</span>Exception <span style="color: #000088;">$e</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #b1b100;">print</span> <span style="color: #0000ff;">&quot;Caught unrecognized exception&quot;</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #009900;">&#125;</span></div></td></tr></tbody></table></div>
<p>დღეს დღეობით უკუ თავსებადობის მიზნით შიდა ფუნქციების უმეტესობა არ იყენებს შეცდომების დამუშავების აღწერილ მეთოდს. თუმცა, ყველა ახალ გაფართოებას ექნება ასეთი საშუალება, და თქვენ შეგიძლიათ გამოიყენოთ ასეთი კონსტრუქცია თქვენს საწყის კოდებში. გარდა ამისა, უკვე არსებული ფუნქციის set_error_handler() ნაცვლად, თქვენ შეგიძლიათ გამოიყენოთ set_exception_handler(), რათა მოხდეს დაუმუშავებელი შეცდომების დაჭერა მანამდე, სანამ დასრულდება სკრიპტის შესრულება.</p>
<p>2. foreach მისამართით</p>
<p>PHP 4-ში თქვენ არ შეგეძლოდ მასივის იტერაციის დროს გეცვალათ მისი ელემენტების მნიშვნელობები. PHP 5-ში დაშვებული foreach() &#8211; ის შესრულებ, მისმართის აღმნიშვნელის (‘&amp;’) გამოყენებით, ამგვარად, ცვლადის შეცვლისას, თქვენ ცვლით მასივის ელემენტს, რომელზეც ხორციელდება იტერაცია.</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 /></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;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$array</span> <span style="color: #b1b100;">as</span> <span style="color: #339933;">&amp;</span>amp<span style="color: #339933;">;</span><span style="color: #000088;">$value</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
<br />
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$value</span> <span style="color: #339933;">===</span> <span style="color: #0000ff;">&quot;NULL&quot;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
<br />
<span style="color: #000088;">$value</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><br />
<br />
<span style="color: #009900;">&#125;</span></div></td></tr></tbody></table></div>
<p>3. მისამართით გადაცემული პარამეტრების წინასწარ განსაზღვრული მნიშვნელობები</p>
<p>PHP 4-ში მნიშვნელობის წინასწარ განსაზღვრა პარამეტრისათვის შესაძლებელი იყო მხოლოდ იმ შემთხვევაში თუ ის გადაეცემოდა მნიშვნელობით. ამჟამად შესაძლებელია მისამართით გადაცემული პარამეტრებისათვის მნიშვნელობების წინასწარ განსაზღვრა.</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 /></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;">function</span> my_func<span style="color: #009900;">&#40;</span><span style="color: #339933;">&amp;</span>amp<span style="color: #339933;">;</span><span style="color: #000088;">$arg</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 />
<br />
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$arg</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 />
<br />
<span style="color: #b1b100;">print</span> <span style="color: #0000ff;">'$arg is empty'</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #009900;">&#125;</span><br />
<br />
<span style="color: #009900;">&#125;</span>my_func<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p>PHP-ში შესული ძირითადი ცვლილებები<br />
XML და ვებ სერვისები</p>
<p>ენასთან დაკავშირებული ცვლილებების გარდა, XML-თან მუშაობაში შეტანილი ცვლილებები PHP 5-ის ერთ ერთი არსებითი და მნიშვნელოვანი მხარეა. XML-თან სამუშაო ფუნქციონალური საშუალებების გაფართოება PHP 5-ში, ქსელში გამოყენებადი სხვა ენების თანასწორს ხდის მას.<br />
საფუძვლები</p>
<p>XML-ის მხარდაჭერა PHP 4-ში ბაზირებული იყო სხვადასხვა XML ბიბლიოთეკებზე. SAX-ის მხარდაჭერა ხორციელდებოდა Expat-ის ძველი ბიბლიოთეკის მეშვეობით, XSLT-ს გამოსაყენებლად საჭირო იყო Sablotron ბიბლიოთეკა, DOM-თან სამუშაოდ გამოიყენებოდა უფრო მძლავრი libxml2 &#8211; პროექტი GNOME-ს ბიბლიოთეკა.</p>
<p>სხვადასხვა გარეშე ბიბლიოთეკების გამოყენება არ ანიჭებდა არანაირ უპირატესობას PHP 4-ს სხვა ენებთან მიმართებაში როდესაც საქმე ეხებოდა XML-ს მხარდაჭერას. გაფართოებების ბიბლიოთეკების მხარდაჭერა იყო სუსტი, XML-ს ახალი სტანდარტები არ იყო ყოველთვის რეალიზებული, წარმადობა არ იყო იმდენად კარგი რამდენადაც ეს იყო შესაძლებელი, ურთიერთქმედება XML-ს სხვადასხვა გაფართოებებს შორის არ არსებობდა.</p>
<p>PHP 5-ში XML-ს ყველა გაფართოება იყო ხელმეორედ გადაწერილი, რათა გამოყენებული ყოფილიყო libxml2 (http://www.xmlsoft.org/)-ის მიერ წარმოდგენილი ინსტრუმენტების განსხვავებული კრებული. ეს არის შესაძლებლობებით მდიდარი ბიბლიოთეკა, რემელშიც ეფექტურად არის რეალიზებული XML სტანდარტები, რაც საშუალებას აძლევს PHP-ს გამოიყენოს XML ტექნოლოგიის მოწინავე შესაძლებლობები.<br />
ყველა ზემოთ ხსენებული გაფართოებები (SAX, DOM и XSLT) ამჟამად იყენებს libxml2-ს, ისევე როგორც ახალი დამატებით გაფართოებები &#8211; SimpleXML da SOAP.</p>
<p>SAX<br />
როგორც ზემოთ ითქვა, SAX-ის ახალი რეალიზაცია გადაყვანილია Expat-ის გამოყენებიდან libxml2-ზე. თუმცა ახალი გაფართოება უნდა იყოს თავსებადი, შესაძლოა არსებობდეს გარკვეული სხვაობები. დეველოპერები, რომლებსაც სურთ განაგრძონ მუშაობა Expat ბიბლიოთეკასთან, შეუძლიათ, დააკონფიგურირონ PHP შესაბამისი სახით (არ არის რეკომენდირებული).</p>
<p>DOM<br />
თუმცა DOM-ის მხარდაჭერა PHP 4-ში ასევე ეყრდნობოდა libxml2 ბიბლიოთეკას, მასში იყო უამრავი შეცდომა, და აღნიშნული API ხშირ შემთხვევაში არ ესადაგებოდა W3C რეკომენდაციებს. DOM გაფართოება მთლიანად იქნა გადაწერილი PHP 5-სათვის. გარდა ამისა, გაფართოება იყო საფუძველშივე შეცვლილი, ამჟამად იგი შეესაბამება W3C რეკომენდაციებს. მაგალითად, ფუნქციების დასახელებები იყენებენ ნოტაციას studlyCaps (სახელების მინიჭება სხვადასხვა რეგისტრის სიმბოლოების გამოყენებით) როგორც განსაზღვრულია W3C სტანდარტში, რაც ამარტივებს თქვენს მიერ W3C დოკუმენტაციაში წაკითხულის გამოყენებას PHP-ში. გარდა ამისა, DOM გაფართოება მხარს უჭერს XML დოკუმენტის ვალიდაციის სამ სქემას &#8211; DTD, XML Schema და RelaxNG.</p>
<p>ამ ცვლილებების შედეგაც კოდი, დაწერილი PHP 4-ისათვის რომელშიც გამოყენებულია DOM, ყოველთვის არ იმუშავებს PHP 5 ში. თუმცა, მარტივი შესწორება ფუნქციების დასახელებებში ახალი სტანდარტის შესაბამისად ხშირ შემთხვევაში ხსნის პრობლემას.</p>
<p>XSLT<br />
PHP 4-ში, იყო ორი გაფართოება, რომლებიც უზრუნველყოფდნენ XSL-გარდაქმნას. პირველი გაფართოება იყენებდა Sablotron-ს, მეორე XSLT მხარდაჭერას DOM გაფართოებიდან. PHP 5-ში ახალი გაფართოება XSL იყო დაფუძნებული libxml2-ის გამოყენებაზე. მაგალითად PHP 5-ში XSL-გარდაქმნა არ ღებულობს XSLT სტილების ცხრილს პარამეტრის სახით, მაგრამ დამოკიდებულია DOM-ზე, რათა ჩატვირთოს ის. შესაძლებელია სტილების ცხრილის კეშირება მეხსიერებაში, და დასაშვებია მისი გამოყენება მრავალ დოკუმენტთან შესრულების დროის არსებითი ეკონომიისათვის.</p>
<p>SimpleXML<br />
ალბათ, ერთი ან ორი წლის მერე, როდესაც მოვიხედავთ უკან, შევძლებთ ვთქვათ, რომ SimpleXML-მა ძირეულად შეცვალა XML დოკუმენტებთან მუშაობა PHP პროგრამისტებისათვის. SimpleXML-ს მართლაც შეიძლება ვუწოდოთ „XML დამწყებთათვის“. იმის მაგივრად, რომ საქმე გვქონდეს DOM-თან ან, რაც უფრო უარსეია, SAX-თან, SimpleXML საშუალებას გვაძლევს წარმოადგინოთ თქვენი XML დოკუმენტი როგორც PHP-ს მშობლიური ობიექტი. თქვენ შეგიძლიათ წაიკითოთ, ჩაწეროთ ან უბრალოდ გადაურბინოთ თქვენს XML დოკუმენტს და მარტივად მიმართოთ დოკუმენტის ელემენტებსა და ატრიბუტებს.</p>
<p>გადახედეთ შემდეგ XML დოკუმენტს:</p>
<p><strong>კოდი:</strong></p>
<div class="codecolorer-container xml 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="xml codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;clients<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
<br />
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;client<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
<br />
&nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>John Doe<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
<br />
&nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;account_number<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>87234838<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/account_number<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
<br />
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/client<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
<br />
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;client<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
<br />
&nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Janet Smith<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
<br />
&nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;account_number<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>72384329<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/account_number<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
<br />
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/client<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
<br />
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/clients<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></div></td></tr></tbody></table></div>
<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 /></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;">$clients</span> <span style="color: #339933;">=</span> <a href="http://www.php.net/simplexml_load_file"><span style="color: #990000;">simplexml_load_file</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'clients.xml'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$clients</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>client <span style="color: #b1b100;">as</span> <span style="color: #000088;">$client</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
<br />
<span style="color: #b1b100;">print</span> <span style="color: #0000ff;">&quot;<span style="color: #006699; font-weight: bold;">$client</span>-&amp;gt;name has account number <span style="color: #006699; font-weight: bold;">$client</span>-&amp;gt;account_number &quot;</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #009900;">&#125;</span></div></td></tr></tbody></table></div>
<p>როგორც მაგალითიდან ვხედავთ, SimpleXML მართლაც მარტივია.</p>
<p>იმ შემთხვევაში, თუ არის აუცილებლობა იმისა რომ გააკეთოთ ისეთი რამ რაც სცილდებ SimpleXML-ს შესაძლებლობებს, თქვენ შეგიძლიათ გარდაქმნათ თქვენი ობიექტი SimpleXML DOM-ის ხეთ, dom_import_simplexml() ფუნქციის გამოძახებით, შეასრულოთ საჭირო ოპერაციები, და დაუბრუნდეთ კვლავ SimpleXML-ს, simplexml_import_dom() ფუნქციის გამოძახებით. გამომდინარე იქიდან, რომ ორივე გაფართოება რეალიზებულია ერთ XML ბიბლიოთეკაში, მათ შორის გადართვა უკვე სავსებით რეალურია.</p>
<p>SOAP<br />
PHP 4-ში SOAP-ის ოფიციალური მხარდაჭერა არ არსებობდა. საერთოდ, SOAP-ის გამოყენების საჭიროების შემთხვევაში, საჭირო ხდებოდა PEAR (PHP Extension and Application Repository http://pear.php.net/) გამოყენება, მაგრამ რამდენადაც კოდი დაწერილი იყო მთლიანად PHP-თი, აპლიკაციებს არ შეეძლოთ ისე შესრულება როგორც ინტეგრირებულ C-გაფართოებებს. სხვა არსებულმა C გაფართოებებმა ვერ შეძლეს მიეღწიათ სტაბილური ვერსიებისათვის, და ამიტომ არ მოხდა მათი ჩართვა PHP 5-ში.</p>
<p>SOAP-ის მხარდაჭერა PHP 5-ში მთლიანად იქნა გადაწერილი როგორც C გაფართოება და, თუმცა ამჟამად იმყოფება ბეტა ტესტირების უკანასკნელ სტადიაზე, მიღებულ იქნა გადაწყვეტილება მისი ჩართვა სტანდარტულ დისტრიბუტივში, რამდენადაც მასში სავსებით არის რეალიზებული SOAP სტანდარტი.</p>
<p>შემდეგი კოდით ხორციელდება WSDL ფაილში განსაზღვრული SomeFunction() ფუნქციის გამოძახება:</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 /></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;">$client</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> SoapClient<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;some.wsdl&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #000088;">$client</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>SomeFunction<span style="color: #009900;">&#40;</span><span style="color: #000088;">$a</span><span style="color: #339933;">,</span> <span style="color: #000088;">$b</span><span style="color: #339933;">,</span> <span style="color: #000088;">$c</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p>ახალი გაფართოება MySQLi (დახვეწილი MySQL)</p>
<p>PHP 5-ში MySQL AB (http://www.mysql.com/) &#8211; სთვის იყო დაწერილი ახალი გაფართოება MySQL, რომელიც საშუალებას გაძლევთ სრულად გამოიყენოთ MySQL 4.1-ის და უფრო ახალი ვერსიების ფუნქციონალური საშუალებების უპირატესობები. გაფართოების ძველი ვერსიის საპირისპიროდ ახალი გაფართოება გაძლევთ საშუალებას გამოიყენოთ ორივე ინტერფეისი: ფუნქციონალური და ობიექტზე-ორიენტირებული. გაფართოებაში რეალიზებულია რიგი ახალი შესაძლებლობები, მათ შორის ტრანზაქციების კონტროლი, რეპლიკაცია, SSL და მრავალი სხვა&#8230;</p>
<p>გაფართოება SQLite</p>
<p>SQLite-ს (http://www.sqlite.org/) მხარდაჭერა თავდაპირველად დანერგილი იყო PHP 4.3.x ვერსიებში. ეს არის SQL-ის ინტეგრირებული ბიბლიოთეკა, რომელიც არ საჭიროებს SQL-სერვერებს. დასახელების მიუხედავად, SQLite გააჩნია მდიდარი შესაძლებლობები და უზრუნველყოფს ტრანზაქციებს, Sub Selects, Views.</p>
<p>Tidy გაფართოება</p>
<p>PHP 5-ში ასევე უზრუნველყოფილია ძალზედ საჭირო ბიბლიოთეკა Tidy (http://tidy.sf.net/). იგი HTML დოკუმენტის გარჩევის, გასუფთავების და აღდგენის საშუალებას გვაძლევს. Tidy უზრუნველყოფს როგორც ფუნქციონალურ, ასევე ობიექტზე-ორიენტირებულ ინტერფეისს, და მის API-ში გამოიყენება PHP 5-ში არსებული შეცდომების დამუშავების მექანიზმი.</p>
<p>Perl გაფართოება</p>
<p>Perl გაფართოება საშუალებას გაძლევთ გამოიძახოთ Perl-სკრიპტები, გამოიყენოთ Perl ობიექტები და გამოიყენოთ Perl-ის სხვა ფუნქციონალური საშუალებები უშუალოდ PHP კოდიდან. ეს ახალი გაფართოება შეიძლება მოიძიოთ მისამართზე http://pecl.php.net/package/perl..</p>
<p>PHP 5-ის სხვა სიახლეები</p>
<p>მეხსიერების ახალი მენეჯერი</p>
<p>Zend Engine იყენებს მეხსიერების ახალ მენეჯერს. ორი უმთავრესი მისი უპირატესობა: გაუმჯობესებული მხარდაჭერა მრავალნაკადური გარემოსი (განაწილებული ბლოკები აღარ საჭიროებენ ურთიერთ ბლოკირებას) და ის, რომ ყოველი მიმართვის შემდეგ უფრო ეფექტურად თავისუფლდება მეხსიერების ბლოკები. რამდენადაც ეს ეხება ძირითადად ინფრასტრუქტურის ცვლილებას, თქვენ, როგორც საბოლოო მომხმარებელი, ვერ შენიშნავთ ამას.</p>
<p>შეწყვეტილია Windows 95-ის მხარდაჭერა</p>
<p>PHP-ს გაშვება Windows 95 პლატფორმაზე შეუძლებელია, რადგან შეუძლებელია იმ ფუნქციონალური შესაძლებლობების გამოყენება, რომელსაც იყენებს PHP.</p>
<p>დასკვნა</p>
<p>ალბათ შთაბეჭდილება მოახდინა თქვენზე PHP 5-ში განხორციელებულმა ცვლილებების რაოდენობამ. როგორც ზემოთ ითქვა, ეს თავი ვერ შეძლებს ყველა გაუმჯობესების წარმოჩენას, აქ ასახვა ჰპოვა მხოლდ მთავარმა საკითხებმა. წიგნის შემდეგი თავები მოგცემთ საშუალებას ყოველ მხრივ გაეცნოთ ნახსენებ ახალ შესაძლებლობებს და ასევე სხვებს, რომლებიც აქ არ ყოფილა ნახსენები.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.code.ge/posts/whats-new-in-php5/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
