برنامه نویسی شیء گرا در php قسمت اول

آوریل 3, 2012 توسط : سعید

برای بیشتر برنامه نویسان php برنامه نویسی شیء گرا یک مفهوم ترسناک و سرشار از کدهای پیچیده تلقی میشه.برنامه نویسی شیء گرا در اصل یک شیوه برنامه نویسی که یک سری اعمال رو داخل کلاسها دسته بندی میکنه برای انسجام بیشتر .در ادامه به مقدمات برنامه نویسی شیء گرا در php میپردازیم.

درک مفهوم برنامه نویسی شیء گرا

برنامه نویسی شیء گرا یک شیوه کد نویسی است که به برنامه نویس ها اجازه میده کارهای مشابه رو در ” کلاسها ” جمع آوری کنن.این روش به ما کمک میکنه تا با اصول DRY (Don`t repeat yourself)  کد نویسی کنیم و همچنین در نگهداری کدها یه ما کمک میکنه.
DRY :  به این معنیست که در یک پروژه برای هر عمل فقط یک بار کد بنویسید.
یکی از اصلی ترین مزیتهای DRY اینه که اگر نیاز باشه قسمتی از پروژه تغییر پیدا کنه معمولا فقط یک قسمت از کدها باید ویرایش بشه.یکی از بزرگترین کابوسهای برنامه نویس ها نگهداری از کدهای نوشته شده است به این معنی که هنگامی که یک سری از کارها به بارها و بارها انجام میشه و هر تغییری که نیاز باشه در کدها داده بشه باید تمام قسمتهای برنامه چک بشه و تغییر داده بشه.
برنامه نویسی شیء گرا سک ترس رو در برنامه نویسها ایجاد میکنه چون یک ساختار جدید از کد نویسی رو معرفی میکنه یا نسبت به برنامه نویسی تابعی (procedural)  یا خطی یک ساختار پیچیده تر رو به نمایش میذاره.
به هر حال وقتی از نزدیک به برنامه نویسی شیء گرا نگاه کنیم میبینیم که خیلی ساده تر و راحت تر میتونیم به اهداف مون برسیم.

مفهوم شیء( Object) و کلاس (class)

قبل از اینکه بتونیم عمیقتر به نکات ظریف برنامه نویسی شیء گرا برسیم لازمه که با تفاوت بین کلاس و شیء آشنا بشیم.

تشخیص تفاوت بین کلاس و شیء

یک کلاس رو میتونیم به ” نقشه یک ساختمان” تشبیه کنیم.این نقشه شکل ساختمان رو روی کاغذ تعریف میکنه.ارتباطات بین اجزای مختلف این ساختمان هم باید در نقشه به صورت کامل بیان بشه.
یک شیء در واقع ” یک ساختمان واقعی” به حساب میاد که از روی نقشه (کلاس) ساخته شده.سازه های استفاده شده داخل این ساختمان مثل آهن،چوب و … اگر بدون در نظر گرفتن نقشه به هم پیوند داده بشن فقط مقدار زیادی از مصالح بی کاربرد هستند.به هر حال هنگامی که با یک نقشه خوب با هم ترکیب میشن یک ساختمان خوب و مفید ساخته خواهد شد.
بیشتر از یک ساختمان (شیء) میتونه ساخته بشه از یک نقشه(کلاس) .
یک شیء یک سری خواص (property) داره و میتونه اعمالی(method) رو انجام بده.
شیء ساختمان یکی از کارهایی که انجام میده محافظت از ما در مقابل باد و بارونه.(Method)
شیء ساختمان یک از خواصی که داره  رنگ نمای بیرونی ساختمانه.(Property)

ساختار کلاس

به صورت زیر میتونیم یک کلاس جدید بسازیم :

[php]
class MyClass
{
// Class properties and methods go here
}[/php]

با استفاده از کلمه کلیدی class سپس نام کلاس و آکولاد بازو بسته!!
بعد از ساخت کلاس با استفاده از کلمه کلیدی new میتونیم این کلاس رو داخل یک متغیر بریزیم.

[php]$obj = new MyClass;[/php]

برای مشاهده محتویات داخل یک کلاس از تابع var_dump() استفاده میکنیم :

[php]var_dump($obj)[/php]

تعریف Properties در یک کلاس

داده های یک کلاس در Property ها یا متغیرهای مخصوص کلاس نگهداری میشن.اینها دقیقا مشابه به متغیرهای معمولی عمل میکنن با این تفاوت که دسترسی به این متغیرها باید به واسطه شیء باشه. property ها در کلاس از قواعد کلی نام گذاری متغیر ها تبعیت میکنن.

[php]

class MyClass
{
public $prop1 = "I’m a class property!";
}
$obj = new MyClass;
var_dump($obj);
[/php]

کلمه کلیدی public نحوه دسترسی به متغیر $porp1 رو در خارج از کلاس مشخص میکنه.در بخشهای بعدیدر مورد نحوه دسترسی ها در شیء گرایی بیشتر صحبت میکنیم.
برای دسترسی به متغیرهای داخل کلاس پس از اینکه یک شیء از یک کلاس ایجاد کردیم به صورت زیر متغیر مورد نظر رو فراخوانی میکنیم :

[php]
echo $obj->prop1 ;
[/php]

کاراکترهای -> به منظور دسترسی به اعضای یک کلاس استفاده میشن.در کد بالا یعنی از شیء $obj متغیر $prop1 رو نمایش بده.میبینید که بعد از -> برای استفاده از متغیر $prop کاراکتر $ حذف شده.
پس از اجرای کد بالا خروجی به شکل زیر خواهیم داشت

I’m a class property!

متدهای یک کلاس

متد در واقع یک تابع است.هنگامی که یک تابع رو درون کلاس مینویسیم به اصطلاح بهش میگیم متد. اقداماتی که یک شیء انجام میده رو داخل متدها تعریف میکنیم.
برای نمونه در کلاس بالا یک متد مینویسیم که مقدار متغیر(خاصیت یا property ) داخل کلاس رو تغییر بده.

[php]
<?php

class MyClass
{
public $prop1 = "I’m a class property!";

public function setProperty($newval)
{
$this->prop1 = $newval;
}

public function getProperty()
{
return $this->prop1 . "<br />";
}
}
$obj = new MyClass;
echo $obj->prop1;
?>
[/php]

در کد بالا میبینیم که ما نیاز داریم به متغیر $prop در متدهای setProperty و getProperty دسترسی داشته باشیم.با استفاده از کلیمه کلیدی $this میتونیم به اعضای داخل کلاس جاری دسترسی داشته باشیم.مثلا در کد بالا برای استفاده از متغیر $prop1 داخل متد getProperty باید از دستور

$this->prop1

استفاده کنیم.این دستور به این معنیه که از همین(this) کلاس متغیرprop1 رو فراخوانی کن.
برای فراخوانی یک متد بعد از ساخت یک شیء از کلاس مثل فراخوانی متغیرهای یک کلاس باید عمل کنیم.

[php]
<?php

class MyClass
{
public $prop1 = "I’m a class property!";

public function setProperty($newval)
{
$this->prop1 = $newval;
}

public function getProperty()
{
return $this->prop1 . "<br />";
}
}

$obj = new MyClass;

echo $obj->getProperty(); // Get the property value

$obj->setProperty("I’m a new property value!"); // Set a new one

echo $obj->getProperty(); // Read it out again to show the change

?>
[/php]

پس از اجرای کد بالا خروجی به شکل زیر خواهید داشت:

[php]
I’m a class property!
I’m a new property value!
[/php]

یکی از قدرت های برنامه نویسی شیء گرا هنگامی مشاهده میشه که از یک کلاس چند نمونه(شیء) ایجاد میشه.

[php]
<?php

class MyClass
{
public $prop1 = "I’m a class property!";

public function setProperty($newval)
{
$this->prop1 = $newval;
}

public function getProperty()
{
return $this->prop1 . "<br />";
}
}

// Create two objects
$obj = new MyClass;
$obj2 = new MyClass;

// Get the value of $prop1 from both objects
echo $obj->getProperty();
echo $obj2->getProperty();

// Set new values for both objects
$obj->setProperty("I’m a new property value!");
$obj2->setProperty("I belong to the second instance!");

// Output both objects’ $prop1 value
echo $obj->getProperty();
echo $obj2->getProperty();

?>[/php]

خروجی

[php]
I’m a class property!
I’m a class property!
I’m a new property value!
I belong to the second instance! [/php]

متدهای جادویی در php

در مورد این متد ها قبلا به صورت مفصل بحث کردیم که میتونید در اینجا مشاهده کنید.

ارث بری

کلاسها میتونن متدها و متغیرها رو از بقیه کلاسها با استفاده از کلمه کلیدی extends  به ارث ببرن.

[php]
<?php

class MyClass
{
public $prop1 = "I’m a class property!";

public function __construct()
{
echo ‘The class "’, __CLASS__, ‘" was initiated!<br />’;
}

public function __destruct()
{
echo ‘The class "’, __CLASS__, ‘" was destroyed.<br />’;
}

public function __toString()
{
echo "Using the toString method: ";
return $this->getProperty();
}

public function setProperty($newval)
{
$this->prop1 = $newval;
}

public function getProperty()
{
return $this->prop1 . "<br />";
}
}

class MyOtherClass extends MyClass
{
public function newMethod()
{
echo "From a new method in " . __CLASS__ . ".<br />";
}
}

// Create a new object
$newobj = new MyOtherClass;

// Output the object as a string
echo $newobj->newMethod();

// Use a method from the parent class
echo $newobj->getProperty();

?> [/php]

خروجی

[php]
The class "MyClass" was initiated!
From a new method in MyOtherClass.
I’m a class property!
The class "MyClass" was destroyed.[/php]

برای تغییر رفتار متغیر یا یک متد که از کلاس دیگه ای به ارث برده شده میتونیم با دوباره نوشتن متد یا متغیر مورد نظر رفتارش رو تغییر بدیم.
به مثال زیر دقت کنید و اجراش کنید تا بیشتر متوجه منظور بشید :

[php]
<?php

class MyClass
{
public $prop1 = "I’m a class property!";

public function __construct()
{
echo ‘The class "’, __CLASS__, ‘" was initiated!<br />’;
}

public function __destruct()
{
echo ‘The class "’, __CLASS__, ‘" was destroyed.<br />’;
}

public function __toString()
{
echo "Using the toString method: ";
return $this->getProperty();
}

public function setProperty($newval)
{
$this->prop1 = $newval;
}

public function getProperty()
{
return $this->prop1 . "<br />";
}
}

class MyOtherClass extends MyClass
{
public function __construct()
{
echo "A new constructor in " . __CLASS__ . ".<br />";
}

public function newMethod()
{
echo "From a new method in " . __CLASS__ . ".<br />";
}
}

// Create a new object
$newobj = new MyOtherClass;

// Output the object as a string
echo $newobj->newMethod();

// Use a method from the parent class
echo $newobj->getProperty();

?> [/php]

خروجی

[php]
A new constructor in MyOtherClass.
From a new method in MyOtherClass.
I’m a class property!
The class "MyClass" was destroyed. [/php]

یادآوری : __CLASS__ یک ثابت هست که نام کلاس جاری رو برمیگردونه.

دسترسی به اعضای کلاس پدر

برای دسترسی به اعضای کلاس پدر باید از کلمه کلیدی parent استفاده کنیم.

[php]
class MyOtherClass extends MyClass
{
public function __construct()
{
parent::__construct(); // فراخوانی سازنده کلاس پدر
echo "A new constructor in " . __CLASS__ . ".<br />";
}

public function newMethod()
{
echo "From a new method in " . __CLASS__ . ".<br />";
}
}
[/php]

استفاده از parent همیشه با دونقطه (::) همراه خواهد بود.

نحوه دسترسی به متدها و خواص(property) های یک کلاس

برای کنترل بیشتر روی اشیاء میتونیم نحوه دسترسی به متدها و متغیرهای یک کلاس رو در خارج از کلاس مشخص کنیم. سه نوع دسترسی برای متغیرها و متدهای یک کلاس وجود داره.
public : متغیرها و متدهایی که public هستند در خارج از کلاس هم میتونیم بهشون دسترسی داشته باشیم.
protected : متغیرها و متدهایی که به صورت protected تعریف بشن فقط در کلاس جاری و در کلاسهای فرزند قابل دسترسی هستند .
private : متغیر ها و متدهای private فقط داخل کلاس جاری در دسترس هستند.
این سطح دسترسی ها برای اینه که ناخواسته (یا خواسته) اجازه نداشته باشیم بعضی از متدها یا متغیر های کلاس رو تغییر بدیم.
ممکنه از خودتون بپرسید که این دسترسی ها به چه دردی میخوره چون خودم میدونم کلاسی که نوشتم رو چجوری استفاده کنم و از چه متدهاییش نباید استفاده کنم؟جواب این سوال اینه که شما فکر کنید قرار یک کلاس برای انجام کارهای معمول با دیتابیس میسازید.این کلاس متغیری داره برای نگهداری کانکشن.هنگامی که این متغیر به صورت public تعریف بشه ممکنه کاربران دیگه ای که میخوان از کلاس شما استفاده کنن خواسته یا نا خواسته بخوان این رشته اتصال رو تغییر بدن.در صورتی که این رشته اتصال نباید به صورت عمومی تعریف بشه تا همه بتونن تغیرش بدن.
به مرور و در آموزشهای آبنده که در مورد برنامه نویسی شیء گرا در PHP قرار میدم با این سطح دسترسی ها بیشتر آشنا خواهید شد.

به امید خدا در آینده به ادامه آموزش برنامه نویسی شیء گرا در PHP میپردازیم .

اگر با سوال یا ابهامی در مورد برنامه نویسی شیء گرا برخوردید در قسمت نظرات یا ازطریق ایمیل بپرسید تا جایی که بتونم سعی میکنم راهنمایی تون کنم.
منبع : http://net.tutsplus.com/tutorials/php/object-oriented-php-for-beginners/
موفق باشید

علیرضا
آوریل 4, 2012 @ 12:21 ق.ظ

خوب ترجمه کردی 🙂

پاسخ
    سعید
    آوریل 5, 2012 @ 1:14 ق.ظ

    خواهش میکنم.ترجمه که نمیشه گفت بیشتر سعی کردم مفهموم رو برسونم

    پاسخ
آوریل 4, 2012 @ 12:07 ب.ظ

خیلی عالیه ممنونیم مرسی

پاسخ
    سعید
    آوریل 5, 2012 @ 2:21 ق.ظ

    خواهش میکنم

    پاسخ
آوریل 6, 2012 @ 12:48 ب.ظ

بسیار عالی
امیدوارم بازهم ادامه داشته باشه

پاسخ
    سعید
    آوریل 7, 2012 @ 12:06 ق.ظ

    خواهش میکنم.به امید خدا و کمک شما دوستان عزیز تمام سعی خودم رو برای ارتقای سطح php و طراحی سایت در ایران میکنم.

    پاسخ
مجید ابراهیمی
آوریل 6, 2012 @ 1:09 ب.ظ

خیلی اقایی قبلا هم بهت گفتم احسنت به شما هنوز وبت مطرح نشده ولی فکر کنم بزودی میای اول گوگل

پاسخ
    سعید
    آوریل 7, 2012 @ 12:04 ق.ظ

    خواهش میکنم شما لطف داری.البته الان هم توی آموزش php اول هستم.

    پاسخ
مریم
آوریل 11, 2012 @ 10:40 ب.ظ

ممنون از آموزش خوبتون.منتظر بقیه اش هستم.

پاسخ
فرهاد زند
آوریل 17, 2012 @ 3:53 ب.ظ

سلام سعید جان

اموزش مفیدی بود اگه نسخه pdf رو هم قرار بدی با همین فرمت که هست عالی میشه

پاسخ
احمدینا
آگوست 12, 2012 @ 8:17 ب.ظ

با سلام می خواستم بدانم در php نیز برای ایجاد constructor می توان از همان نام کلاس استفاده کرد ، چون تست کردم جواب داد می خواستم راهنماییم کنیید که کدام درست تر است .
منظورم از نام کلاس مثلا پیش فرض کلاس app و constructor آن به شکل زیر :
() function app
{

}
با تشکر از شما

پاسخ
    سعید
    آگوست 12, 2012 @ 9:03 ب.ظ

    استفاده از نام کلاس برای سازنده در پی اچ پی قبل از ورژن 5 استفاده میشد و در نسخه 5 متد __constrct معرفی شد.
    حالا اینکه کدومش بهتره به نظر من بهتره از construct استفاده بشه.به خاطر اینکه اگر نام کلاس رو تغییر بدید باید نام متد سازنده رو هم تغییر بدید که اگر پروژه بزرگ و کلاسهای زیادی داشته باشید به مشکل میخورید.

    موفق باشید

    پاسخ
      احمدینا
      آگوست 13, 2012 @ 6:35 ق.ظ

      با تشکر از شما

      پاسخ
ماریا
اکتبر 10, 2012 @ 12:18 ب.ظ

ممنون

پاسخ
سپتامبر 26, 2013 @ 1:17 ق.ظ

بسیار عالی و روان بود…لذت بردم و کلی یاد گرفتم

پاسخ
نوامبر 8, 2013 @ 12:59 ب.ظ

بسیار عالی

وب سایتون اگر فعال تر باشه افراد بیشتری مراجعه می کنند

پاسخ
فوریه 19, 2014 @ 11:39 ق.ظ

خیلی ممنون از مطالب خوبتون

پاسخ
فوریه 24, 2014 @ 6:24 ب.ظ

سلام وخسته نباشد
ببخشید میشه در مورد کلاس تمپلیت اموزش بزارید؟

پاسخ
    سعید
    فوریه 25, 2014 @ 9:08 ق.ظ

    سلام
    ممنون
    چشم حتما در اولين فرصت ميذارم

    پاسخ
فوریه 26, 2014 @ 12:28 ب.ظ

سلام خیلی خوب ترجمه می کنید

اگه فریم ورک yii رو به صورت پروژه محور شروع کنید خیلی خوب میشه.

پاسخ
حسین
می 13, 2014 @ 11:48 ب.ظ

عالی بود ممنون از زحمتی که کشیدی 🙂

پاسخ
احسان
می 28, 2014 @ 2:23 ق.ظ

سلام.
کارت درسته فقط سایزه این کدها رو بزرگ تر کن یکم و چپ چین کن تا بهتر دیده بشن .مادر چشامون ****** شد 🙂

پاسخ
احسان
می 28, 2014 @ 2:41 ق.ظ

ham diraction=”ltr” ham text-align=”left”.ok mishe ostad

پاسخ
مژده
جولای 12, 2014 @ 11:02 ق.ظ

سلام. خسته نباشی. ممنون از آموزش خوبت

پاسخ
جولای 16, 2014 @ 11:45 ق.ظ

آموزش راحت-کاربردی و ساخت یافته ای بود .ممنونم

پاسخ
رضا
ژانویه 24, 2015 @ 7:32 ب.ظ

مجدداً عالی ، مثل همیشه!

پاسخ
Mohsen
می 7, 2015 @ 10:56 ب.ظ

سپاس بابت مطالب بسیار خوب و ارزنده ای که ارائه داشتید؛ خیلی مفید و کاربردی بود.
بسیار ممنونم.

پاسخ
فاطمه
می 26, 2015 @ 9:15 ق.ظ

بسیار عالی و کاربردی.ممنون

پاسخ
هانیه
اکتبر 8, 2015 @ 11:23 ق.ظ

خدا خیرتون بده مطالبتون عالی بود.

پاسخ
جواد
دسامبر 29, 2015 @ 12:58 ق.ظ

عالی عالی عالی…
ان شا الله همینطور به کارتون ادامه بدید

پاسخ
فوریه 2, 2016 @ 10:01 ق.ظ

عالی بود …فقط اگه میشه در مورد انواع کلاس و اونواع متد و کاربردشون هم توضیح بدین که مطلب کامل بشه

پاسخ
sh
مارس 23, 2016 @ 11:03 ب.ظ

دستتون درد نکنه خیلی خوب بود فقط قسمت 2 نداره؟

پاسخ
محمد مهدی قریشی
ژوئن 12, 2016 @ 10:04 ب.ظ

بسیار متشکرم از آموزش شما

پاسخ
موسی
آگوست 4, 2016 @ 9:26 ق.ظ

سلام

آفرین خیلی خوب و قابل فهم بود . ممنون

پاسخ

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *


*