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

فروردین ۱۵, ۱۳۹۱ توسط : سعید

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

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

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

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

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

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

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

ساختار کلاس

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

class MyClass
{
// Class properties and methods go here
}

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

$obj = new MyClass;

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

var_dump($obj)

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

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


class MyClass
{
public $prop1 = "I'm a class property!";
}
$obj = new MyClass;
var_dump($obj);

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

echo $obj->prop1 ;

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

I’m a class property!

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

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

<?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;
?>

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

$this->prop1

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

<?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

?>

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

I'm a class property!
I'm a new property value!

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

<?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();

?>

خروجی

I'm a class property!
I'm a class property!
I'm a new property value!
I belong to the second instance! 

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

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

ارث بری

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

<?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();

?> 

خروجی

The class "MyClass" was initiated!
From a new method in MyOtherClass.
I'm a class property!
The class "MyClass" was destroyed.

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

<?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();

?> 

خروجی

A new constructor in MyOtherClass.
From a new method in MyOtherClass.
I'm a class property!
The class "MyClass" was destroyed. 

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

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

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

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 />";
}
}

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

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

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

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

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

بازدید : ۲۳۶۵۳

علیرضا
فروردین ۱۶, ۱۳۹۱ @ ۱۲:۲۱ ق.ظ

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

پاسخ دادن
    سعید
    فروردین ۱۷, ۱۳۹۱ @ ۱:۱۴ ق.ظ

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

    پاسخ دادن
فروردین ۱۶, ۱۳۹۱ @ ۱۲:۰۷ ب.ظ

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

پاسخ دادن
    سعید
    فروردین ۱۷, ۱۳۹۱ @ ۲:۲۱ ق.ظ

    خواهش میکنم

    پاسخ دادن
فروردین ۱۸, ۱۳۹۱ @ ۱۲:۴۸ ب.ظ

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

پاسخ دادن
    سعید
    فروردین ۱۹, ۱۳۹۱ @ ۱۲:۰۶ ق.ظ

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

    پاسخ دادن
مجید ابراهیمی
فروردین ۱۸, ۱۳۹۱ @ ۱:۰۹ ب.ظ

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

پاسخ دادن
    سعید
    فروردین ۱۹, ۱۳۹۱ @ ۱۲:۰۴ ق.ظ

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

    پاسخ دادن
مریم
فروردین ۲۳, ۱۳۹۱ @ ۱۰:۴۰ ب.ظ

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

پاسخ دادن
فرهاد زند
فروردین ۲۹, ۱۳۹۱ @ ۳:۵۳ ب.ظ

سلام سعید جان

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

پاسخ دادن
احمدینا
مرداد ۲۲, ۱۳۹۱ @ ۸:۱۷ ب.ظ

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

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

پاسخ دادن
    سعید
    مرداد ۲۲, ۱۳۹۱ @ ۹:۰۳ ب.ظ

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

    موفق باشید

    پاسخ دادن
      احمدینا
      مرداد ۲۳, ۱۳۹۱ @ ۶:۳۵ ق.ظ

      با تشکر از شما

      پاسخ دادن
ماریا
مهر ۱۹, ۱۳۹۱ @ ۱۲:۱۸ ب.ظ

ممنون

پاسخ دادن
مهر ۴, ۱۳۹۲ @ ۱:۱۷ ق.ظ

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

پاسخ دادن
آبان ۱۷, ۱۳۹۲ @ ۱۲:۵۹ ب.ظ

بسیار عالی

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

پاسخ دادن
بهمن ۳۰, ۱۳۹۲ @ ۱۱:۳۹ ق.ظ

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

پاسخ دادن
اسفند ۵, ۱۳۹۲ @ ۶:۲۴ ب.ظ

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

پاسخ دادن
    سعید
    اسفند ۶, ۱۳۹۲ @ ۹:۰۸ ق.ظ

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

    پاسخ دادن
اسفند ۷, ۱۳۹۲ @ ۱۲:۲۸ ب.ظ

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

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

پاسخ دادن
حسین
اردیبهشت ۲۳, ۱۳۹۳ @ ۱۱:۴۸ ب.ظ

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

پاسخ دادن
احسان
خرداد ۷, ۱۳۹۳ @ ۲:۲۳ ق.ظ

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

پاسخ دادن
احسان
خرداد ۷, ۱۳۹۳ @ ۲:۴۱ ق.ظ

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

پاسخ دادن
مژده
تیر ۲۱, ۱۳۹۳ @ ۱۱:۰۲ ق.ظ

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

پاسخ دادن
تیر ۲۵, ۱۳۹۳ @ ۱۱:۴۵ ق.ظ

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

پاسخ دادن
رضا
بهمن ۴, ۱۳۹۳ @ ۷:۳۲ ب.ظ

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

پاسخ دادن
Mohsen
اردیبهشت ۱۷, ۱۳۹۴ @ ۱۰:۵۶ ب.ظ

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

پاسخ دادن
فاطمه
خرداد ۵, ۱۳۹۴ @ ۹:۱۵ ق.ظ

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

پاسخ دادن
هانیه
مهر ۱۶, ۱۳۹۴ @ ۱۱:۲۳ ق.ظ

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

پاسخ دادن
جواد
دی ۸, ۱۳۹۴ @ ۱۲:۵۸ ق.ظ

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

پاسخ دادن
بهمن ۱۳, ۱۳۹۴ @ ۱۰:۰۱ ق.ظ

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

پاسخ دادن
sh
فروردین ۴, ۱۳۹۵ @ ۱۱:۰۳ ب.ظ

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

پاسخ دادن
محمد مهدی قریشی
خرداد ۲۳, ۱۳۹۵ @ ۱۰:۰۴ ب.ظ

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

پاسخ دادن
موسی
مرداد ۱۴, ۱۳۹۵ @ ۹:۲۶ ق.ظ

سلام

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

پاسخ دادن

پاسخ دهید

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


*