برنامه نویسی شی گرا در php (توضیحات کامل)
برنامه نویسی شی گرا، یا برنامه نویسی oop، یک روش یا سبک برنامه نویسی است که در آن توسعه دهنده تمامی متغیرها و توابعی که در کنار هم عملیاتی را انجام می دهند را در قالب یک کلاس واحد سازمان دهی می کند. لازم به توضیح است که تکنیک برنامه نویسی شی گرا به مراتب کارا و پیچیده تر از سبک برنامه نویسی مبتنی بر تابع (procedural) است.
دلایل برتری برنامه نویسی شی گرا :
- قابلیت سازمان دهی بهینه تر کد
- قابلیت تقسیم برنامه به برنامه های کوچک تر اما مستقل. برنامه ی اصلی به صورت یک exe در می آید که دیگر قسمت های مستقل برنامه را فراخوانی می کند (modularity).
- عدم نیاز به نوشتن کدهای تکراری و قابلیت هایی که قبلا پیاده سازی شده اند و صرف جویی در استفاده از منابع.
با این وجود، بسیاری از توسعه دهندگان سعی می کنند در پروژه های کوچک و ساده خود از سبک برنامه نویسی مبتنی بر تابع (procedural) بهره بگیرند.
اما همین که پروژه بزرگتر می شود، بهتر است به منظور نوشتن یک برنامه ی کارآمد و رقم زدن تجربه ی کاربری بهینه، از تکنیک برنامه نویسی شی گرا برای ساخت و توسعه ی پروژه استفاده شود.
برنامه نویسی شی گرا چیست؟
در گذشته قبل از اینکه مفهوم شی گرایی وارد زبان php شود، برنامه نویس ها مجبور بودند php را در کنار html استفاده کنند که این روش در پروژه های کوچک مشکل بزرگی محسوب نمی شد اما زمانی که صحبت از ساخت برنامه های متوسط و بزرگ به میان می آمد کار یکم سخت تر می شد چون اینطور برنامه نویسی هر چقدر هم مدیریت شده باشد، دارای کدنویسی اسپاگتی و کثیفی است که مدیریت و توسعه آن را نسبت به برنامه نویسی شی گرا خیلی دشوارتر می کند.
یک مثال از php بطور معمولی :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<?php // Connect to Database ?> <!DOCTYPE html> <html> <head> <title>Document</title> </head> <body> </body> </html> |
برنامه نویسی شی گرا یا به اختصار oop که مخفف Object-Oriented Programming می باشد، به شما اجازه می دهد در کدهای خود تقسیم بندی های متفاوتی انجام دهید و کدهای php و html را تا حد زیادی از هم جدا کنید و همین کار باعث می شود تا مدیریت روی کدهای php فوق العاده بالا رود. البته خیلی دلایل دیگر نیز وجود دارد که خارج از حوصله این مقاله است. خب حالا برویم سراغ توضیح مفهوم oop .
اصل برنامه نویسی oop سعی دارد تا دنیایی واقعی را برای شما شبیه سازی کند. یعنی هر چیزی که شما در دنیای اطرف می بینید را می توانید به این مفهوم ارتباط بدهید و بسازید. من خودم با یک مثال با مفهوم oop آشنا شدم . در ادامه برای شما هم توضیح خواهم داد و امیدوارم به شما هم در درک بهتر این مفهوم کمک کند.
فرض کنید می خواهید خانه ای بسازید. قبل از ساخت این خانه نیاز به نقشه ای برای ساخت آن دارید. زمانی که نقشه را آماده می کنید و از روی آن خانه ای را می سازید، فکر می کنید کار نقشه تمام شده یا می توان از روی آم خانه های دیگری ساخت؟ در برنامه نویسی oop هم دقیقا به همین صورت عمل می شود.
شما می توانید از یک کد نوشته شده در بخش های دیگر به راحتی استفاده کنید بدون اینکه دوباره کل کد را از اول بنویسید. دقیقا برعکس کاری که در php بدون استفاده از مفهوم oop به دفعات زیاد می توانید مشاهده کنید که تکرار کد ها چقدر می تواند زیاد باشد.
کلاس ها و شی ها در برنامه نویسی شی گرا
در شی گرایی دو مفهوم مهم ابتدایی و پایه ای وجود دارد. کلاس ها و شی ها. یک کلاس (class) دقیقا مثل همان نقشه ای است که به کمک آن می توان خانه ای را ساخت. نقشه ای که از کنار هم قرار دادن اجزای متفاوتی ساخته می شود.
این اجزا همان کلاس ها هستند. مثل چی؟ مثل کلاس در ، پنجره ، سیم و … که هر کدام دارای ویژگی های مخصوص به خود هستند و با ترکیب آنها با یکدیگر می توان یک خانه ساخت.
یک شی (object) مثل خانه ای واقعی است که از روی نقشه آماده شده ساخته می شود. یعنی دقیقا اول نقشه با استفاده از کلاس ها یا همان اجزایی مثل در ، پنجره ، سیم ، بتن و .. که هر کدام برای خود یک کلاس هستند، به هم متصل و آماده می شوند و بعد از آن با استفاده از نقشه خانه واقعی ساخته می شود.
دقت داشته باشید که تقریبا همه کلاس ها از یکدیگر جدا هستند و همین موضوع آنها را سازمان یافته تر کرده و استفاده از آنها را ساده تر می کند. خب امیدوارم که با این دو مفهوم آشنا شده باشید. حالا اجازه بدهید تا بصورت دقیق تری شما را با ساختار کلاس ها در php آشنا کنم.
ساختار کلاس ها در برنامه نویسی شی گرا
در php یک کلاس با کلمه کلیدی (class) به وجود می آید و با یک اسپیس و تایپ یک اسم شما اسم آن کلاس را تعریف می کنید و در نهایت با قرار دادن براکت های باز و بسته ( { } ) کار یک class را شروع می کنید . برای مثال :
1 2 3 4 5 6 7 8 |
<?php class MyClass { // class propertys and methods go here; } ?> |
1 |
$obj = new MyClass; |
1 |
var_dump($obj) |
1 |
object(MyClass)#1 (0) { } |
درادامه میخواهیم در مورد property ها و همینطور method ها در کلاس صحبت کنیم و توضیح بدهیم که دقیقا چه هستند و چه کاربردهایی دارند. ابتدا از property ها شروع می کنیم.
property در برنامه نویسی شی گرا چیست؟
برای اضافه کردن اطلاعات در کلاس ها از property ها استفاده می شود. کار آنها دقیقا شبیه متغیرها در php معمولی است و تنها تفاوت آنها این است که قبل از تایپ اسم property از کلمات کلیدی private , protected و public استفاده می شود. این کلمات کلیدی را در کپسوله سازی (پنهان سازی) بطور کامل توضیح خواهم داد فقط فعلا در همین حد بدانید که این کلمات باید برای تعریف property ها و method ها قبل از اسم آنها قرار بگیرند.
به مثال زیر دقت کنید:
1 2 3 4 5 6 7 8 9 10 11 12 |
<?php class MyClass { public $name = 'john doe'; } $obj = new MyClass; var_dump($obj); ?> |
در بالا با استفاده از کلمه public تعیین کردیم که property برای استفاده در یک object قابل مشاهده است و همینطور property به اسم name$ تعریف و بعد آن را مقدار دهی کردیم و بعد با تعریف یک شی و قرار دادن آن در var_dump اطلاعات کامل را برگشت دادیم .
شما به راحتی می توانید بعد از تعریف شی دوباره property را مقداردهی کنید. البته تنها در حالتی که property مورد نظر از نوع public باشد و همینطور به راحتی می توانید آن را با استفاده از echo چاپ کنید. البته برای چاپ یا مقداردهی دوباره، نیاز به دسترسی به آن property از طریق object دارید. برای اینکار بعد از تایپ اسم object با قرار دادن یک فلش ( <- ) و تایپ اسم property می توانید به آن دسترسی داشته باشید . به مثال زیر توجه کنید :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<?php class MyClass { public $name = 'John Doe'; } $obj = new MyClass; echo $obj->name . '</br >'; $obj->name = 'Hesam Mousavi'; echo $obj->name ; ?> |
بعد از اجرای فایل test.php می توانید نتیجه زیر را مشاهده کنید :
1 2 |
John Doe Hesam Mousavi |
method در برنامه نویسی شی گرا چیست؟
method ها دقیقا کار توابع را در کلاس ها انجام می دهند. یعنی تفاوت چندانی با هم ندارند. method ها نیز با قرار گرفتن کلمات کلیدی private , protected و public قبل از function تعریف می شوند. یک method می تواند به شی ها کمک کند که در داخل کلاس ها عملیاتی را انجام دهند البته این عملیات توسط متدها مشخص می شوند.
برای مثال متدهایی را برای set و get کردن اطلاعات property داخل کلاس می نویسیم. به کد زیر دقت کنید :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
<?php class MyClass { public $name = 'John Doe'; public function setProperty($newval) { $this->name = $newval; } public function getProperty() { return $this->name . "</br >"; } } $obj = new MyClass; echo $obj->name; ?> |
نکته : در کد بالا ما در دو قسمت از this$ استفاده کردیم و بعد با یک فلش و قرار دادن اسم property به آن دسترسی پیدا کردیم. در اصل این طریقه دسترسی به property ها و method ها در داخل یک method است . چون بطور معمولی شما نمی توانید فقط با تایپ اسم property یا method به آن دسترسی داشته باشید. تنها زمانی که از this$ و با روش بالا عمل کنید می توانید به یک property و method از یک کلاس داخل یک method دسترسی پیدا کنید .
من در کد بالا فقط با قرار دادن obj->name$ مقدار این property را چاپ کردم اما در مثال زیر من ابتدا با استفاده از متد getProperty مقدار فعلی name$ را چاپ می کنم و بعد در مرحله بعدی با استفاده از متد setProperty و ارسال یک مقدار به عنوان آرگومان یک مقدار جدید برای name$ تعیین می کنم و بعد دوباره با چاپ کردن متد getProperty میام مقدار فعلیش رو چاپ می کنیم.
این یک روش مهم برای set و get کردن property هاست که به زودی در ادامه دلیل آن را متوجه خواهید شد اما فعلا از دید امتحان کردن یک متد به آن نگاه کنید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
<?php class MyClass { public $name = "John Doe"; public function setProperty($newval) { $this->name = $newval; } public function getProperty() { return $this->name . "<br />"; } } $obj = new MyClass; echo $obj->getProperty(); // Get the property value $obj->setProperty("Hesam Mousavi"); // Set a new one echo $obj->getProperty(); // Read it out again to show the change ?> |
1 2 |
John Doe Hesam Mousavi |
به مثال زیر دقت کنید :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
<?php class MyClass { public $name = "John Doe"; public function setProperty($newval) { $this->name = $newval; } public function getProperty() { return $this->name . "<br />"; } } // Create two objects $obj = new MyClass; $obj2 = new MyClass; // Get the value of $name from both objects echo $obj->getProperty(); echo $obj2->getProperty(); // Set new values for both objects $obj->setProperty("I'm a new name! Mohammad"); $obj2->setProperty("obj 2 with name Ali"); // Output both objects' $name value echo $obj->getProperty(); echo $obj2->getProperty(); ?> |
نتیجه زیر حاصل از اجرای کد بالاست :
1 2 3 4 |
John Doe John Doe I'm a new name! Mohammad obj 2 with name Ali |
همانطور که در بالا می بینید شما با استفاده از oop می توانید از یک قطعه کد بارها و بارها در قالب اشیاء مختلف استفاده کنید.
Encapsulation (کپسوله سازی)
اولین باری که این اسم را می بینید تعجب می کنید و از خود می پرسید یعنی چی میتونه باشه! راستش برای من هم خیلی عجیب بود ولی وقتی معنی کپسوله سازی را متوجه شوید، دیگر فهم آن ساده می شود.
کپسوله سازی همان پنهان سازی اطلاعات است اما ما چرا باید اطلاعاتی را پنهان سازی کنیم. اگر خاطرتان باشد در بخش من دو مورد method به اسم های set و get درست کردم که هر کدام کار خودشان را انجام می دادند.
یعنی یکی مقداردهی property را انجام می داد و دیگری مقدار property را برمی گرداند اما چرا باید اینطور باشد؟ این سوالی است که من هم داشتم چون ما به راحتی می توانیم از خود property استفاده کنیم و مقداردهی را چاپ کنیم اما این درست نیست.
گاهی property ها و method های حساسی وجود دارد که قابل استفاده در object ها نیستند! چرا؟ چون پنهان سازی شده اند. اگر یادتان باشد کمی قبل تر سه کلمه کلیدی public , private و protected را معرفی کردم اما فقط از public استفاده کردم و گفتم در ادامه توضیح می دهم این ها چه فوایدی دارند. اجازه دهید با تعریف کردن هر کدام از این ها به نتیجه برسیم.
protected : اگر قبل از property یا method از این کلمه استفاده شود به این معنی است که شما از آن property و method فقط در کلاس ها می توانید استفاده کنید و اصلا نمی توانید در object ی که می سازید از آن استفاده کنید. (البته با روش های خاص می شود.)
private : اگر قبل از property یا method از این کلمه استفاده شود به این معنی است که شما از آن property و method فقط و فقط می توانید در داخل همان کلاس استفاده کنید و پس یعنی قابلیت استفاده در object را هم ندارید. private شبیه protected است اما استفاده نشدن در کلاس های دیگر بین آنها ایجاد تفاوت می کند.
و در نهایت public : اگر قبل از property یا method از این کلمه استفاده شود به این معنی است که شما از آن property و method به راحتی می توانید در کلاس ها و object ها استفاده کنید. به همین سادگی…
خب حالا شاید شما با خودتان بگویید این ها که فقط تعریف بودند و ما هنوز مقهوم کپسوله سازی رو دقیقا متوجه نشدیم. شما گاهی می خواهید اطلاعاتی را به نسبت حساسیت آن از object یا کلاس های دیگر مخفی کنید. برای همین به نسبت کاری که قرار است انجام دهید از private یا protected استفاده می کنید تا دیگر در object ها قابلیت استفاده نداشته باشند.
خب حالا فکر کنم باید متوجه شده باشید چرا از method های set و get استفاده کردیم ولی هر موضوعی با مثال واضح تر می شود پس به مثال های زیر دقت کنید تا بیشتر این مساله را درک کنید :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<?php class MyClass { public $name = 'John Doe'; } $obj = new MyClass; echo $obj->name . '</br >'; $obj->name = 'Hesam Mousavi'; echo $obj->name ; ?> |
این همان مثالی است که کمی قبل تر هم به آن اشاره کردم. در این مثال property از نوع public است و به همین دلیل با ساخت object به راحتی می توانید از خود object هم عمل مقداردهی دوباره و هم مقدار فعلی آن را برگشت دهبد. حالا به مثال زیر هم دقت کنید :
1 2 3 4 5 6 7 8 9 10 11 12 |
<?php class MyClass { protected $name = 'John Doe'; } $obj = new MyClass; echo $obj->name; ?> |
در بالا property از نوع protected برای همین در object نه می توانید مقداردهی کنید و نه می توانید مقدار فعلی را بر گردانید. در واقع اگه کد بالا را اجرا کنید، ارور دریافت خواهید کرد.
اما در مثال زیر با استفاده از متدهای get و set به راحتی یک property که از نوع protected باشد را می توانیم مقدار دهی کنیم و یا مقدار فعلی آن را برگشت دهیم.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
<?php class MyClass { protected $name = "John Doe"; public function setProperty($newval) { $this->name = $newval; } public function getProperty() { return $this->name . "<br />"; } } $obj = new MyClass; echo $obj->getProperty(); // Get the property value $obj->setProperty("Hesam Mousavi"); // Set a new one echo $obj->getProperty(); // Read it out again to show the change ?> |
منبع : راکت | roocket.ir
دیدگاهتان را بنویسید
برای نوشتن دیدگاه باید وارد بشوید.