<?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>آموزش وب ،لینوکس و برنامه نویسی</title>
	<atom:link href="/feed/" rel="self" type="application/rss+xml" />
	<link>http://tuts.zanjanlug.org</link>
	<description>آموزش برنامه نویسی،وب و لینوکس</description>
	<lastBuildDate>Thu, 13 Jun 2013 02:21:10 +0000</lastBuildDate>
	<language>fa-IR</language>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.9.2</generator>
	<item>
		<title>اصول برنامه نویسی در PHP</title>
		<link>http://tuts.zanjanlug.org/%d8%a7%d8%b5%d9%88%d9%84-%d8%a8%d8%b1%d9%86%d8%a7%d9%85%d9%87-%d9%86%d9%88%db%8c%d8%b3%db%8c-%d8%af%d8%b1-php/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=%25d8%25a7%25d8%25b5%25d9%2588%25d9%2584-%25d8%25a8%25d8%25b1%25d9%2586%25d8%25a7%25d9%2585%25d9%2587-%25d9%2586%25d9%2588%25db%258c%25d8%25b3%25db%258c-%25d8%25af%25d8%25b1-php</link>
		<comments>http://tuts.zanjanlug.org/%d8%a7%d8%b5%d9%88%d9%84-%d8%a8%d8%b1%d9%86%d8%a7%d9%85%d9%87-%d9%86%d9%88%db%8c%d8%b3%db%8c-%d8%af%d8%b1-php/#comments</comments>
		<pubDate>Thu, 13 Jun 2013 02:17:48 +0000</pubDate>
		<dc:creator><![CDATA[chalist]]></dc:creator>
				<category><![CDATA[برنامه نویسی]]></category>
		<category><![CDATA[پی اچ پی]]></category>
		<category><![CDATA[clean code]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[اصول]]></category>
		<category><![CDATA[کدنویسی]]></category>

		<guid isPermaLink="false">http://tuts.zanjanlug.org/?p=1492</guid>
		<description><![CDATA[پی اچ پی یکی از بهترین و پرکاربردترین زبان های دنیاست که داکیومنت های بسیاری برای آن وجود دارد. اما زبان php مشکلاتی دارد (طبیعی ست که همه ی زبان ها مشکلاتی دارند). مهمترین مشکل PHP این است که سخت &#8230; <a href="/%d8%a7%d8%b5%d9%88%d9%84-%d8%a8%d8%b1%d9%86%d8%a7%d9%85%d9%87-%d9%86%d9%88%db%8c%d8%b3%db%8c-%d8%af%d8%b1-php/"><span class='more-link'>ادامه ی مطلب</span></a>]]></description>
				<content:encoded><![CDATA[<p><a href="/wp-content/uploads/2013/06/clean_code_72_color.png"><img src="/wp-content/uploads/2013/06/clean_code_72_color-150x150.png" alt="clean_code" width="150" height="150" class="alignright size-thumbnail wp-image-1493" /></a>پی اچ پی یکی از بهترین و پرکاربردترین زبان های دنیاست که داکیومنت های بسیاری برای آن وجود دارد. اما زبان php مشکلاتی دارد (طبیعی ست که همه ی زبان ها مشکلاتی دارند).<br />
مهمترین مشکل PHP این است که سخت گیر نیست (برای هر کاری راه های بسیاری وجود دارد) و این باعث می شود که ما اشتباهاتی را مرتکب شویم که در پشت محدودیت های برنامه دیده نمی شود. در حالی که می توانیم با نوشتن کدتمیز (Clean Code) و خوانا از آنها جلوگیری کنیم.</p>
<p>محدودیت یک قانون مطلق است و ما نمی توانیم روی آن خط بکشیم و نادیده بگیریم. اما نکته هایی هست که رعایت کردن آنها باعث می شود تا برنامه هایمان را بهتر توسعه بدهیم که در اینجا به ۲۱ مورد اشاره می کنیم.<span id="more-1492"></span></p>
<p><strong>۱- تابع var_dump دوست شماست</strong><br />
این تابع به شما اجازه می دهد که نوع متغیرها را بفهمید. چون PHP یک زبان داینامیک است بنابراین دیباگ کردنش کمی سخته برای همین این تابع با نشون دادن متغیر ها و نوعشون یه کم دیباگ کردن رو ساده می کنه (هرچند ابزارهای متفاوتی هست برای این کار اما با این حال برعکس زبان هایی مثل #C یا … شما نمی تونید برنامه رو خط به خط اجرا کنید و بفهمید خطا از کجاست)<br />
برای نمایش بهتر هم می تونید از تگ &lt;pre&gt; استفاده کنید.</p>
<p><strong>۲- اندازه گیری زمان</strong><br />
چون زمان اجرای برنامه برای کاربر و خودما (صاحبان سرور)‌مهمه در نتیجه چیزی که باید خیلی بهش اهمیت بدیم (که معمولن نمی دیم) اینه که برنامه در کوتاه ترین زمان ممکن اجرا بشه.<br />
برای این کار میشه از  تابع microtime استفاده کرد.<br />
برای نمونه به این کد دقت کنید:</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php
function showTimeReadable()
{
	$initTime = microtime();
	$initTime = explode(' ', $initTime);
	$initTime = $initTime[1] + $initTime[0];
	return $initTime;
}

$start = showTimeReadable();

for($i=0;$i&lt;10000000;$i++)
{
	//do something
}

$end = showTimeReadable();

$total_time = round(($end - $start), 4);
echo $total_time;
?&gt;
</pre>
<p><strong>۳- استایل خودتون رو رعایت کنید</strong><br />
هر کسی استایل (شیوه ی ) کد زنی خودش رو داره. مشکل وقتی پیش میاد که قراره با چند نفر دیگه روی یه پروژه کار کنیم. حتی بدتر: قراره روی کد کسی کار کنیم که نوشته و رفته و بهش دسترسی ندارم. اینجا مشکلی که پیش میاد اینه که نمی دونم ایشون چطور کدزده و با چه استایلی.<br />
هر کسی یه جوری فکر می کنه. بنابراین وقتی ما یکی از شیوه های کد زنی رو رعایت می کنیم در واقع اولین قدم رو برای رعایت یه کد تمیز برداشتیم. اما دقیقن منظور از شیوه ی کدزدن چیه؟</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php
function test($var1)
{
        if ($var1)
        //Checking if var1 is ok
        {
                echo &quot;Var1 is Ok&quot;;
        }
}
$var2=5;
?&gt;

&lt;?php
function test($var1){
        //Checking if var1 is ok
        if ($var1){
                echo &quot;Var1 is Ok&quot;;
        }
}

$var2 = 5;
?&gt;

</pre>
<p>شاید به نظر شما این بی معنی باشه. ولی قبول کنید که اگر این رو رعایت کنیم قدرت درک و یادگیری مون بالاتر می ره.</p>
<p><strong>۴- اسم گذاری با مفهوم</strong><br />
مرغِ زیر زمینی ِ سنگ خوار ؟<br />
مرد عنکبوتی چیه؟ مردیه که شبیه عنکبوته!!! این سخته؟ طبیعتن نه. اسم توابع و متغیرهامون هم باید مثل همین اسم قابل فهم باشه. وقتی اسم یه تابع رو جایی می بینیم باید از اسمش بفهمیم که کارش چیه و چه خروجی میده. همیشه شما باید از یه اسم متغیر یا تابع سرنخ بگیرید که کارش چیه.<br />
بنابراین از اسم گذاری توابع یا متغیر ها به صورت:</p>
<pre class="brush: php; title: ; notranslate">
“$a” , “$a1″, “$request_result” , “$first_element”
</pre>
<p><strong>۵- درموردش گوگل کنید</strong><br />
این خیلی مهمه. در هر موردی یک بار سرچ کنید. ممکنه فکر کنید که چطوری با یه تابع می شه یه آرایه رو مرتب سازی کرد یا چیزای دیگه. ممکنه ندونید که یه همچین تابعی هست و همین کارو برای شما انجام می ده. حتی ممکنه کسی راه حلی ارائه کرده باشه یا تابعی براش نوشته باشه. با این کار گوگل به شما کمک می کنه که در مورد کاری که می خاید انجام بدید ایده ی بهتری بدید یا ابزار بهتری در اختیارتون بزاره.</p>
<p><strong>۶- بولین ها (Booleans) باید پیچیده باشند؟</strong><br />
اگه قراره از بولین ها استفاده کنید سعی کنید اسم درستی براشون انتخاب کنید. فقط برای مثال به این توجه کنید:</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php
// Good and cleaner way
$enable = false;
if (!$enable)
        echo &quot;Ok&quot;;

// Bad way. This is just if($enable)
$disable = false;
if (!$disable)
        echo 'Not ok';
?&gt;
</pre>
<p><strong>۷- کپی-پیست دشمن برنامه نویسه</strong><br />
گاهی فقط دوخط کد می تونه روزتون رو هدر بده. منظورم این نیست که ما باید هر بار چرخ رو اختراع کنیم و همه ی کد هامون رو خودمون بنویسیم. بلکه منظورم اینه که ما باید از چیزی که توی برنامه مون استفاده می کنیم آگاهی کامل داشته باشیم. شما می تونید هر کدی رو از هر جایی که میخاید کپی کنید و توی برنامه تون استفاده کنید. اما فقط توجه کنید که قراره این کد چی کار بکنه! این حق شماست که نخواید بدونید که وقتی سوار ماشین میشید موتور به چه صورتی کار می کنه، اما اگر یه جایی ماشین خراب شد. انتظار این رو از خودتون نداشته باشید که بتونید اون رو تعمیر کنید.<br />
یه برنامه مثل یه ماشینه. مراقبش باشید و بهش توجه کنید و هیچ وقت اجازه ندید که چیزی که نمی دونید چیه وارد ماشینتون بشه.</p>
<p><strong>۸- Getters and Setters</strong><br />
یک کلاس باید یه سری قواعد رو رعایت بکنه. همون طوری که ما توی شیوه ی کدزدنمون یه سری قوانین رو رعایت می کنیم. مثلن سعی کنید خصوصیات (property) کلاس رو به صورت خصوصی(Private)‌تعریف کنید و براش ستر و گتر بزارید. برای مثال به این کد توجه کنید:</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php
class animal{
        private $owner;
        private $name;

        // Getter
        public function get_name(){
                return $this-&gt;name;
        }

        // Setter
        public function set_name($string){
           $this-&gt;name = $string;
        }
}
?&gt;
</pre>
<p>یعنی وقتی خصوصیتی به نام owner دارید می تونید پرایوتش کنید و برنامه نویس با دیدن این خصوصیت بفهمه که می تونه از get_owner و set_owner استفاده کنه برای دسترسی داشتن بهش.</p>
<p><strong>۹- استثناها (Exceptions) کمک می کنن</strong><br />
اکسپشن ها معمولن چیزای بی خودی به نظر میان و وقتی استفاده می شن که ما بخایم از خطای برنامه مون رو باهاشون برطرف کنیم که خب راه های دیگه ای هم براش هست. اما در واقع اکسپشن ها خیلی از هدر رفتن وقت ما جلوگیری می کنن.<br />
وقتی بخشی از برنامه اشتباهه (که معمولن این اتفاق برای همه می افته) ما باید به کاربر یا به یه برنامه ی دیگه بگیم که چه خطایی رخ داده و چرا این خطا رخ داده پس اکسپشن ها بسیار مفید هستند  و ما باید در تمام برنامه هامون ازشون استفاده کنیم.</p>
<p><strong>۱۰- تقسیم بکن و حکومت کن</strong><br />
بهترین راه برای کنترل یه برنامه اینه که اونو به بخش های کوچیک تبدیل کنید ( جعبه جعبه ) کنید. مثل دستگاه های پرینتر مثلن که هر عضوی برای خودش کار می کنه و وقتی خراب می شه شما لازم نیست که کل دستگاه رو عوض کنید. اون قطعه رو دور می ندازید و یه قطعه ی دیگه جاش می زارید. این قطعات با هم دیگه ارتباط دارن( معمولن از طریق مقداری که بر می گردونن returns).<br />
این تعریف خیلی خلاصه بود اما بهترین چیزیه که می شه گفت. وقتی برنامه نویسی می کنیم باید به جعبه ها توجه کنیم و کار رو به بخش های کوچیک تقسیم کنیم. یه بخش کار خاصی انجام می ده و ما خروجی ش رو می گیریم و می ریزیم تو یه بخش دیگه.<br />
به این کدها توجه کنید. روش غلط:</p>
<pre class="brush: php; title: ; notranslate">

&lt;?php

$int_array = array(1,9,10,12,7,2,8);

echo &quot;We have to order this array&quot; . &quot;&lt;br /&gt;&quot;;
foreach($int_array as $value){
        echo $value . &quot;&lt;br /&gt;&quot;;
}

sort($int_array);

echo &quot;The output is:&quot; . &quot;&lt;br /&gt;&quot;;
foreach($int_array as $value){
        echo $value . &quot;&lt;br /&gt;&quot;;
}
?&gt;

</pre>
<p>روش درست:</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php
$int_array = array(1,9,10,12,7,2,8);

function print_array($array){
        foreach($array as $value){
                echo $value . &quot;&lt;br /&gt;&quot;;
        }
}

echo &quot;We have to order this array&quot; . &quot;&lt;br /&gt;&quot;;
print_array($int_array);

sort($int_array);

echo &quot;The output is:&quot; . &quot;&lt;br /&gt;&quot;;
print_array($int_array);
?&gt;
</pre>
<p>این تقریبن یه مثال احمقانه ست اما به روشنی نشون می ده که می تونیم از چه روشی برای این کار استفاده کنیم. تابعی که تعریف شد به ما کمک می کنه که کدهای کمتری بزنیم و از تکرارهای بی مورد جلوگیری کنیم.</p>
<p><strong>۱۱- کامنت کردن از کدزدن مهم تره</strong><br />
فکر کنید که یه برنامه پیچیده نوشتید با کلی کلاس و فانکشن بدون حتی یه خط کامنت. اگر چند ماه بعد یه برنامه نویس دیگه یا حتی خودتون بخاید برگردید رو همون برنامه و توسعش بدید مسلمن انجامش براتون سخت خواهد بود و زمان زیادی طول می کشه که روی روال بیافتید و دستتون بیاد که چی به چیه که بتونید خطا ها رو برطرف کنید. اینجاست که کامنت ها به دردتون می خورن و بهتون سرنخ می دن که برنامه رو سریع تر و بهتر درک کنید و دیباگ کنید.<br />
در نهایت شما کامنت ها رو می خونید و ازشون سر در میارید اما استفاده کردن از یه سری علائم و کاراکترهای خاص می تونید استفاده کنید تا کدتون استاندارد تر و قابل استفاده تر بشه. مثل @ یا  see@ برای رفرنس دادن به فانکشن دیگه یا return@ برای نمایش مقدار برگشتی تابع و نوعش.<br />
شما می تونید از phpDocumentator استفاده کنید. خوبی این داکیومنتر اینه که می تونید از داکیومنت هاتون خروجی بگیرید با پسوند PDF یا HTML و یا حتی در IDE خودتون می تونید ازشون استفاده های خیلی خوبی بکنید.</p>
<p><strong>۱۲- مستقل باشید</strong><br />
برنامه هاتون باید به صورت جعبه باشه و یه جعبه نمی تونه از پایه های جعبه ها مراقبت کنه. هر بخشی مستقل از کل برنامه باید باشه. بنابراین خود شما باید این کارو انجام بدید.<br />
وقتی ما یه کلاس می نویسیم باید به فکر راهی باشیم که بتونیم بفهمیم کدوم بخشش کار می کنه و چه اتفاقی در کدهامون می افته و اینطوری علاوه بر خودمون می تونم زندگی راحتی برای بقیه ی توسعه دهنده ها فراهم کنیم.<br />
یکی از راه هایی که می تونیم این کار رو انجام بدیم اینه که یه نقشه از خطاهایی که ممکنه در برنامه رخ بده بکشیم و به هر کدوم یه اسم یه آی دی و یک توضیح مناسب انتخاب کنیم. وقتی یه خطایی در برنامه رخ می ده ما کد خطای اون رو نمایش می دیم. علاوه بر این می تونیم توی کامنت هایی که داریم هم در موردش توضیح بدیم.</p>
<p><strong>۱۳- اینترفیس یه نعمته</strong><br />
وقتی یه کلاسی داشته باشید و فانکشن ها  پیام های مرتبط و عالی یی برگردونن شما واقعن خوش شانس هستید. چون اکثر برنامه نویس ها عادت دارن که مقادیر عجیب و غریبی برگردونن و هیچ دلیلی به جز تنبلی نمی تونه علت این کار باشه.<br />
بنابراین وقتی می خواید پیامی نشون بدید یا خطایی برگردونید، به بهترین و تمیزترین راهی فکر کنید که می تونید این کارو انجام بدید.</p>
<p><strong>۱۴- داکیومنت های رسمی تنها داکیومنت های قابل اعتمادن</strong><br />
اینترنت یه منبع بسیار بزرگ و وسیع اطلاعاته، اما در یه بخش خاص و تکنیکی ما باید خیلی مراقب باشیم و به همه اعتماد نکنیم. درو اقع شما وقتی به عملکرد یه تابع شک کردید یا می خواستید تابعی رو یاد بگیرید که خیلی پرکاربرده، بهترین راه اینه که به سایت رسمیش بریم و اونجا دنبال پاسخمون باشیم.</p>
<p><strong>۱۵- استفاده از متغیرها</strong><br />
سعی کنید تا می تونید متغیر های کمتری تعریف کنید. اینکه متغیرهای زیادی داشته باشید باعث می شه گیج بشید. سعی کنید همه ی متغیر ها رو تو یه بخش از برنامه بزارید. اینطوری نباشه که هر جایی از صفحه که می خواید یه متغیر تعریف کنید و بعدن گم کنید که فلان متغیر کجا بود؟!<br />
علاوه بر اینکه باید برای متغیر ها اسم های خوب و معنا داری انتخاب کنید، باید دقت کنید که همه ش دردسترس باشن. این کار باعث می شه که در یک برنامه چن تا متغیر هم اسم نداشته باشید. که اگه داشته باشید کانفلیکت پیش میاد و برنامه تون به مشکل بر می خوره.</p>
<p><strong>۱۶- اهل صله ی رحم باشید :دی</strong><br />
خانواده خوب است. PHP هم یه زبان پدرمادر داره :دی ینی توش می تونید از وراثت استفاده کنید. این توهینه برای PHP که در برنامه های شی گرا از وراثت استفاده نکنید.  چطوری این کارو باید انجام داد؟<br />
این یه نمونه : احمقانه ترین کاری که می شه کرد اینه:</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php
class Person
{
    private $givenName;
    private $age;
}

class Employee
{
    private $givenName;
    private $age;
}
?&gt;
</pre>
<p>ولی می تونید همین رو با وراثت بنویسید که هم قابل فهم باشه و هم اینکه کد اضافی نداشته باشید:</p>
<pre class="brush: php; title: ; notranslate">

&lt;?php
abstract class Person{
    private $givenName;
    private $age;

        // Getters and setters
    public function set_givenName($name){
        $this-&gt;givenName = $name;
    }

    public function get_givenName(){
        return $this-&gt;givenName;
    }

    public function set_age($age){
        $this-&gt;age = $age;
    }

    public function get_age(){
        return $this-&gt;age;
    }

    public function say_hello(){
        echo(&quot;I am &quot;);
        $this-&gt;print_data();
    }

        
        abstract public function print_data();
}

class Employee extends Person{
    private $role;

        // Getters and setters
    public function set_role($r){
        $this-&gt;role = $r;
    }

    public function get_role(){
        return $this-&gt;role;
    }

/*این کلاس شامل همه ی مقدایر خصوصی،‌محافظت شده و عمومی ست */
    public function print_data(){
        echo($this-&gt;getRole().&quot; &quot;.$this-&gt;get_givenName().
		   &quot; and I am &quot; .$this-&gt;get_age() . &quot; years old&quot;);
    }
}
?&gt;
</pre>
<p><strong>۱۷- توابع باید همیشه در کوچیک ترین حالت ممکن باشن</strong><br />
اگر توی برنامه تون تابعی دارید که برای دیدن همش باید اسکرول بکنید باید واقعن به فکر این باشید که این تابع رو کوچیک کنید و به تکه های ریزتر تبدیل کنید.</p>
<p><strong>۱۸- با امکانات خودتون رو خفه نکنید</strong><br />
PHP به شما این اجازه رو می ده که برای شروط یک خطی از { } استفاده نکنید. شما مختارید از اون استفاده کنید یا نه ولی مثل این می مونه که با چاقوی رایگان شکم خودتون رو پاره کنید.<br />
روش غلط :</p>
<pre class="brush: php; title: ; notranslate">

&lt;?php
	if($test == TRUE)
		echo 'This is a one line condition for test';
?&gt;
</pre>
<p>روش درست:</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php
	if($test == TRUE)
	{
			echo 'This is a one line condition for test';
	}
?&gt;
</pre>
<p><strong>۱۹- فریمورک ها می تونن زمان کار رو کاهش بدن</strong><br />
همیشه در تمامی پروژه ها یه سری کارای تکراری رو انجام می دیم که واقعن لزومی به تکرارش نیست. فریم ورک ها به ما کمک می کنن که در وقتمون صرفه جویی کنیم و از زدن کدهای اضافی پرهیز کنیم. علاوه بر اون امکاناتی دارن که خیلی در سرعت کانتریبیوت موثر و مفید هستن.<br />
تعداد زیادی فریم ورک هست که هر کدوم بنا به سیاستی که در قبال توسعه ش دارن امکانات گوناگونی در اختیار ما میگذارن. یکی سرعت خیلی خوبی داره (CI و YII) یکی یادگیریش آسونه (CI و CakePHP) و بعضی هاشون هم بسیار بزرگ و گسترده هستن با کلی کتابخونه و پلاگین(ZF) که بیشتر شبیه یه کتابخونه ی بزرگ هستن تا فریم ورک.<br />
استفاده از فریم ورک ها باعث می شه کارای پیش پا افتاده ای مثل CRUD رو به خودشون بسپریم و کدهای خسته کننده و تکراری نزنیم.</p>
<p><strong>۲۰ – اوصیکم بالریجکس</strong><br />
تقریبن می تونید توی تمام پروژه ها از Regular Expression استفاده کنید. کارهایی که می تونید با ریجکس انجام بدید که واقعن تصورش هم سخته. تقریبن سینتکس راحتی داره و در تمامی زبان های برنامه نویسی و ترمینال لینوکس یا … می تونید از قابلیت هاش استفاده کنید.<br />
در برنامه ها و اپلیکیشن های مختلف می تونید با اندک تغییراتی به راحتی با متن کار کنید. هیچ چیزی نمی تونه در پردازش متن به پای ریجکس برسه. سعی کنید یادش بگیرید چون با هر زبان و هر پروژه ای که کار کنید می تونید از قابلیت هاش استفاده کنید.<br />
علاوه بر اینکه کلی در زمان کدنویسی تون صرفه جویی می کنید می تونید با استفاده از ریجکس کدهای تمیزتری بنویسید.</p>
]]></content:encoded>
			<wfw:commentRss>http://tuts.zanjanlug.org/%d8%a7%d8%b5%d9%88%d9%84-%d8%a8%d8%b1%d9%86%d8%a7%d9%85%d9%87-%d9%86%d9%88%db%8c%d8%b3%db%8c-%d8%af%d8%b1-php/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>نصب و آپدیت سریع در دبیان</title>
		<link>http://tuts.zanjanlug.org/fast-install-and-update-in-debian/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=fast-install-and-update-in-debian</link>
		<comments>http://tuts.zanjanlug.org/fast-install-and-update-in-debian/#comments</comments>
		<pubDate>Wed, 08 May 2013 13:40:33 +0000</pubDate>
		<dc:creator><![CDATA[chalist]]></dc:creator>
				<category><![CDATA[لینوکس]]></category>
		<category><![CDATA[apt-get]]></category>
		<category><![CDATA[install]]></category>
		<category><![CDATA[netselect-apt]]></category>
		<category><![CDATA[source.list]]></category>
		<category><![CDATA[update]]></category>

		<guid isPermaLink="false">http://tuts.zanjanlug.org/?p=1488</guid>
		<description><![CDATA[دوسه روزه توی شرکت دبین ویزی نصب کردم و دارم باهاش سر و کله می زنم راضی ام ازش. همه چیز خیلی خوب و سریعه. تنها مشکلی که باهاش دارم اینه که سرعت نصب یا آپدیت بسته ها خیلی کنده &#8230; <a href="/fast-install-and-update-in-debian/"><span class='more-link'>ادامه ی مطلب</span></a>]]></description>
				<content:encoded><![CDATA[<p><a href="/wp-content/uploads/2013/05/debian.jpg"><img class="alignright size-thumbnail wp-image-1489" alt="debian" src="/wp-content/uploads/2013/05/debian-150x150.jpg" width="150" height="150" /></a>دوسه روزه توی شرکت <a href="http://www.debian.org/releases/stable/" target="_blank">دبین ویزی</a> نصب کردم و دارم باهاش سر و کله می زنم <img src="/wp-includes/images/smilies/icon_smile.gif" alt=":)" class="wp-smiley" /><br />
راضی ام ازش. همه چیز خیلی خوب و سریعه.</p>
<p>تنها مشکلی که باهاش دارم اینه که سرعت نصب یا آپدیت بسته ها خیلی کنده و با اینترنت سرعت بالایی که ما داریم یه کم عجیبه این قضیه. ینی تقریبن ما ۶ مگابایت در ثانیه داریم ولی فقط ۳۰ تا ۴۰ کیلوبایت دانلود می شه!!!<span id="more-1488"></span></p>
<p>و به یه چیز خیلی اصرار دارم و اون اینه که قبل از اینکه از کسی بپرسم اول گوگل کنم :دی</p>
<p>و طبق معمول اصرارم خیلی بی مورد بود و به هیچ نتیجه ای نرسیدم <img src="/wp-includes/images/smilies/icon_biggrin.gif" alt=":D" class="wp-smiley" /><br />
پس رفتم توی سایت <a href="http://superuser.com/questions/592918/how-to-use-axel-or-aria2-for-apt-get" target="_blank">سوپریوزر</a> و سوالم رو اونجا مطرح کردم. یکی از کاربران از سوال کرد که آیا سیستم شـِـیر هستش یا نه که گفتم نه. نفر بعدی پاسخ داد که از یه میرور سریع تر استفاده کن!<br />
و خوب لینک <a href="http://www.debian.org/mirror/list" target="_blank">میرور های دبیان</a> رو گذاشته بود. و پرسیدم که از کجا بفهمم کدوم سریع تره؟</p>
<p>جوابی داده نشد! خودم دوباره سرچ کردم <img src="/wp-includes/images/smilies/icon_smile.gif" alt=":)" class="wp-smiley" /> </p>
<p>چیزی که قطعی می شه در موردش گفت اینه که نزدیک بودن میرور به معنی بالا بودن سرعت نیست (اسمایلی چشم بسته غیب گفتن :دی) در نتیجه طی سرچ ها به یه نرم افزاری رسیدم که خیلی خیلی برام جالب بود. اسم این نرم افزار <strong><a href="http://packages.debian.org/search?keywords=netselect-apt" target="_blank">netselect-apt</a></strong> می باشد نخطه</p>
<p>لازم به ذکره که این نرم افزار فقط برای دبیان هستش و من برای اوبونتو یا سایر دیسترو ها چیزی ندیدم (خیلی هم نگشتم شاید باشه :دی)</p>
<p>به این صورت نصب می شه:</p>
<pre class="brush: bash; title: ; notranslate">
sudo apt-get install netselect-apt
</pre>
<p>بعد از نصب توی ترمینال می زنید:</p>
<pre class="brush: bash; title: ; notranslate">
sudo netselect-apt
</pre>
<p>و صبر می کنید تا تموم بشه:</p>
<pre class="brush: bash; title: ; notranslate">
Using distribution stable.
Retrieving the list of mirrors from www.debian.org...

--2013-05-08 17:57:29--  http://www.debian.org/mirror/mirrors_full
Resolving www.debian.org (www.debian.org)... 130.89.148.14, 5.153.231.4
Connecting to www.debian.org (www.debian.org)|130.89.148.14|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 334962 (327K) 1
Saving to: ‘/tmp/netselect-apt.6NOwAv’

۱۰۰%[=============================&gt;] 334,962     --.-K/s   in 0.03s

2013-05-08 17:57:29 (10.7 MB/s) - ‘/tmp/netselect-apt.6NOwAv’ saved [334962/334962]

Choosing a main Debian mirror using netselect.
netselect: 384 (23 active) nameserver request(s)...
Duplicate address 77.243.184.65 (http://ftp.be.debian.org/debian/, http://mirror.be.gbxs.net/debian/); keeping only under first name.
netselect: 373 (23 active) nameserver request(s)...
Duplicate address 212.36.0.70 (http://debian.spnet.net/debian/, http://ftp.bg.debian.org/debian/); keeping only under first name.
netselect: 367 (23 active) nameserver request(s)...
Duplicate address 24.215.0.24 (http://debian.mirror.rafal.ca/debian/, http://24.215.0.24/debian/); keeping only under first name.
netselect: 363 (23 active) nameserver request(s)...
Duplicate address 195.222.33.229 (http://mirror.debian.com.ba/debian/, http://ftp.ba.debian.org/debian/); keeping only under first name.
</pre>
<p>بعد از تموم شدن اجرای دستور یه فایل در home ساخته می شه به نام source.list</p>
<p>اول از فایل سورسمون یه نسخه ی پشتیبان می گیریم:</p>
<pre class="brush: bash; title: ; notranslate">
sudo mv /etc/apt/source.list /etc/apt/source.list.backup
</pre>
<p>بعد فایلی رو که netselect ساخته رو کپی می کنیم توی etc :</p>
<pre class="brush: bash; title: ; notranslate">
sudo cp /home/user/source.list /etc/apt/source.list
</pre>
<p>سورس لیست رو آپدیت می کنیم:</p>
<pre class="brush: bash; title: ; notranslate">
sudo apt-get update
</pre>
<p>حالا می تونید یه چیزی رو برای تست نصب کنید و از سرعت بالاش لذت ببرید <img src="/wp-includes/images/smilies/icon_smile.gif" alt=":)" class="wp-smiley" /> </p>
]]></content:encoded>
			<wfw:commentRss>http://tuts.zanjanlug.org/fast-install-and-update-in-debian/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>vim یک ادیتور همه کاره</title>
		<link>http://tuts.zanjanlug.org/vim-%db%8c%da%a9-%d8%a7%d8%af%db%8c%d8%aa%d9%88%d8%b1-%d9%87%d9%85%d9%87-%da%a9%d8%a7%d8%b1%d9%87/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=vim-%25db%258c%25da%25a9-%25d8%25a7%25d8%25af%25db%258c%25d8%25aa%25d9%2588%25d8%25b1-%25d9%2587%25d9%2585%25d9%2587-%25da%25a9%25d8%25a7%25d8%25b1%25d9%2587</link>
		<comments>http://tuts.zanjanlug.org/vim-%db%8c%da%a9-%d8%a7%d8%af%db%8c%d8%aa%d9%88%d8%b1-%d9%87%d9%85%d9%87-%da%a9%d8%a7%d8%b1%d9%87/#comments</comments>
		<pubDate>Mon, 17 Sep 2012 11:23:54 +0000</pubDate>
		<dc:creator><![CDATA[chalist]]></dc:creator>
				<category><![CDATA[لینوکس]]></category>
		<category><![CDATA[نرم افزار]]></category>
		<category><![CDATA[texteditor]]></category>
		<category><![CDATA[vim]]></category>
		<category><![CDATA[ادیتور]]></category>

		<guid isPermaLink="false">http://tuts.zanjanlug.org/?p=1466</guid>
		<description><![CDATA[vim یک ادیتور خیلی پیشرفته با امکانات بالاست. برای خیلی ها پیدا کردن یک ادیتور با قابلیت های بالا یه دغدغه ست. ادیتوری که بتونید به راحتی و با سرعت خیلی بالا کاراتون رو باهاش انجام بدید. برای مثال یه &#8230; <a href="/vim-%db%8c%da%a9-%d8%a7%d8%af%db%8c%d8%aa%d9%88%d8%b1-%d9%87%d9%85%d9%87-%da%a9%d8%a7%d8%b1%d9%87/"><span class='more-link'>ادامه ی مطلب</span></a>]]></description>
				<content:encoded><![CDATA[<p><a href="/wp-content/uploads/2012/09/vim-logo.png"><img class="alignright size-thumbnail wp-image-1467" title="vim-logo" src="/wp-content/uploads/2012/09/vim-logo-150x150.png" alt="" width="150" height="150" /></a> <a href="http://www.vim.org">vim</a> یک ادیتور خیلی پیشرفته با امکانات بالاست. برای خیلی ها پیدا کردن یک ادیتور با قابلیت های بالا یه دغدغه ست. ادیتوری که بتونید به راحتی و با سرعت خیلی بالا کاراتون رو باهاش انجام بدید. برای مثال یه فایل sql دارید با ۵۰۰ هزار خط! برای باز کردن این فایل با خیلی از تکست ادیتور ها شما مشکل خواهید داشت. وقتی من این فایل رو با geany باز کردم تقریبن باز نشد چه برسه به اینکه بخام درش تغییراتی بدم. مثلن از خط ۱۵۰ هزار تا ۲۰۰ هزار پاک کنم؟!<span id="more-1466"></span></p>
<div class='hor_line'></div>
<p><strong>نصب vim:</strong>
<div class='h'></div>
<p>برای این کار می شه از vim استفاده کرد. vim یک ادیتور پیشرفته ست (تقریبن vi ی هستش که کامل شده).<br />
vi در تمامی لینوکس ها به صورت پیش فرض نصب می شه اما ممکنه vim نصب نشده باشه(بسته به توزیعی که استفاده می کنید).<br />
vim در تمام سیستم عامل ها قابل نصب هستش. برای دانلود می تونید به نشانی <a href="http://www.vim.org/download.php"> سایت اصلی vim</a> برید.<br />
برای نصب vim از مخازن در توزیع های دبیان بیس می تونید از این دستور استفاده کنید:</p>
<pre class="brush: plain; title: ; notranslate">
apt-get install vim
</pre>
<p>تقریبن تمامی دستورات vi در vim هم کار می کنه اما شما در vi خیلی از امکانات مورد نظرتون رو نخواهد داشت. مثل Auto Complete یا syntax highlighter یا &#8230; برای همین ابتدا vim رو نصب کنید و سپس در خط فرمان بنویسید:</p>
<pre class="brush: plain; title: ; notranslate">
vim
</pre>
<p>ادیتور باز می شه و می تونید شروع کنید به کار.</p>
<p><strong>کار با تب ها:</strong><br />
شما می تونید بنویسید sudo vim و ادیتور رو باز کنید. اما برای باز کردن فایل خاصی می تونید از این دستور استفاده کنید:</p>
<pre class="brush: plain; title: ; notranslate">
vim test.php
</pre>
<p>اگر نام فایل رو وارد نکردید می تونید با زدن این دستور فایل مورد نظر رو باز کنید:</p>
<pre class="brush: bash; title: ; notranslate">
:tabedit [fileurl]
</pre>
<blockquote><p>برای نشون دادن دستورهای موجود (معادل دابل تب در ترمینال) شما می تونید از کلید Ctrl+D استفاده کنید.</p></blockquote>
<p>برای باز کردن یه فایل جدید در یه تب دیگه می تونید از این دستور استفاده کنید:</p>
<pre class="brush: bash; title: ; notranslate">
:tabnew [fileurl]
</pre>
<p>برای حرکت بین تب ها می تونید از gt و gT استفاده کنید. توجه کنید که کلیدها رو پشت سر هم می زنید. ینی کلید g رو می زنید و بعد کلید t یا T رو می زنید.</p>
<p><strong>خروج از یک فایل:</strong><br />
برای خارج شدن از یک فایل از <code>q:</code> استفاده کنید. اگر در فایل تغییراتی دادید و می خاید ذخیره نشه می تونید از q!: استفاده کنید.</p>
<p><strong>ذخیره ی فایل:</strong><br />
برای ذخیره ی فایل می تونید از w: استفاده کنید. برای ذخیره و خروج از wq: و برای اعمال اینکار ها از کلید a استفاده کنید. ینی مثلن برای ذخیره کردن تمامی تب ها و خروج می تونید از wqa: استفاده کنید.</p>
<p><strong>بازگردانی و تکرار (redo و undo):</strong><br />
به جای Ctrl+z می تونید از کلید u استفاده کنید و برای redo از کلید Ctrl+r استفاده کنید.</p>
<p><strong>نوشتن در فایل:</strong><br />
برای وارد شدن به حالت نوشتاری می تونید کلید i یا a رو بزنید. فرقشون اینه که اولی قبل از نشانگر شروع می کنه به تایپ و دومی بعد از نشانگر<br />
با کلید o یا O می تونید در هر سطری که هستید به سطر بعد یا قبل برید و در حالت نوشتار قرار بگیرید.</p>
<p><strong>کپی &#8211; پیست :</strong><br />
برای کپی کردن یه خط می تونید از کلید yy استفاده کنید و برای پیست کردن از کلید p استفاده کنید.<br />
اگر بخواید یه بخشی از یک خط رو کپی کنید باید به این صورت عمل کنید:<br />
ابتدا کرسر رو می برید به ابتدای محلی که کپی می خاید بکنید. بعد کلید v رو می زنید و وارد حالت visual می شید و با کلید های جلو و عقب مقداری رو که می خاید سلکت می کنید و بعد کلید y رو می زنید. بعد هر جایی خواستید پیست کنید کلید p رو می زنید.</p>
<p>برای کپی کردن ۱۰ خط از محل فعلی به این صورت عمل کنید:</p>
<pre class="brush: bash; title: ; notranslate">
y10y
</pre>
<p>اگر می خاید از خط ۱۰ تا ۳۰ رو کپی کنید می تونید به خط ۱۰ برید و به این روش عمل کنید:</p>
<pre class="brush: bash; title: ; notranslate">
y30G
</pre>
<blockquote><p>به حروف کوچیک و بزرگ دقت کنید</p></blockquote>
<p><strong>حرکت در صفحه:</strong><br />
برای رفتن به خط ۳۰ کافیه به اینکارو بکنید:</p>
<pre class="brush: bash; title: ; notranslate">
۳۰G
</pre>
<p>برای اسکرول تاپ از Ctrl+y و برای اسکرول دان از Ctrl+e استفاده کنید</p>
<p><strong>پاک کردن:</strong><br />
برای پاک کردن یک کاراکتر می تونید از کلید x یا X استفاده کنید. فرقشون اینه که یکی قبل از نشانگر رو پاک می کنه و یکی بعد از نشانگر رو.<br />
برای پاک کردن یک خط کافیه از dd استفاده کنید.</p>
<p>حالا می خاید از محل نشانگر ۱۰ خط رو پاک کنید. چیکار باید بکنید؟</p>
<pre class="brush: bash; title: ; notranslate">
d10d
</pre>
<p>حالا برای پاک کردن خط ۱۰ تا ۵۰ چه می کنید؟</p>
<pre class="brush: bash; title: ; notranslate">
d50G
</pre>
<p>فکر می کنم کم کم متوجه شدید که از G به عنوان اشاره به شماره ی خط استفاده می شه در تمامی دستورات vim.</p>
<p><strong>جستجو:</strong><br />
برای جستجو در فایل می تونید از / استفاده کنید و برای رفتن به نتیجه ی بعدی از کلید  n یا N استفاده کنید.<br />
می خاید به جای test از test1 استفاده کنید و همه ی testها رو به test1 تبدیل کنید. برای replace می تونید اینطوری عمل کنید:</p>
<pre class="brush: bash; title: ; notranslate">
%s/test/test1/g
</pre>
<p>توجه کنید که می تونید به جای / از @ یا | یا علامت های دیگه استفاده کنید ولی دقت کنید که هر سه تاش باید یکی باشن<br />
ینی میتونید دستور بالا رو به این صورت هم بنویسید:</p>
<pre class="brush: bash; title: ; notranslate">
%s@test@test1@g
</pre>
<p>یا به این صورت:</p>
<pre class="brush: bash; title: ; notranslate">
%s|test|test1|g
</pre>
<p>دستورات vim خیلی بیشتر و کامل تر از این حرف هاست و ما سعی می کنیم در بخش های بعدی هم یه سری دستورات دیگه رو آماده کنیم براتون. ولی خودتون خیلی راحت می تونید با یه سرچ به نتیجه برسید.</p>
<p>احتمالن در ابتدا برای هایلایت کردن و تب ایندنت دچار مشکل بشید. برای همین یه سری تنظیمات ساده رو بهتون می گم که باید در شاخه ی home در فایل .vimrc اضافه کنید:</p>
<pre class="brush: bash; title: ; notranslate">

syntax on
set cindent
set smartindent
set autoindent
set noexpandtab
set tabstop=4
set shiftwidth=4
set number
set pastetoggle=&lt;F2&gt;

syntax enable

set background=dark
colorscheme default

filetype on

</pre>
<p>شاید تنها بخشی که نیاز به توضیح داشته باشه pastetoggle هستش. در vim وقتی چن خط رو از جای دیگه کپی و پیست می کنید هر خط به اندازه ی خط قبلی تب می خوره و جلو می ره و کدتون به هم می ریزه. برای همین وقتی می خواید از جای دیگه paste کنید می تونید کلید F2 رو بزنید و بعد paste کنید تا کدتون نیاز به ویرایش زیادی نداشته باشه.</p>
<p>بازم اگه سوالی داشتید میتونید زیر همین بخش بپرسید و تا بتونم جواب می دم بهتون.</p>
<p>دوستان خوبمون در سایت لینوکس ریویو هم یه پست خوب در این مورد دارن:</p>
<li><a href="http://linuxreview.ir/1391/02/vi-editor-using-guide/">آموزش vi</a></li>
<p>
همچنین برای اطلاعات بیشتر می تونید به این صفحات می تونید مراجعه کنید :</p>
<blockquote>
<p>http://www.worldtimzone.com/res/vi.html</p>
<p>http://www.tuxfiles.org/linuxhelp/vimcheat.html</p>
</blockquote>
<p>همچنین ویکی خود سایت vim </p>
<blockquote><p>http://vim.wikia.com/wiki/Vim_Tips_Wiki</p></blockquote>
<p>موفق باشید</p>
]]></content:encoded>
			<wfw:commentRss>http://tuts.zanjanlug.org/vim-%db%8c%da%a9-%d8%a7%d8%af%db%8c%d8%aa%d9%88%d8%b1-%d9%87%d9%85%d9%87-%da%a9%d8%a7%d8%b1%d9%87/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>آموزش yii &#8211; بخش اول</title>
		<link>http://tuts.zanjanlug.org/%d8%a2%d9%85%d9%88%d8%b2%d8%b4-yii-%d8%a8%d8%ae%d8%b4-%d8%a7%d9%88%d9%84/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=%25d8%25a2%25d9%2585%25d9%2588%25d8%25b2%25d8%25b4-yii-%25d8%25a8%25d8%25ae%25d8%25b4-%25d8%25a7%25d9%2588%25d9%2584</link>
		<comments>http://tuts.zanjanlug.org/%d8%a2%d9%85%d9%88%d8%b2%d8%b4-yii-%d8%a8%d8%ae%d8%b4-%d8%a7%d9%88%d9%84/#comments</comments>
		<pubDate>Mon, 17 Sep 2012 10:35:13 +0000</pubDate>
		<dc:creator><![CDATA[chalist]]></dc:creator>
				<category><![CDATA[yii]]></category>
		<category><![CDATA[برنامه نویسی]]></category>
		<category><![CDATA[پی اچ پی]]></category>
		<category><![CDATA[آموزش yii]]></category>
		<category><![CDATA[فریم ورک]]></category>

		<guid isPermaLink="false">http://tuts.zanjanlug.org/?p=1448</guid>
		<description><![CDATA[زنجان لاگ تصمیم گرفت یه فریم ورکی رو انتخاب کنه که بچه ها دورهم یاد بگیرن. بعد از بررسی ها به این نتیجه رسیدیم که فریم ورک yii خوب است. بررسی هامون نشون می داد که yii همیشه در بنچ &#8230; <a href="/%d8%a2%d9%85%d9%88%d8%b2%d8%b4-yii-%d8%a8%d8%ae%d8%b4-%d8%a7%d9%88%d9%84/"><span class='more-link'>ادامه ی مطلب</span></a>]]></description>
				<content:encoded><![CDATA[<p><a href="/wp-content/uploads/2012/09/yii.png"><img class="alignright size-full wp-image-1449" title="yii" src="/wp-content/uploads/2012/09/yii.png" alt="" width="150" height="150" /></a>زنجان لاگ تصمیم گرفت یه فریم ورکی رو انتخاب کنه که بچه ها دورهم یاد بگیرن. بعد از بررسی ها به این نتیجه رسیدیم که فریم ورک yii خوب است. بررسی هامون نشون می داد که yii همیشه در بنچ مارک هایی که در سایت های مختلف دیده می شد جزو سه تای اول بود و یه بررسی کوچولو در مورد امکاناتش ما رو بر اون داشت که هرچه سریع تر آموزشش رو شروع کنیم و هر کاری می کنیم مستند کنیم! (باشد که رستگار شویم مثلن)<span id="more-1448"></span></p>
<p>داکیومنت ها خیلی خودمونی و عامیانه نوشته می شن.</p>
<p><strong>فرق فریم ورک و کتابخانه</strong></p>
<p>در فریم ورک ها خیلی از کارها رو از قبل برامون انجام دادن و کافیه تنها با فراخوانی اون امکانات و کاستومایز کردن اونها به راحتی می تونیم ازشون استفاده کنیم.</p>
<p>کتابخانه ها در واقع یه سری از توابع آماده هستن. مجموعه ای از ابزار های آماده که به هر نحوی بخواید می تونید از اونها استفاده کنید.</p>
<p>در کتابخانه ها شما هیچ محدودیتی ندارید و هر طوری بخواید می تونید باهاشون کار کنید. اما در فریم ورک ها برای شما یه سری قوانین تعریف می شه که باید ازشون استفاده کنید. مثل ساختار فایل ها و اسم گذاری توابع و …</p>
<p><strong>چرا yii ؟</strong></p>
<p>فریم ورک های زیادی برای کار هستند مثل cakephp و zend و … اما فریم ورک yii به خاطر بنچمارک های خوبی که داره و امکاناتی که در نظر گرفته شده انتخاب شده.</p>
<p><strong>روش نصب:</strong></p>
<p>در فولدر www فایل های فریم ورک yii رو اکسترکت می کنیم و شاخه رو به نام yii_education تغییر می دیم. برای اکسترکت کردن می تونید از دستور:</p>
<pre class="brush: plain; title: ; notranslate">

tar -zxvf [filename.tar.gz]

</pre>
<p>پس از این کار یه لینک می سازیم برای اینکه بعد ها وقتی خواستیم فریم ورک رو آپگرید بکنیم مشکلی در تغییر نام فولدرها نداشته باشیم و به راحتی آپگرید کنیم. برای این کار می تونید از این دستور استفاده کنید:</p>
<pre class="brush: plain; title: ; notranslate">

ln -s [foldername] yii

</pre>
<p>درواقع شاخه ی فریم ورک از شاخه ی پروژه ی ما جداست.</p>
<p><strong>موارد مورد نیاز برای کار با yii</strong></p>
<p>برای اینکه ببینید پیش نیازهای مورد نیاز برای کار با yii رو نصب دارید می تونید به آدرس زیر برید:</p>
<pre class="brush: plain; title: ; notranslate">

http://127.0.0.1/yii/requirements/

</pre>
<p><a href="/wp-content/uploads/2012/09/Selection_021.png"><img class="alignnone size-full wp-image-1455" title="Selection_021" src="/wp-content/uploads/2012/09/Selection_021.png" alt="" width="831" height="504" /></a></p>
<p>اگر این صفحه ی بالا رو می بینید ینی اینکه بدون مشکل می تونید باهاش کار کنید.</p>
<p><strong>ساختن پروژه:</strong><br />
برای ساختن پروژه می تونید دستور زیر رو توی ترمینال اجرا کنید:</p>
<pre class="brush: plain; title: ; notranslate">

yii/framework/yiic webapp yii_education

</pre>
<p>با این دستور با استفاده از کتابخونه های اصلی در شاخه ی yii ما یه پروژه ی جدید ساختیم به نام yii_education .<br />
وقتی دستور رو اجرا می کنید ازتون یه سوال می پرسه که می تونید با زدن yes پروژه رو به طور کامل بسازید.</p>
<p>ممکنه در برخی از سیستم ها خطای تابع date رو ببینید که با اضافه کردن یه خط در فایل index.php در شاخه ی yii_education این مشکل رو برطرف کنید:</p>
<pre class="brush: plain; title: ; notranslate">

date_default_timezone_set('Asia/Tehran'); 

</pre>
<p><strong>ساختار yii:</strong></p>
<p>controller در واقع بخش اصلی کار ما محسوب می شن. همه چیزبه کنترلر هدایت می شه و در کنترلر تصمیم گرفته می شه که چی کار باید کرد.<br />
اگر قرار باشه از کنترلر به دیتابیس وصل بشیم و نیاز به گرفتن اطلاعات داشته باشیم با مmodel ارتباط برقرار می کنیم و برای نمایش اون اطلاعات از view استفاده می کنیم.</p>
<p><a href="/wp-content/uploads/2012/09/Selection_022.png"><img src="/wp-content/uploads/2012/09/Selection_022.png" alt="" title="Selection_022" width="626" height="514" class="alignnone size-full wp-image-1457" /></a></p>
<p>بر خلاف خیلی از فریم ورک ها که MVC رو به طور کامل پیاده سازی نکردن yii در این بخش خیلی خوب عمل کرده. در برخی از بخش ها ما حتی نیازی به کار با کنترولر نداریم و خود view به راحتی با model ارتباط برقرار می کنه و اطلاعات مورد نیاز رو که نیازی نیست در موردشون تصمیم گیری بشه نمایش می ده و عملن با این کار سرعت برنامه هم بیشتر می شه.</p>
<p><strong>ساختار شاخه های yii :</strong></p>
<p><a href="/wp-content/uploads/2012/09/Selection_024.png"><img src="/wp-content/uploads/2012/09/Selection_024.png" alt="" title="Selection_024" width="453" height="273" class="alignnone size-full wp-image-1458" /></a></p>
<p><strong>assets</strong>: هر اسکریپتی (جاوااسکریپت یا سی اس اس ها) که متعلق به widget ها هستن بخشی از اونها داخل این شاخه قرار می گیره.</p>
<p><strong>css</strong> : سی اس اس ها (اختیاری)</p>
<p><strong>images</strong> : عکس های پروژه (اختیاری)</p>
<p><strong>protected</strong> : اسکلت اصلی برنامه</p>
<p><strong>themes</strong> : قالب هایی که برای سایت طراحی می کنیم داخل این شاخه قرار می گیره.<br />
<strong>index.php</strong> : فایل صفحه ی اصلی که اجرا می شه</p>
<p><strong>index-test.php</strong> : فایل ایندکس برای تست کردن</p>
<p><strong>ساختن دیتابیس:</strong><br />
یه دیتابیس به نام yii_education می سازیم و داخلش یه جدول به نام tbl_news می سازیم با این ساختار:</p>
<pre class="brush: sql; title: ; notranslate">
--
-- Table structure for table `tbl_news`
--

CREATE TABLE IF NOT EXISTS `tbl_news` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` varchar(300) COLLATE utf8_persian_ci NOT NULL,
  `content` longtext COLLATE utf8_persian_ci NOT NULL,
  `post_date` datetime NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_persian_ci AUTO_INCREMENT=1 ;
</pre>
<p>فایل main.php رو در شاخه ی protected > config باز کنید و در خط ۵۵ این بخش رو uncomment کنید و اطلاعات مربوط به ارتباط با دیتابیس رو اضافه کنید:</p>
<pre class="brush: plain; title: ; notranslate">
'db'=&gt;array( 
	 'connectionString' =&gt; 'mysql:host=localhost;dbname=yii_education', 
	'emulatePrepare' =&gt; true, 
	'username' =&gt; 'root', 
	'password' =&gt; '123456', 
	'charset' =&gt; 'utf8', 
	'tablePrefix' =&gt; 'tbl_', 
),
</pre>
<p>و در خط ۲۱ در بخش ماژول این بخش رو هم از کامنت خارج کنید:</p>
<pre class="brush: plain; title: ; notranslate">
'gii'=&gt;array( 
         'class'=&gt;'system.gii.GiiModule', 
         'password'=&gt;'123456', 
         // If removed, Gii defaults to localhost only. Edit carefully to taste. 
         'ipFilters'=&gt;array('127.0.0.1','::1'), 
      ), 

</pre>
<p><strong>تولید کدها با yii code generator :</strong></p>
<p>در مرورگر به آدرس زیر برید:</p>
<pre class="brush: plain; title: ; notranslate">

http://127.0.0.1/yii_education/index.php?r=gii

</pre>
<p>پسوردی رو که در بخش ماژول ها ساختید بزنید و وارد بخش ساخت کدها بشید.<br />
<a href="/wp-content/uploads/2012/09/Selection_025.png"><img src="/wp-content/uploads/2012/09/Selection_025.png" alt="" title="Selection_025" width="930" height="484" class="alignnone size-full wp-image-1460" /></a></p>
<p>به بخش  Model Genetator برید و نام جدول رو کامل بنویسید و Preview رو بزنید.<br />
توجه کنید که فعلن چون روی لوکال هاست کار می کنیم مجوز دسترسی همه ی فایل ها رو ۷۷۷ می کنیم تا yii بتونه فایل هاش رو بسازه.</p>
<p>بعد از پریویو کلید generate رو می زنید و بعد به بخش  Crud Generator می رید و دوباره crud رو با همون روش قبلی بسازید.</p>
<p><a href="/wp-content/uploads/2012/09/Selection_026.png"><img src="/wp-content/uploads/2012/09/Selection_026.png" alt="" title="Selection_026" width="657" height="155" class="alignnone size-full wp-image-1461" /></a></p>
<p>روی لینک try it now کلیک کنید. باید برای لاگین کردن یوزر admin و password رو هم admin وارد کنید و از اپلیکیشن کوچیکی که ساختید لذت ببرید.</p>
<p>برای جلسه ی بعد روی جدول users کار می کنیم و یه بخش لاگین و مدیریت بخش کاربری می نویسم برای سایتمون.<br />
به مرور کم کم این سایت رو تبدیل می کنیم به یه سایت خبری کوچیک.</p>
]]></content:encoded>
			<wfw:commentRss>http://tuts.zanjanlug.org/%d8%a2%d9%85%d9%88%d8%b2%d8%b4-yii-%d8%a8%d8%ae%d8%b4-%d8%a7%d9%88%d9%84/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Nodejs</title>
		<link>http://tuts.zanjanlug.org/nodejs/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=nodejs</link>
		<comments>http://tuts.zanjanlug.org/nodejs/#comments</comments>
		<pubDate>Wed, 12 Sep 2012 16:36:38 +0000</pubDate>
		<dc:creator><![CDATA[efazati]]></dc:creator>
				<category><![CDATA[جاوااسکریپت]]></category>
		<category><![CDATA[enginx]]></category>
		<category><![CDATA[node.js]]></category>
		<category><![CDATA[برنامه نویسی]]></category>

		<guid isPermaLink="false">http://tuts.zanjanlug.org/?p=1433</guid>
		<description><![CDATA[در معرفی Nginx توضیح دادم که event-driven, non-blocking یعنی چه&#8230; ساختاری که با event که همان درخواست هست جوابگوی درخواست ها هست. اجرای کد های جاوا اسکریپت در پروژه هایی همچون CommonJs دیده شده بود ولی با اینکه javaScript زبانی &#8230; <a href="/nodejs/"><span class='more-link'>ادامه ی مطلب</span></a>]]></description>
				<content:encoded><![CDATA[<p><a href="/wp-content/uploads/2012/09/nodejs.png"><img class="alignright size-full wp-image-1434" title="nodejs" src="/wp-content/uploads/2012/09/nodejs.png" alt="" width="150" height="150" /></a>در<a href="http://efazati.blog.ir/post/Nginx"> معرفی Nginx</a> توضیح دادم که event-driven, non-blocking یعنی چه&#8230; ساختاری که با event که همان درخواست هست جوابگوی درخواست ها هست.<br />
اجرای کد های جاوا اسکریپت در پروژه هایی همچون <a href="http://commonjs.org/">CommonJs</a> دیده شده بود ولی با اینکه javaScript زبانی مجزا از مرورگر بود (با اینکه به مدیریت نت اسکیپ طراحی شد ولی <span id="more-1433"></span> کاملا مجزا بود ولی با دادن LiveScript توسط netscape یا jScript توسط IE خیلی به عنوان زبانی که فقط برای مرورگر است دیده شده است) کمی غریب دیده میشدند. ایده کلی این بود که جاوا اسکریپت مختص مرورگر نیست.</p>
<p><a href="http://www.nodejs.org/">Nodejs</a> در حقیقت با استفاده از <a href="http://code.google.com/p/v8/">V8</a> که engine مربوط به chrome است کار می کند.<input id="read_more" style="display: none;" type="button" alt="ادامه مطلب" /></p>
<p><a href="http://www.nodejs.org/">Nodejs</a> پلتفرمی است بر مبنای <a href="http://code.google.com/p/v8">موتور جاوا اسکریپت کروم</a> که به منظور ایجاد برنامه های سریع و گسترش پذیر به وجود آمده است. <a href="http://www.nodejs.org/">Nodejs</a> از مدل رویدادگرا و non-blocking برای انجام عملیات I/O بهره می برد. از این‌رو <a href="http://www.nodejs.org/">Nodejs</a> یک پلتفرم سبک و کارا برای پیاده سازی برنامه های Real-time و مبتنی بر داده است که می توانند به راحتی در سرورهای نامتمرکز اجرا شوند.</p>
<p><strong>طریقه نصب:</strong><br />
در کل در اکثر دیسترو ها package مربوطه وجود دارد و خیلی راحت می توانید نصب کنید. به طور مثال در Archlinux اینگونه خواهد بود:</p>
<pre class="brush: plain; title: ; notranslate">
efazati@KaraOS ~ % sudo pacman -S nodejs

resolving dependencies...
looking for inter-conflicts...

Targets (1): nodejs-0.6.14-1

Total Download Size:    2.79 MiB
Total Installed Size:   14.21 MiB

Proceed with installation? [Y/n]
:: Retrieving packages from community...
 nodejs-0.6.14-1-x86_64                         2.8 MiB  42.5K/s 01:07 [##...##] 100%
(1/1) checking package integrity                                       [##...##] 100%
(1/1) loading package files                                            [##...##] 100%
(1/1) checking for file conflicts                                      [##...##] 100%
(1/1) checking available disk space                                    [##...##] 100%
(1/1) installing nodejs                                                [##...##] 100%
Optional dependencies for nodejs
    openssl: TLS support
</pre>
<p>به طور مثال شما با کد زیر می توانید <a href="http://www.nodejs.org/">Nodejs</a> را راه اندازی کنید و به همه درخواست Hello To Efazati Blog بگویید:</p>
<pre class="brush: plain; title: ; notranslate">
var http = require('http');
http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello To Efazati Blogn');
}).listen(1337, '127.0.0.1');
console.log(‘Server running at http://127.0.0.1:1337/’);
</pre>
<p>کافی است در یک فایل مثلا test.js بگذارید و با دستور زیر اجرایش کنید:</p>
<pre class="brush: plain; title: ; notranslate">
node example.js
Server running at http://127.0.0.1:1337
</pre>
<p>حالا صفحه شما اجرا می شود<br />
شما توانستید اولی برنامه <a href="http://www.nodejs.org/">Nodejs</a>خودتون را بنویسید.</p>
<p><strong>NPM:</strong></p>
<p><a href="http://www.nodejs.org/">Nodejs</a> به علت جذابیت هایی که دارد طرفدارن زیادی را جذب کرده و همین باعث شد کلا کد های زیادی با node نوشته شود. یکی از نتایج این قضیه ساخت یک package manager است که با استفاده از آن می توانید برنامه هایی که توسط node نوشته است را پیدا کرده و نصب کنید.</p>
<p>اسم این package manger خوب <a href="http://npmjs.org/">Npm</a> است.</p>
<p>به طور مثال package بسیار جالب mysql رو با هم نصب می کنیم</p>
<pre class="brush: plain; title: ; notranslate">
npm install mysql
</pre>
<p>بعد از نصب یک فایل mysql.js درست کنیم و کد زیر را بزنیم:</p>
<pre class="brush: plain; title: ; notranslate">

&lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;mysql&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'mysql'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;TEST_DATABASE&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;nodejs_mysql_test'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;TEST_TABLE&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'test'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;client&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;mysql&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;createClient&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;({&lt;/span&gt;
  &lt;span class=&quot;nx&quot;&gt;user&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'root'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;nx&quot;&gt;password&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'root'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;});&lt;/span&gt;
 
&lt;span class=&quot;nx&quot;&gt;client&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;query&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'CREATE DATABASE '&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;TEST_DATABASE&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;err&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;err&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;err&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;number&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;mysql&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;ERROR_DB_CREATE_EXISTS&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;throw&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;err&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;});&lt;/span&gt;
 
&lt;span class=&quot;c1&quot;&gt;// If no callback is provided, any errors will be emitted as `'error'`&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;// events by the client&lt;/span&gt;
&lt;span class=&quot;nx&quot;&gt;client&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;query&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'USE '&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;TEST_DATABASE&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
 
&lt;span class=&quot;nx&quot;&gt;client&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;query&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
  &lt;span class=&quot;s1&quot;&gt;'INSERT INTO '&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;TEST_TABLE&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;' '&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;
  &lt;span class=&quot;s1&quot;&gt;'SET title = ?, text = ?, created = ?'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'super cool'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'this is a nice text'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'2010-08-16 10:00:23'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
 
&lt;span class=&quot;nx&quot;&gt;client&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;query&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
  &lt;span class=&quot;s1&quot;&gt;'SELECT * FROM '&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;TEST_TABLE&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;selectCb&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;err&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;results&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;fields&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;err&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;k&quot;&gt;throw&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;err&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
 
    &lt;span class=&quot;nx&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;results&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;fields&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;client&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;end&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

</pre>
<p><strong>بعضی کتابخانه های استاندارد Node:</strong></p>
<li><a href="http://www.nodejs.org/api/synopsis.html">Synopsis</a></li>
<li><a href="http://www.nodejs.org/api/globals.html">Globals</a></li>
<li><a href="http://www.nodejs.org/api/stdio.html">STDIO</a></li>
<li><a href="http://www.nodejs.org/api/timers.html">Timers</a></li>
<li><a href="http://www.nodejs.org/api/modules.html">Modules</a></li>
<li><a href="http://www.nodejs.org/api/addons.html">C/C++ Addons</a></li>
<li><a href="http://www.nodejs.org/api/process.html">Process</a></li>
<li><a href="http://www.nodejs.org/api/util.html">Utilities</a></li>
<li><a href="http://www.nodejs.org/api/events.html">Events</a></li>
<li><a href="http://www.nodejs.org/api/buffer.html">Buffer</a></li>
<li><a href="http://www.nodejs.org/api/stream.html">Stream</a></li>
<li><a href="http://www.nodejs.org/api/crypto.html">Crypto</a></li>
<li><a href="http://www.nodejs.org/api/tls.html">TLS/SSL</a></li>
<li><a href="http://www.nodejs.org/api/string_decoder.html">String Decoder</a></li>
<li><a href="http://www.nodejs.org/api/fs.html">File System</a></li>
<li><a href="http://www.nodejs.org/api/path.html">Path</a></li>
<li><a href="http://www.nodejs.org/api/net.html">Net</a></li>
<li><a href="http://www.nodejs.org/api/dgram.html">UDP/Datagram</a></li>
<li><a href="http://www.nodejs.org/api/dns.html">DNS</a></li>
<li><a href="http://www.nodejs.org/api/http.html">HTTP</a></li>
<li><a href="http://www.nodejs.org/api/https.html">HTTPS</a></li>
<li><a href="http://www.nodejs.org/api/url.html">URL</a></li>
<li><a href="http://www.nodejs.org/api/querystring.html">Query Strings</a></li>
<li><a href="http://www.nodejs.org/api/readline.html">Readline</a></li>
<li><a href="http://www.nodejs.org/api/repl.html">REPL</a></li>
<li><a href="http://www.nodejs.org/api/vm.html">VM</a></li>
<li><a href="http://www.nodejs.org/api/child_process.html">Child Processes</a></li>
<li><a href="http://www.nodejs.org/api/assert.html">Assertion Testing</a></li>
<li><a href="http://www.nodejs.org/api/tty.html">TTY</a></li>
<li><a href="http://www.nodejs.org/api/zlib.html">ZLIB</a></li>
<li><a href="http://www.nodejs.org/api/os.html">OS</a></li>
<li><a href="http://www.nodejs.org/api/debugger.html">Debugger</a></li>
<li><a href="http://www.nodejs.org/api/cluster.html">Cluster</a></li>
<p><strong>همچنین ببینید:</strong></p>
<blockquote dir='ltr'><p>node.js  <a href="http://www.nodejs.org/">http://www.nodejs.org/</a><br />
node.js کاربران ایرانی nodejs -> <a href="http://nodejs.ir/">http://nodejs.ir/</a><br />
The Node Beginner Book » A comprehensive Node.js tutorial -> <a href="http://www.nodebeginner.org/">http://www.nodebeginner.org/</a><br />
node node -> <a href="http://nodenode.com/">http://nodenode.com/</a><br />
nodejs-fa | Google Groups -> h<a href="http://ttp://groups.google.com/group/nodejs-fa?pli=1">ttp://groups.google.com/group/nodejs-fa?pli=1</a><br />
Streaming file uploads with node.js » Debuggable &#8211; Node.js Consulting -> <a href="http://debuggable.com/posts/streaming-file-uploads-with-node-js:4ac094b2-b6c8-4a7f-bd07-28accbdd56cb">http://debuggable.com/posts/streaming-file-uploads-with-node-js:4ac094b2-b6c8-4a7f-bd07-28accbdd56cb</a></p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://tuts.zanjanlug.org/nodejs/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>مثالهایی کاربردی از دستور cURL</title>
		<link>http://tuts.zanjanlug.org/%d9%85%d8%ab%d8%a7%d9%84%d9%87%d8%a7%db%8c-%da%a9%d8%a7%d8%b1%d8%a8%d8%b1%d8%af%db%8c-%d8%af%d8%b3%d8%aa%d9%88%d8%b1-curl/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=%25d9%2585%25d8%25ab%25d8%25a7%25d9%2584%25d9%2587%25d8%25a7%25db%258c-%25da%25a9%25d8%25a7%25d8%25b1%25d8%25a8%25d8%25b1%25d8%25af%25db%258c-%25d8%25af%25d8%25b3%25d8%25aa%25d9%2588%25d8%25b1-curl</link>
		<comments>http://tuts.zanjanlug.org/%d9%85%d8%ab%d8%a7%d9%84%d9%87%d8%a7%db%8c-%da%a9%d8%a7%d8%b1%d8%a8%d8%b1%d8%af%db%8c-%d8%af%d8%b3%d8%aa%d9%88%d8%b1-curl/#comments</comments>
		<pubDate>Thu, 03 May 2012 17:10:10 +0000</pubDate>
		<dc:creator><![CDATA[مرتضی فتحی]]></dc:creator>
				<category><![CDATA[لینوکس]]></category>
		<category><![CDATA[cURL]]></category>
		<category><![CDATA[آموزش لینوکس]]></category>
		<category><![CDATA[دانلود]]></category>

		<guid isPermaLink="false">http://www.phpdevelopers.ir/?p=1397</guid>
		<description><![CDATA[ک بسته نرم افزاری متشکل از ابزار خط فرمان و یک کتابخانه برای انتقال داده با استفاده از قواعد URL می باشد.
cURL پروتکل های مختلفی همانند DICT, FILE, FTP, FTPS, Gopher, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMTP, SMTPS, Telnet و TFTPرا پشتیبانی میکند.
 <a href="/%d9%85%d8%ab%d8%a7%d9%84%d9%87%d8%a7%db%8c-%da%a9%d8%a7%d8%b1%d8%a8%d8%b1%d8%af%db%8c-%d8%af%d8%b3%d8%aa%d9%88%d8%b1-curl/"><span class='more-link'>ادامه ی مطلب</span></a>]]></description>
				<content:encoded><![CDATA[<p>cURL<img src="/wp-content/uploads/2012/05/linux-150x150.png" alt="" title="linux" width="150" height="150" class="alignright size-thumbnail wp-image-1399" /> یک بسته نرم افزاری متشکل از ابزار خط فرمان و یک کتابخانه برای انتقال داده ها با استفاده از قواعد URL می باشد.<br />
cURL پروتکل های مختلفی همانند DICT, FILE, FTP, FTPS, Gopher, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMTP, SMTPS, Telnet و TFTPرا پشتیبانی میکند.</p>
<p>در این <span id="more-1397"></span>مقاله ۱۵ مثال کاربردی با استفاده از cURL بیان میشود.</p>
<hr />
<p><strong>۱- دانلود تنها یک فایل</strong><br />
دستور زیر محتوای URL را دانلود کرده و آنرا در STDOUT شما نمایش میدهد(یعنی همان ترمینال شما).</p>
<pre class="brush: php; title: ; notranslate">
$ curl http://www.centos.org
</pre>
<p>در زیر اطلاعات اضافی دانلود نشان داده خواهد شد.</p>
<pre class="brush: php; title: ; notranslate">
$ curl http://www.centos.org &gt; centos-org.html
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 27329    0 27329    0     0   104k      0 --:--:-- --:--:-- --:--:--  167k
</pre>
<p><strong>2-ذخیره خروجی cURL در یک فایل</strong><br />
ما میتونیم نتیجه دستور cURL رو با استفاده از گزینه های –o یا –O در یک فایل ذخیره کنیم.<br />
-o : o کوچیک نتیجه را در فایلی با نام قید شده و دلخواه ذخیره خواهد کرد.<br />
-O : در این گزینه نام فایل موجود در URL برای ذخیره نتیجه استفاده خواهد شد.</p>
<pre class="brush: php; title: ; notranslate">
$ curl -o mygettext.html http://www.gnu.org/software/gettext/manual/gettext.html
</pre>
<p>حال صفحه gettext.html با نام mygettext.html ذخیره خواهد شد.<br />
وقتی که از curl –O استفاده میکنید محتوا با نام gettext.html برای روی کامپیوترتان ذخیره خواهد شد.</p>
<p>شبیه به cURL شما میتوانید از wget برای دانلود فایلها استفاده کنید،<a title="شگفتی های دستور wget" href="http://www.phpdevelopers.ir/%d8%b4%da%af%d9%81%d8%aa%db%8c-%d9%87%d8%a7%db%8c-%d8%af%d8%b3%d8%aa%d9%88%d8%b1-wget/">مثالهایی از wget</a><br />
<strong>3-دانلود چندین فایل در یک زمان</strong><br />
ما میتونیم چندین فایل رو توسط URL های معین در خط فرمان دانلود کنیم:</p>
<pre class="brush: php; title: ; notranslate">
$ curl -O URL1 -O URL2
</pre>
<p>دستور زیر هر دو فایل index.html و gettext.html دانلود و با نام های جداگانه در دایرکتوری جاری ذخیره خواهد کرد.</p>
<pre class="brush: php; title: ; notranslate">
$ curl -O http://www.gnu.org/software/gettext/manual/html_node/index.html -O http://www.gnu.org/software/gettext/manual/gettext.html
</pre>
<p><strong>4-پیروی از HTTP Location Headers با گزینه –L</strong><br />
به طور پیشفرض cURL از HTTP Location Headers که به عنوان Redirect(تغییر مسیر)نیز نامیده میشود،پیروی نمیکند.وقتی وب پیج درخواست شده به یک مکان دیگر منتقل یا همان ریدایرکت شد،سپس یک HTTP Location header به عنوان پاسخ فرستاده خواهد شد.<br />
برای مثال:وقتی بعضی ها از هند گوگل.کام را در مرورگرشون تایپ میکنند،به صورت اتوماتیک به صفحه google.co.in ریدایرکت میشن،این کار بر اساس HTTP Location header انجام میشود که در زیر نشان داده میشود:</p>
<pre class="brush: php; title: ; notranslate">
$ curl http://www.google.com

&lt;TITLE&gt;302 Moved&lt;/TITLE&gt;
&lt;H1&gt;302 Moved&lt;/H1&gt;
The document has moved
&lt;A HREF=&quot;http://www.google.co.in/&quot;&gt;here&lt;/A&gt;
</pre>
<p>در بالا خروجی میگوید که درخواست داکیومنت به http://www.google.co.in/ منتقل شده است.<br />
ما میتوانیم از curl بخواهیم از ریدایرکشن یا همان تغییر مسیر با استفاده از گزینه –L تبعیت کند ،حالا cURL سورس کد http://www.google.co.in/ رو دانلود خواهد کرد.</p>
<pre class="brush: php; title: ; notranslate">
$ curl -L http://www.google.com
</pre>
<p><strong>5-از سر گیری/ادامه دانلود قبلی</strong><br />
با استفاده از curl –C میتوانید دانلودی که قبلا به هر دلیلی متوقف شده را ادامه بدهید.این کار زمانی که شما یک فایل بزرگ دانلود میکنید مفید خواهد بود.<br />
اگر ما بگوییم ‘-C-’ سپس curl از جایی که تشخیص دهد شروع به از سرگیری دانلود میکند.ما میتونیم یک آفست هم بدیم ‘-C ’. آفست دادن از چک کردن سورس فایل از ابتدا صرف نظر خواهد کرد.<br />
شروع یک دانلود بزرگ با استفاده از curl ، و فشردن ctrl+c برای متوقف کردن مابین دانلود:</p>
<pre class="brush: php; title: ; notranslate">
$ curl -O http://www.gnu.org/software/gettext/manual/gettext.html
##############             20.1%
</pre>
<p>نکته:## برای نمایش پروسه پیشرفت استفاده شده است به جای یک پروسه پیشرفت متریک.<br />
در بالا دانلود در ۲۰٫۱ درصد متوقف شده است.با استفاده از ‘curl –C-’ میتونیم دانلود رو از جایی که قبلا متوقف کردیم ادامه دهیم.حال دانلود از ۲۰٫۱ درصد ادامه می یابد.</p>
<pre class="brush: php; title: ; notranslate">
curl -C - -O http://www.gnu.org/software/gettext/manual/gettext.html
###############            21.1%
</pre>
<p><strong>6-محدود کردن سرعت دانلود</strong><br />
میتوانید سرعت دانلودی که داده ها با آن انتقال میابند رو توسط گزینه –limit-rate محدود کنید.حتی میتونیم بالاترین سرعت دانلود رو به عنوان آرگومان مشخص کنیم.</p>
<pre class="brush: php; title: ; notranslate">
$ curl --limit-rate 1000B -O http://www.gnu.org/software/gettext/manual/gettext.html
</pre>
<p>در دستور بالا سرعت دانلود به ۱۰۰۰ بایت در ثانیه محدود شد،cURL ممکنه بالاترین سرعت دانلود رو برای مدت کوتاهی از زمان استفاده کند،اما به صورت میانگین حول حوش ۱۰۰۰ بایت در ثانیه خواهد بود.<br />
میتونید یک پراجرس متریک برای دستور بالاست را در زیر مشاهده کنید،سرعت در حال حاظر نزدیک به ۱۰۰۰ بایت در ثانیه است.</p>
<pre class="brush: php; title: ; notranslate">
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  1 1215k    1 13601    0     0    957      0  0:21:40  0:00:14  0:21:26   999
  1 1215k    1 14601    0     0    960      0  0:21:36  0:00:15  0:21:21   999
  1 1215k    1 15601    0     0    962      0  0:21:34  0:00:16  0:21:18   999
</pre>
<p><strong>7-دانلود یک فایل تنها در صورتیکه قبل وبعد زمان معلوم تغییر یافته است</strong><br />
ما میتوانیم فایلهایی که بعد زمان مخصوص تغییر یافته اند را با استفاده از گزینه –z در cURL دانلود کنیم.این گزینه برای هر دوی FTP و HTTP کار میکند.</p>
<pre class="brush: php; title: ; notranslate">
$ curl -z 21-Dec-11 http://www.example.com/yy.html
</pre>
<p>دستور فوق yy.html را دانلود میکند تنها اگر بعد از تاریخ و زمان داده شده،تغییر یافته باشد اگر هیچ تغییری نسبت به تاریخ داده نکرده باشد دانلود نمیشود.<br />
لطفا برای دیدن سینتکس پشتیبانی شده برای بیان تاریخ به man curl_getdate رجوع کنید .<br />
<strong>۸-قبول HTTP Authentication در cURL </strong><br />
بعضی اوقات،وبسایتها یک یوزر و پسورد برا دیدن محتوا درخواست میکنند،با کمک گزینه –u میتونیم استوارنامه(چه ترجمه و معادل مزخرفی)یا همون credential اونا رو قبول یا همان Pass کنیم(شب آرام و بی صدا،در تشویش کوچه ها، سرگردان است،با رویای پنجره ،با یک سینه خاطره ،بی سامان است <img src="/wp-includes/images/smilies/icon_wink.gif" alt=";-)" class="wp-smiley" />  )</p>
<pre class="brush: php; title: ; notranslate">
$ curl -u username:password URL</pre>
<p>نکته:به طور پیشفرض cURL از HTTP Authentication ابتدایی استفاده میکند،میتونیم با استفاده از متد –ntlm یا –digest برای تاییدیه های دیگر استفاده کنیم.<br />
<strong>۹-دانلود سایت با استفاده از FTP سرور</strong><br />
cURL همچنین میتونه از FTP سرورها دانلود کنه،اگر مسیر FTP دریافت شده یک دایرکتوری باشد،به صورت پیشفرض فایلها رو تحت پوشه مشخص شده لیست خواهد کرد.</p>
<pre class="brush: php; title: ; notranslate">
$ curl -u ftpuser:ftppass -O ftp://ftp_server/public_html/xss.php
</pre>
<p>دستور فوق فایل xss.php را از اف تی پی سرور دانلود و در دایرکتوری لوکال ذخیره خواهد کرد.</p>
<pre class="brush: php; title: ; notranslate">
$ curl -u ftpuser:ftppass -O ftp://ftp_server/public_html/
</pre>
<p>در اینجا ،URL داده شده به یک دایرکتوری رجوع میکند،از این رو curl تمامی فایلها و دایرکتوری ها رو تحت URL داده شده لیست میکند.</p>
<p>۶ مورد هم موند به مرور میزارم رو سایت :-p<br />
منبع:</p>
<p>http://www.thegeekstuff.com/</p>
]]></content:encoded>
			<wfw:commentRss>http://tuts.zanjanlug.org/%d9%85%d8%ab%d8%a7%d9%84%d9%87%d8%a7%db%8c-%da%a9%d8%a7%d8%b1%d8%a8%d8%b1%d8%af%db%8c-%d8%af%d8%b3%d8%aa%d9%88%d8%b1-curl/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>شی گرایی(OOP)در پی اچ پی(PHP) – کلاس پایگاه داده</title>
		<link>http://tuts.zanjanlug.org/oop-in-php-database-class/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=oop-in-php-database-class</link>
		<comments>http://tuts.zanjanlug.org/oop-in-php-database-class/#comments</comments>
		<pubDate>Mon, 23 Apr 2012 15:28:46 +0000</pubDate>
		<dc:creator><![CDATA[amin_oia]]></dc:creator>
				<category><![CDATA[برنامه نویسی]]></category>
		<category><![CDATA[پی اچ پی]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[in]]></category>
		<category><![CDATA[OOP]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[پایگاه داده]]></category>
		<category><![CDATA[کلاس]]></category>

		<guid isPermaLink="false">http://www.phpdevelopers.ir/?p=1381</guid>
		<description><![CDATA[سعی دارم تا مطالبی را که در پست های قبلی گفتم در عمل پیاده سازی کنم. پی اچ پی تشکیل شده از یک ساختار ۱۰۰% شی گرا نیست برای همین من برای یک مثال عملی انتخاب های زیادی نمی توانم &#8230; <a href="/oop-in-php-database-class/"><span class='more-link'>ادامه ی مطلب</span></a>]]></description>
				<content:encoded><![CDATA[<p><img src="/wp-content/uploads/2012/04/icones_00058-150x150.png" alt="" title="icones_00058" width="150" height="150" class="alignright size-thumbnail wp-image-1403" />سعی دارم تا مطالبی را که در پست های قبلی گفتم در عمل پیاده سازی کنم. پی اچ پی تشکیل شده از یک ساختار ۱۰۰% شی گرا نیست برای همین من  برای یک مثال عملی انتخاب های زیادی نمی توانم داشته باشم. اگر یک بستر شی گرا وجود داشت انتخاب ها بسیار فراوان تر بودنند. با این وجود پایگاه داده خود به حد انتظار یک موضوع جالب و جذاب هست که باعث شیرین تر شدن مثال خواهد شد. این یک کلاس با انگیزه آموزش و تمرین است اما یک کلاس ناکارآمد و بدون استفاده نیست. این کلاس سعی می کند تا کار با پایگاه داده را با کم کردن پیچیدگی ها راحت تر کند.<span id="more-1381"></span></p>
<p><strong>ایجاد یک کلاس برای اتصال و پرسش از پایگاه داده</strong><br />
پی اچ پی خود از اکستنشن ها و کلاس های برای کار با انواع پایگاه داده برخوردار است و خوشبختانه جا برای کسترش کار با پایگاه داده ها وجود دارد. این یک کلاس آموزشی و کوچک است فقط کار با پایگاه داده MySql به کمک اکستنشن mysql را مورد بررسی و اجرا قرار می دهد (شاید چون اکستنشن mysql آشنا تر است). </p>
<p><strong>تعریف اهداف کلاس</strong><br />
اساس کار با پایگاه داده عبارت است از برقراری اتصال، انجام پرسش و قطع اتصال. این کلاس علاوه برای انجام دادن کار های اصلی به عنوان ضروریات می بایست با استفاده از متد هایی کار با پایگاه داده را آسان تر کند. امکاناتی مانند چک کردن وضعیت اتصال، set کردن sql-query جدا از اجرا، انتخاب پایگاه داده مجزا از برقراری اتصال، پوشش بهتر خطا ها، تعامل با توابع اکستنشن mysql را دارا باشد. در این صورت است که یک کلاس کارآممد خواهد بود.<br />
این تعریف به ما کمک می کند تا بدانیم که چه می خواهیم بسازیم. شی ما باید قادر به انجام چه کار هایی باشد و کلاس چگونه پیاده سازی شود. من کلاس رو ایجاد کرده ام و در آخر کد منبع آن را قرار داده ام. اگر شما هم فک می کنید که آنقدر توانایی دارید که خود دست به ساختن بزنید لطفآ این کار رو انجام بدید و بعد کار خود را با کار من مقایسه کنید. من منتظر نظرات و مقایسات شما هستم.</p>
<p><strong>کلاس MysqlDriver :</strong><br />
بر خلاف انتظار شما بجای نام database یا db یا یک نام مشابه از نام MysqlDriver استفاده کرده ام. این یک کلاس دیتابیس نیست اگرچه با دیتابیس کار می کند. در واقع یک کلاس دیتابیس از این کلاس جامع تر و بزرگتر است (مانند یک کتابخانه است). شاید در زمانی که مباحثی چون interface و extends را مرور  کردیم بتوانیم یک کتابخانه database ایجاد کنیم. اما فعلا ما دست به ساختن یک کلاس که هدف اصلیش ایجاد ارتباط، پرسش و قطع اتصال به علاوه چند امکان جانبی کوچک دیگر است زده ایم که از اکستنشن mysql استفاده می کند. نام بهتر برای این کلاس MysqlDriver است. اگر ما این کلاس را با اکستنشن mysqli پیاده سازی می کردیم آنگاه این کلاس MysqliDriver نام می گرفت.<br />
به دلیلی سادگی برنامه، مستندسازی طبق استاندارد PHPDoc و خوانایی کد از تشریح خط به خط برنامه صرف نظر می کنم. سوالات رو می تونید در بخش نظرات مطرح کنید.</p>
<p><strong>کدنویسی :</strong><br />
سعی کنید نام ها را به درستی و با دقت انتخاب کنبد. چه برای کلاس، چه برای پروپرتی ها و چه برای متد ها، نام باید معرف عمل و هدف باشد. سعی کنید از قوانین عمومی (این قوانین غیر اجباری هستند و مربوط به نحوه کدنویسی می شوند) طبعیت کنید تا در نهایت کد شما محبوبیت بیشتری داشته باشد.</p>
<p><strong>پروپرتی :</strong><br />
پروپتی یک متغییر است که در دسترس متد های کلاس قرار می گیرد. هرگاه مقداری می بایست چنین ویژگی داشته باشد آن را در یک پروپرتی نگهداری کنید.</p>
<p><strong>متد :</strong><br />
سعی کنید متد ها را عمومی تر تعریف کنید. به هر متد فقط یه وظیفه را بسپارید و بقیه وظایف را به متد های دیگر. قبل از استفاده از ورودی ها آنها را چک کنید. استفاده و تعامل با پروپرتی ها را درنظر داشته باشید.</p>
<p><strong>نمونه هایی از استفاده از از این کلاس MysqlDriver<br />
</strong><br />
1- درج کردن در پایگاه داده</p>
<pre class="brush: php; title: ; notranslate">
// insert
$mysql = new MysqlDriver($host, $user, $pass, $dbname);
$mysql-&gt;command(“INSERT INTO users (name,email) VALUES (‘$name’, ‘$email’)”);
$mysql-&gt;execute();
if($mysql-&gt;error()){
	echo ‘connot add user.’;
	exit();
}
</pre>
<p>2- خواند از پایگاه داده :</p>
<pre class="brush: php; title: ; notranslate">
// select
$mysql = new MysqlDriver($host, $user, $pass, $dbname);
$mysql-&gt;command('SELECT * FROM users');
$mysql-&gt;execute();
if($mysql-&gt;error()){
	echo ‘connot read user.’;
	exit();
}
while($row = $mysql-&gt;fetch()){
	echo $row[‘name’];
	echo $row[‘email’];
}
</pre>
<p>۳- ویرایش کردن رکورد ها :</p>
<pre class="brush: php; title: ; notranslate">
// update
$mysql = new MysqlDriver($host, $user, $pass, $dbname);
$mysql-&gt;command(“UPDATE users SET name=’$name’”);
$mysql-&gt;execute();
if($mysql-&gt;error()){
	echo ‘connot edit user.’;
	exit();
}
</pre>
<p>4- حذف کرن رکورد :</p>
<pre class="brush: php; title: ; notranslate">
// delete
$mysql = new MysqlDriver($host, $user, $pass, $dbname);
$mysql-&gt;command(&quot;DELETE FROM users WHERE id=$id&quot;);
$mysql-&gt;execute();
if($mysql-&gt;error()){
	echo 'connot edit user.';
	exit();
}
</pre>
<p>چهار query پرکاربرد در کار با پایگاه داده به عنوان نمونه قرار داده شد.این کلاس برای بهتر شدن نیاز دارد تا هم رو به پایین ( sql-query ها و نوع داده های خرجی ) و هم رو به بالا (پشتیبانی از سایر اکستشن ها و دیتا بیس ها) گسترش پیدا کند. یک شی زمانی موثر تر است که درون مجموعه ایی از اشیا و به صورت یک عضو در یک سیستم شی گرا قرار بگیرد. زمانی که مباحثی مانند extends و interface مطرح شدند گسترش این کلاس لذبخش تر و ممکن تر خواهد بود.</p>
<p><strong>کد منبع کلاس : </strong></p>
<pre class="brush: php; title: ; notranslate">
&lt;?PHP

/**
 * MysqlDriver is a database class
 * mysql is a internal extension in PHP for connect and query to MySql database
 * MysqlDriver is a class for connect and query to MySql database at uase mysql
 * extension.
 * @author		mohammadamin moradi&lt;amin2oia@gmail.com&gt;
 * @version		1.0 2012-04-20
 * @copyright	phpdevelopers.ir (c) 2012
 * @copyleft	GPLv3&lt;www.gnu.org&gt;
 */
class MysqlDriver
{
	/**
	 * database hostname
	 * @access	private
	 * @var		string
	 */
	private $hostname;
	
	/**
	 * database username
	 * @access	private
	 * @var		string
	 */
	private $username;
	
	/**
	 * database password
	 * @access	private
	 * @var		string
	 */
	private $password;
	
	/**
	 * database name
	 * @access	private
	 * @var		string
	 */
	private $database;
	
	/**
	 * sql query string
	 * @access	private
	 * @var		string
	 */
	private $command;
	
	/**
	 * mysql link
	 * @access	private
	 * @var		mysql-resource
	 */
	private $mysqlLink;
	
	/**
	 * mysql resource
	 * @access	private
	 * @var		mysql-resource
	 */
	private $result;
	
	/**
	 * error number
	 * @access	private
	 * @var		int
	 */
	private $error;
	
	/**
	 * connect state
	 * @access	private
	 * @var		bool
	 */
	private $connected;
	
	/**
	 * MysqlDriver Constructor
	 * first set properties value
	 * @access	public
	 * @param	$hostname	string	'the database hostname'
	 * @param	$username	string	'the database username'
	 * @param	$password	string	'the database password'
	 * @param	$database	string	'the database name'
	 * @return	void
	 */
	public function __construct($hostname, $username, $password, $database=null)
	{
		// set properties
		$this-&gt;hostname = $hostname;
		$this-&gt;username = $username;
		$this-&gt;password = $password;
		$this-&gt;database = $database;
		$this-&gt;command = '';
		$this-&gt;error = -1;
		$this-&gt;connected = false;
	}
	
	/**
	 * MysqlDriver Destructor
	 * free resource at closing connection and unset peroperties
	 * @access	public
	 * @return	void
	 */
	public function __destruct()
	{
		// close connecton
		$this-&gt;close();
		
		// unset properties
		unset($this-&gt;hostname);
		unset($this-&gt;username);
		unset($this-&gt;password);
		unset($this-&gt;database);
		unset($this-&gt;command);
		unset($this-&gt;error);
		unset($this-&gt;connected);
	}
	
	/**
	 * open mysql databse connection
	 * if connected then returned
	 * @access	public
	 * @return void
	 */
	public function open()
	{
		// check exists connect to databse
		if($this-&gt;connected){
			return;
		}
		
		// connect to databse
		$this-&gt;mysqlLink = @mysql_connect($this-&gt;hostname, $this-&gt;username, $this-&gt;password);
		if(!$this-&gt;mysqlLink){
			$this-&gt;setError(11);
			return;
		}
		
		// select database
		if(isset($this-&gt;database){
			$this-&gt;setDatabase($this-&gt;database);
		}
		
		// set connected property at &lt;b&gt;true&lt;b/&gt; value
		$this-&gt;connected = true;
	}
	
	/**
	 * close mysql databse connection
	 * if not connected then returned
	 * @access	public
	 * @return	void
	 */
	public function close()
	{
		// free mysql result
		if(is_resource($this-&gt;result) &amp;&amp; $this-&gt;connected){
			mysql_free_result($this-&gt;result);
		}
		
		// chech exists connect
		if(!$this-&gt;connected){
			return;
		}
		
		// close connection and new set properties
		@mysql_close($this-&gt;mysqlLink);
		$this-&gt;connected = false;
		$this-&gt;mysqlLink = null;
		$this-&gt;result = null;
	}
	
	/**
	 * set and select database name
	 * @access	public
	 * @param	$database	string	'the database name'
	 * @return	void
	 */
	public function database($database)
	{
		// if not connect then set error
		if(!this-&gt;connected){
			$this-&gt;setError(21);
			return;
		}
		
		// select database
		@mysql_select_db($database, $this-&gt;mysqlLink);
		if(mysql_errno($this-&gt;mysqlLink)){
			$this-&gt;setError(22);
			return;
		}
	}
	
	/**
	 * execute sql query
	 * @access	public
	 * @return	void
	 */
	public function execute()
	{
		// if not connenct then connect
		if(!$this-&gt;connected){
			$this-&gt;open();
		}
		
		// if not command exists then set error and return
		if($this-&gt;command == ''){
			$this-&gt;setError(31);
			return;
		}
		
		// get query and set result
		$this-&gt;result = @mysql_query($this-&gt;command, $this-&gt;mysqlLink);
		if(mysql_errno($this-&gt;mysqlLink)){
			$this-&gt;setError(32);
		}
	}
	
	/**
	 * fetch result from databse
	 * @access	public
	 * @param	$fetchMode	int	'set fetch mode'
	 * @return	array
	 */
	public function fetch($fetchMode=MYSQL_ASSOC)
	{
		// check mysql result
		if(!is_resource($this-&gt;result)){
			$this-&gt;setError(41);
			return;
		}
		
		// check fetch mode
		if(!in_array($fetchMode, array(MYSQL_ASSOC, MYSQL_NUM, MYSQL_BOTH)){
			$this-&gt;setError(42);
			return;
		}
		
		// fetch from database
		$read = @mysql_fetch_array($this-&gt;result, $fetchMode);
		if(mysql_errno($this-&gt;mysqlLink)){
			$this-&gt;setError(43);
			return;
		}
		
		// return read row
		return $read;
	}
	
	/**
	 * set sql query
	 * @access	public
	 * @param	$command	string	'the sql query'
	 * @return	void
	 */
	public function command($command)
	{
		$this-&gt;command = $command;
	}
	
	/**
	 * get sql query
	 * @access	public
	 * @return	string
	 */
	public function getCommand()
	{
		return $this-&gt;command;
	}
	
	/**
	 * get mysql link
	 * @access	public
	 * @return	mysql-resource
	 */
	public function getMysqlLink()
	{
		return $this-&gt;mysqlLink;
	}
	
	/**
	 * get mysql resource
	 * @access	public
	 * @return	mysql-resource
	 */
	public function getResult()
	{
		return $this-&gt;result;
	}
	
	/**
	 * set error number
	 * @access	private
	 * @param	$errorNumber	int	'the error number'
	 * @return	void
	 */
	private function setError($errorNumber)
	{
		$this-&gt;error = $errorNumber;
	}
	
	/**
	 * check exists error
	 * @access	public
	 * @return	bool
	 */
	public function isError()
	{
		return ($this-&gt;error &gt; 0);
	}
	
	/**
	 * get error number
	 * @access	public
	 * @return	int
	 */
	public function error()
	{
		return $this-&gt;error;
	}
	
	/**
	 * get connect state
	 * @access	public
	 * @return	bool
	 */
	public function connected()
	{
		return $this-&gt;connected;
	}
}

</pre>
]]></content:encoded>
			<wfw:commentRss>http://tuts.zanjanlug.org/oop-in-php-database-class/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>شی گرایی(OOP)در پی اچ پی(PHP) – سازنده</title>
		<link>http://tuts.zanjanlug.org/oop-in-php-constructor/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=oop-in-php-constructor</link>
		<comments>http://tuts.zanjanlug.org/oop-in-php-constructor/#comments</comments>
		<pubDate>Thu, 19 Apr 2012 06:39:54 +0000</pubDate>
		<dc:creator><![CDATA[amin_oia]]></dc:creator>
				<category><![CDATA[برنامه نویسی]]></category>
		<category><![CDATA[پی اچ پی]]></category>
		<category><![CDATA[construct]]></category>
		<category><![CDATA[construstor]]></category>
		<category><![CDATA[destruct]]></category>
		<category><![CDATA[destructor]]></category>
		<category><![CDATA[OOP]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[سازنده]]></category>
		<category><![CDATA[شی گرایی]]></category>
		<category><![CDATA[مخرب]]></category>

		<guid isPermaLink="false">http://www.phpdevelopers.ir/?p=1371</guid>
		<description><![CDATA[سازنده (constructor) یک متد است. هر کلاس که ساخته می شود بطور درونی و پیش فرض این متد را دارد ( مانند شی this که به طور درونی وجود دارد). این متد هنگامی که از روی کلاس یک شی ساخته &#8230; <a href="/oop-in-php-constructor/"><span class='more-link'>ادامه ی مطلب</span></a>]]></description>
				<content:encoded><![CDATA[<p><img src="/wp-content/uploads/2012/04/icones_00058-150x150.png" alt="" title="icones_00058" width="150" height="150" class="alignright size-thumbnail wp-image-1403" />سازنده (constructor) یک متد است. هر کلاس که ساخته می شود بطور درونی و پیش فرض این متد را دارد ( مانند شی this که به طور درونی وجود دارد). ا<strong>ین متد هنگامی که از روی کلاس یک شی ساخته می شود به صورت خودکار صدا زده می شود</strong>. ویژگی که این متد دارد این است که برنامه نویس می تواند متد سازنده را  با توجه به نیازی که برای کلاس احساس می کند باز تعریف کند. کار ویژه متد سازنده مقدار دهی اولیه پروپرتی هاست.<span id="more-1371"></span></p>
<p><strong>متد سازنده (constructor) :</strong><br />
این متد یا هم نام کلاس است (مخصوصا در نسخه های پی اچ پی قبل از ۵) یا از نام construct با دو زیرخط(UnderLine) در ابتدا استفاده می کند (در نسخه های پی اچ پی ۵ و بعد).<br />
کلاس کاربر که حاوی username و password است. </p>
<pre class="brush: php; title: ; notranslate">
class User
{
	private $username;
	private $password;

	public function __construct($username, $password)
	{
		$this-&gt;username = $username;
		$this-&gt;password = $password;
	}
	
	public function getUsername()
	{
		return $this-&gt;password;
	}
	
	public function getPassword()
	{
		return $this-&gt;password;
	}
}
</pre>
<p>در مواردی که نباید مقدار پروپرتی دوباره تغییر کند استفاده از متد سازنده برای مقدار دهی اولیه خیلی امن تر و مطمئن تر است. در چنین مواردی استفاده از یک متد set به دلیل امکان تغییر دوباره مقدار پرورپتی نمی تواند به اندازه متد construct کارآمد باشد.</p>
<pre class="brush: php; title: ; notranslate">
$user = new User('php', '123');
echo $user-&gt;getUsername(); // output: php
</pre>
<p>بعد از تعریف مجدد تابع سازنده مربوط به کلاس User از این به بعد هنگامه ساختن شی از این کلاس باید ورودی های متد سازنده را بعد از نام کلاس درون پرانتز و با جداکننده کاما آورده شوند (مانند یک فانکشن یا یک متد عمل شود). در واقع چون در زمانی که شی ایجاد می شود متد سازنده صدا زده می شود.<br />
<em>نکته: متد سازنده می تواند پارامتر هایی را به عنوان ورودی بگیرد اما نمی تواند مقداری را بازگشت دهد.</em></p>
<p><strong>متد نابود کننده (destructor) :</strong><br />
این متد در هنگام از بین رفتن شی صدا زده می شود (در برنامه یعنی بعد از آخرین کاری که شی انجام داد). معمولا  برای آزاد کردن منابعی که توسط شی اشغال شده است مورد استفاده دارد. متد مخرب نه می تواند پارامتری را به عنوان ورودی بگیرد و نه مقداری را برگرداند. نام این متد destruct با دو زیرخط(UnderLine) در ابتد است.  با سازی کلاس User برای اضافه کردن متد مخرب.</p>
<pre class="brush: php; title: ; notranslate">
class User
{
	private $username;
	private $password;

	public function __construct($username, $password)
	{
		$this-&gt;username = $username;
		$this-&gt;password = $password;
	}
	
	public function __destruct()
	{
		unset($this-&gt;username);
		unset($this-&gt;password);
	}
	
	public function setPassword($password)
	{
		$this-&gt;password = $password;
	}
	
	public function getPassword()
	{
		return $this-&gt;password;
	}
}
</pre>
<p>پروپرتی ها مقداری از حافظه (RAM) را به خود اختصاص می دهند. متد مخرب در کلاس User قبل از نابودی شی مقدار منابعی که توسط پروپرتی ها اشغال شده است را آزاد می کند.</p>
<p><strong>پیوند ها :</strong><br />
<a href="http://www.php.net/manual/en/language.oop5.decon.php" title="پی اچ پی شی گرایی 5 – سازنده ها و مخرب ها" target="_blank">پی اچ پی شی گرایی ۵ – سازنده ها و مخرب ها</a></p>
]]></content:encoded>
			<wfw:commentRss>http://tuts.zanjanlug.org/oop-in-php-constructor/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>شی گرایی(OOP)در پی اچ پی(PHP) – میدان دید</title>
		<link>http://tuts.zanjanlug.org/oop-in-php-visibilty/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=oop-in-php-visibilty</link>
		<comments>http://tuts.zanjanlug.org/oop-in-php-visibilty/#comments</comments>
		<pubDate>Wed, 18 Apr 2012 13:39:27 +0000</pubDate>
		<dc:creator><![CDATA[amin_oia]]></dc:creator>
				<category><![CDATA[برنامه نویسی]]></category>
		<category><![CDATA[پی اچ پی]]></category>
		<category><![CDATA[OOP]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[visibility]]></category>
		<category><![CDATA[شی گرایی]]></category>
		<category><![CDATA[میدان دید]]></category>
		<category><![CDATA[ویزیبیلتی]]></category>

		<guid isPermaLink="false">http://www.phpdevelopers.ir/?p=1367</guid>
		<description><![CDATA[هر عنصری که در کلاس تعریف می شود دارای میدان دید است. میدان دید یعنی چه کسانی اجازه دارند که به این عنصر دسترسی داشته باشند یا اصطلاحا چه کسانی می توانند این عنصر را ببینند. با این قابلیت، اشیا &#8230; <a href="/oop-in-php-visibilty/"><span class='more-link'>ادامه ی مطلب</span></a>]]></description>
				<content:encoded><![CDATA[<p><img src="/wp-content/uploads/2012/04/icones_00058-150x150.png" alt="" title="icones_00058" width="150" height="150" class="alignright size-thumbnail wp-image-1403" />هر عنصری که در کلاس تعریف می شود دارای میدان دید است. میدان دید یعنی چه کسانی اجازه دارند که به این عنصر دسترسی داشته باشند یا اصطلاحا چه کسانی می توانند این عنصر را ببینند. با این قابلیت، اشیا به دلخواه عناصری را در دسترس عموم (سایر اشیا) و عناصری را درون خانواده (در مواقع توسعه یا ارث بری) و عناصری را خصوصی تایین می کنند. با این ویژگی اشیا قادر خواهند بود که از تغییر بدون اطلاع داده ها توسط سایر اشیا جلوگیری کنند. در اکثر موارد در برنامه نویسی یک کلاس، پروپرتی ها بصورت خصوصی و متد ها بصورت عمومی تعریف می شوند.<span id="more-1367"></span></p>
<p><strong>انواع میدان دید (visibility) :</strong><br />
سه نوع میدان دید وجود دارد. نوع عمومی(public)، نوع خصوصی (private)، نوع محافظت شده(protected).<br />
<strong>نوع عمومی (public)</strong> اجازه می دهد تا عنصر (پروپرتی یا متد) در دسترس سایر اشیا باشد.<br />
<strong>نوع خصوصی (private)</strong> اجازه دست رسی فقط برای خوده شی وجود دارد. ( فقط شی درونی this می تواند عناصر private را صدا بزند. )<br />
<strong>نوع محافظت شده (protected)</strong> اجازه دسترسی علاوه بر خود شی به اشیایی که از شی ارث برده باشند هم داده می شود. (این نوع در مبحث ارث بری (یا توسعه) بیشتر توضیح داده خواهد شد).</p>
<p>در برنامه نویسی یک کلاس اغلب پروپتی ها را private و متد ها را public تعریف می کنند. این امر به این خاطر است که پروپرتی ها حاوی مقدار هستند و روی کار متدها و شی تاثیر مستقیم دارند، با private شدن امکان تغییر مستقیم مقدار این پروپرتی ها از بیرون وجود نخواهد داشت.</p>
<p><strong>متد های set و get :</strong><br />
set به معنی تنظیم و get به معنی گرفتن است. متد های set معمولآ ایجاد می شوند تا مقدار را در یک پرپرتی خاص تغییر دهد و از متد get برای گرفتن مقدار یک پروپرتی خاص استفاده می شود.<br />
کلاس کاربر حاوی مقدار نام کاربری و کلمه عبور هر شی کاربر خواهد بود.</p>
<pre class="brush: php; title: ; notranslate">
class User
{
	private $username;
	private $password;
	
	public function setUsername($username)
	{
		$this-&gt;username = $username;
	}
	
	public function getUsername()
	{
		return $this-&gt;username;	
	}
	
	public function setPassword($password)
	{
		$this-&gt;password = $password;
	}
	
	public function getPassword()
	{
		return $this-&gt;password;
	}
}
</pre>
<p>در صورتی از بیرون اقدام شود برای مشاهده یک عنصر private در برنامه یک اخطار مرگ (Fatal) ایجاد می شود. در حالی که در داخل کلاس این دسترسی (به کمک شی داخلی this) وجود دارد.</p>
<pre class="brush: php; title: ; notranslate">
$user = new User();
echo $user-&gt;username; // Fatal error: Cannot access private property User::$username in ...
</pre>
<p>در این کلاس متد هایی برای set و get کردن مقدار username و password وجود دارد. این متد ها علاوه بر اینکه این امکان را می دهند تا به مقادیر پروپرتی ها از بیرون دسترسی داشت این امکان را هم به خود شی می دهند تا بتواند یک کنترل برای زمان set شدن و get شدن مقدار پروپرتی ایجاد کند. البته در این کلاس نمونه کنترل خاصی قرارداده نشده است اما درصورت ضرورت می تواند ایجاد شود.</p>
<pre class="brush: php; title: ; notranslate">
$user = new User();

// set
$user-&gt;setUsername('php');
$user-&gt;setPassword('123');

// get
echo $user-&gt;getUsername(); // output: php
echo $user-&gt;getPassword(); // output: 123
</pre>
<p>در مورد پروپرتی ها حتما وضعیت دید (public یا private یا protected) قید شود تا نوع visibility مشخص باشد. در نسخه های قبلی PHP استفاده از کلمه کلیدی var برای پروپرتی ها رایج بود که اکیدا توصیه نمی شود.<br />
در صورتی که وضعیت visibility پروپرتی را مشخص نکنید با یک خطای ترجمه (Parser) مواجه خواهید شد. در مورد متد ها قید visibility اختیاری است. در صورتی که visibility برای یک متد شخص نشده باشد بصورت پیش فرض visibility برابر public در نظر گرفته خواهد شد.</p>
<p><strong>پیوند ها :</strong><br />
<a href="http://www.php.net/manual/en/language.oop5.visibility.php" title="پی اچ پی شی گرایی 5 – میدان دید" target="_blank">پی اچ پی شی گرایی ۵ – میدان دید</a></p>
]]></content:encoded>
			<wfw:commentRss>http://tuts.zanjanlug.org/oop-in-php-visibilty/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>شی گرایی(OOP)در پی اچ پی(PHP) – عملکرد</title>
		<link>http://tuts.zanjanlug.org/oop-in-php-methods/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=oop-in-php-methods</link>
		<comments>http://tuts.zanjanlug.org/oop-in-php-methods/#comments</comments>
		<pubDate>Tue, 17 Apr 2012 07:46:20 +0000</pubDate>
		<dc:creator><![CDATA[amin_oia]]></dc:creator>
				<category><![CDATA[برنامه نویسی]]></category>
		<category><![CDATA[پی اچ پی]]></category>
		<category><![CDATA[method]]></category>
		<category><![CDATA[OOP]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[شی گرایی]]></category>
		<category><![CDATA[عملکرد]]></category>
		<category><![CDATA[متد]]></category>

		<guid isPermaLink="false">http://www.phpdevelopers.ir/?p=1359</guid>
		<description><![CDATA[اصلی ترین هدف از ساختن اشیا، استفاده از اشیاست. یک شی ساخته می شود تا مورد استفاده قرار بگیرد. بیشترین بار استفاده از اشیا بر روی عملکرد (Method) های آنهاست و خصوصیات بر نحوه عملکرد تاثیر می گذارند. در ادامه &#8230; <a href="/oop-in-php-methods/"><span class='more-link'>ادامه ی مطلب</span></a>]]></description>
				<content:encoded><![CDATA[<p><img src="/wp-content/uploads/2012/04/icones_00058-150x150.png" alt="" title="icones_00058" width="150" height="150" class="alignright size-thumbnail wp-image-1403" />اصلی ترین هدف از ساختن اشیا، <strong>استفاده </strong>از اشیاست. یک شی ساخته می شود تا مورد استفاده قرار بگیرد. بیشترین بار استفاده از اشیا بر روی عملکرد (Method) های آنهاست و خصوصیات بر نحوه عملکرد تاثیر می گذارند. در ادامه با نحوه پیاده سازی متد در کلاس و نحوه استفاده از آن خواهم گفت.<span id="more-1359"></span></p>
<p><strong>عملکرد (Method) – کدنویسی</strong><br />
در کدنویسی شما باید برای کلاس خود یک function (تابع) پیاده سازی کنید. توابع (در غیر استفاده در یک کلاس ) داده هایی را از ورودی می گیرند، عملیات را نجام می دهند و نتیجه را به خروجی بر می گردانند البته این یک روال کلی است. در یک متد (توابع در کلاس) داده هایی از ورودی یا از پروپرتی (متغییر های کلاس) می گیرد، عملیات مورد نظر را انجام می دهد و نتیجه را به خروجی بر می گرداند یا در یک پروپرتی ذخیره می کند.<br />
در ادامه یک کلاس برای یک ماشین حساب ساده پیاده می کنیم.<br />
کلاس ماشین حساب :</p>
<pre class="brush: php; title: ; notranslate">
class Calculator
{
	public function sum($numFirst, $numLast)
	{
		$result = $numFirst + $numLast;
		return $result;
	}
}
</pre>
<p>مانند تعریف یک فانکشن، تعرف یک متد هم با استفاده از کلمه کلیدی function صورت می گیرد. بجز کلمه کلیدی public که قبل از کلمه کلیدی function آمد است هیچ تفاوت ظاهری دیگری میان یک فانکشن و متد وجود ندارد. قوانین نام گذاری متد ها هم مانند قوانین نام گذاری فانکشن است و همین طور نحوه ورودی ها و return مربوط به متد هم مانند فانکشن است.</p>
<pre class="brush: php; title: ; notranslate">
$cal = new Calculator();

// sum
$result = $cal-&gt;sum(10, 5);
var_dump($result); // output: int(15)
 </pre>
<p>یک متد بخاطر اینکه در یک کلاس تعرف می شود و مختص یک شی است بهتر می تواند با خصوصیات و متد های دریگر شی ارتباط داشته باشد و به همین خاطر یک متد از یک تابع کارآمدتر است که جزیی از یک شی است. کلاس را کسترش داده ام و در این کسترش سعی کردم تا تعامل بین خصوصیات و متد ها بیشتر نمود داشته بشد.</p>
<pre class="brush: php; title: ; notranslate">
class Calculator
{
	public $numFirst;
	public $numLast;

	public function setNumbers($numFirst, $numLast)
	{
		$this-&gt;numFirst = $numFirst;
		$this-&gt;numLast = $numLast;
	}

	public function sum()
	{
		$result = $this-&gt;numFirst + $this-&gt;numLast;
		return $result;
	}

	public function sub()
	{
		$result = $this-&gt;numFirst - $this-&gt;numLast;
		return $result;
	}

	public function mul()
	{
		$result = $this-&gt;numFirst * $this-&gt;numLast;
		return $result;
	}

	public function div()
	{
		$result = $this-&gt;numFirst / $this-&gt;numLast;
		return $result;
	}
}
</pre>
<p>دو پروپرتی با نام های numFirst و numLast و چهار متد sum و sub و mul و div برای انجام چها عمل اصلی ریاضی و متد setNumbers برای مقدار دهی اولیه property ها اضافه شده اند. متد ها با استفاده از شی داخی this به پروپرتی ها و متد های دیگر کلاس دسترسی دارند.<br />
هنگامی که بخواهیم به متد ها و خصوصیات یک شی دسترسی داشته باشیم از روی کلاس مربوط به شی یک شی ایجاد می کنیم اما در یک متد مربوط به همین شی برای دسترسی به سایر متد ها و پروپرتی ها از شی this که بطور ذاتی درون کلاس وجود دارد استفاده می کنیم.</p>
<pre class="brush: php; title: ; notranslate">
$cal = new Calculator();

// set numbers
$cal-&gt;setNumbers(10, 5);

// sum
$result = $cal-&gt;sum();
var_dump($result); // output: int(15)

// sub
$result = $cal-&gt;sub();
var_dump($result); // output: int(5)

// mul
$result = $cal-&gt;mul();
var_dump($result); // output: int(50)

// div
$result = $cal-&gt;div();
var_dump($result); // output: int(2)

// cal object
ver_dump($cal);
</pre>
<p><em>مبحث متد ها موضوع پیچیده ایی نیست و نیاز به توضیحات و تشریح فراوان ندارد شاید به این خاطر قبلا مبحث توابع درک شده است.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://tuts.zanjanlug.org/oop-in-php-methods/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
<!-- WP Super Cache is installed but broken. The path to wp-cache-phase1.php in wp-content/advanced-cache.php must be fixed! -->