برنامه نویسی شیء گرا PHP – ضمیمه 5: قسمت پایانی

درسنامه درس 15 از سری شی گرایی در PHP
php-oop-last-part

با عرض سلام و خسته نباشید خدمت شما که تا این قسمت، یعنی قسمت پایانی، از سری آموزشی برنامه نویسی شیء گرای PHP با ما همراه بودید. شما تا این قسمت با تمام مفاهیم اصلی و پایه و حتی اکثر مفاهیم پیشرفته ی برنامه نویسی شیء گرا در PHP آشنا شده اید و برای خودتان یک برنامه نویس حرفه ای هستید!

اما یادتان باشد که تنها خواندن این تمرینات به شما هیچ کمکی نمی کند، بلکه باید کد نویسی کنید؛ برای خود پروژه های فرضی تعریف کنید و آن ها را پیاده سازی نمایید، کد های دیگران را بررسی و بازنویسی کنید و آن قدر بنویسید که دیگر برای نوشتن کد، نیازی به نگاه کردن به هیچ آموزشی نداشته باشید. در این صورت شما می توانید وارد بازار کار شوید!

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

متدهای جادویی (magic methods)

متدهای جادویی نوع خاصی از متدهای رزرو شده توسط PHP هستند که با دو آندرلاین شروع می شوند.

چرا به آن ها جادویی میگوییم؟ به این خاطر که این متدها در موقعیت های خاصی به صورت خودکار صدا زده می شوند. ما میخواهیم چند مورد از متدهای جادویی را به طور خلاصه با هم مرور کنیم:

متد constructــ

این متد جادویی زمانی صدا زده می شود که یک شیء ساخته شود (در جلسات قبل در مورد این متد صحبت کردیم، رجوع کنید به این مقاله). مثال:

class Animal{

  public function __construct() {
    $this->created = time();
    $this->logfile_handle = fopen('/tmp/log.txt', 'w');
  }

}

متد destructــ

این متد دقیقا برعکس constructor عمل می کند و زمانی صدا زده می شود که شیء نابود شود. مثال:

class Animal{

  public function __construct() {
    $this->created = time();
    $this->logfile_handle = fopen('/tmp/log.txt', 'w');
  }

  public function __destruct() {
    fclose($this->logfile_handle);
  }
}

متد toStringــ

اگر یادتان باشد در PHP نمی توان آرایه ها را با دستور هایی مانند echo یا print چاپ کرد.

اگر چنین دستور هایی را برای اشیاء به کار ببرید نتیجه بدتر خواهد بود.

مشکل اینجاست که در برخی از مواقع نیاز داریم تا اشیاء را به شکل رشته ببینیم.

اینجا PHP با ارائه ی این متد با ما کمک می کند! اینکه این متد چه قسمتی از شیء را به صورت رشته برمیگرداند کاملا به ما بستگی دارد. چرا که ما چنین چیزی را به این متد دیکته می کنیم.

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

class Ch2_Book extends Ch2_Product
{
// متدها و خصوصیات از قبل تعریف شده
public function __toString()
{
return $this->_title;
}
}

در این مثال به متد ()toString__ دستور دادیم که title (عنوان) کتاب را به صورت رشته ای به ما برگرداند. شما می توانید این کد را بر اساس نیاز خودتان تغییر دهید.

نکته: در داخل این متد از دستوراتی مثل echo و print استفاده نکنید. این متد باید رشته را برگرداند (return) نه اینکه نمایش دهد.

متد cloneــ

از PHP5 به بعد زمانی که یک شیء را به یک متغیر نسبت می دهید، آن شیء برای متغیر کپی نمی شود بلکه به نوعی یک ارجاع به شیء اصلی است. این مثال را در نظر بگیرید:

$x = new MyObject();
$y = $x;

از آنجایی که انتساب شیء به متغیر فقط یک ارجاع است هر تغییری که در شیء y بدهیم در شیء x هم ایجاد می شود. برای حل این مشکل می توانید از شیء خود کپی بگیرید تا هنگام انتساب یک کپی جداگانه به متغیر داده شود، نه یک ارجاع. مثال:

$y = clone $x;

به مثال زیر دقت کنید. در این مثال می خواهیم برای هر دستگاهی که ساخته می شود یک باتری جداگانه داشته باشیم (ارجاعی نباشد):

class Device {
    ...
    public function  __clone() {
        // شی خود را کپی می کنیم
        $this->battery = clone $this->battery;
    }
    ...
}

حالا می توانیم برای هر دستگاهی که ساخته می شود یک باتری جداگانه در نظر بگیریم.

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

کامنت های DocBlock

کامنت های DocBlock در حالی که به صورت رسمی جزوی از PHP نیستند اما به صورت گسترده توسط برنامه نویسان استفاده می شوند. ساختار کلی کامنت های DocBlock به شکل زیر است:

/**
 * This is a very basic DocBlock
 */

دلیل اصلی استفاده از این کامنت ها قدرت آن ها در استفاده از تگ ها است.

این تگ ها که با علامت @ شروع می شوند به توسعه دهندگان اجازه می دهند نویسنده ی یک فایل را مشخص کنید، موارد قانونی و مربوط به لایسنس یک اسکریپت را مشخص کنید، اطلاعاتی راجع به متدها یا خصوصیات ارائه دهید و بسیاری دیگر از اطلاعات مفید...

شایع ترین تگ های DocBlock عبارتند از:

author@: نویسنده ی عنصر فعلی (چه کلاس باشد، چه متد، چه قسمتی از کد و ...) را مشخص می کند

copyright@: موارد مربوط به کپی رایت و سال کپی رایت را ذکر می کند.

license@: لینک لایسنس عنصر فعلی را مشخص می کند. ساختار این لایسنس باید به شکل زیر باشد:

http://www.example.com/path/to/license.txt License Name

var@: نوع و توضیحات مربوط به یک متغیر را ذکر می کند.

param@: نوع و توضیحات مربوط به یک پارامتر را ذکر می کند.

return@: نوع و توضیحات مربوط به مقدار برگردانده شده (return) را ذکر می کند.

تمام این موارد را در مثال زیر می بینید:

<?php
 
/**
 * A simple class
 *
 * This is the long description for this class,
 * which can span as many lines as needed. It is
 * not required, whereas the short description is
 * necessary.
 *
 * It can also span multiple paragraphs if the
 * description merits that much verbiage.
 *
 * @author Jason Lengstorf <jason.lengstorf@ennuidesign.com>
 * @copyright 2010 Ennui Design
 * @license http://www.php.net/license/3_01.txt PHP License 3.01
 */
class SimpleClass
{
  /**
   * A public variable
   *
   * @var string stores data for the class
   */
  public $foo;
 
  /**
   * Sets $foo to a new value upon class instantiation
   *
   * @param string $val a value required for the class
   * @return void
   */
  public function __construct($val)
  {
      $this->foo = $val;
  }
 
  /**
   * Multiplies two integers
   *
   * Accepts a pair of integers and returns the
   * product of the two.
   *
   * @param int $bat a number to be multiplied
   * @param int $baz a number to be multiplied
   * @return int the product of the two parameters
   */
  public function bar($bat, $baz)
  {
      return $bat * $baz;
  }
}
 
?>

اما کلام پایانی و سوالاتی که اکثر دانشجویان از من میپرسند:

آیا این پایان برنامه نویسی شیء گرا است؟

خیر! برنامه نویسی شیء گرا دنیای بزرگی است و ذکر تمام جزئیات و تک تک موارد در یک آموزش نمی گنجد. این سری آموزشی بستر مناسبی برای پیشرفت شما فراهم کرد کما اینکه حدود 70 تا 80 درصد مطالب اصلی برنامه نویسی شیء گرا در PHP را یاد گرفته اید.


آیا دیگر دوره/مقاله ای در زمینه ی برنامه نویسی شیء گرای PHP نخواهیم داشت؟

حالا که این دوره به اتمام رسیده، سعی بنده این است که یک دوره ی کوتاه در رابطه با رابط PDO (ارتباط شیء گرا با پایگاه داده) را منتشر کنم. از طرفی ممکن است برخی از مطالب برنامه نویسی شیء گرا را به صورت مقالات جداگانه بنویسم چرا که جای مناسبی در این دوره ی آموزشی (که از صفر شروع میکند) برای آنها ندیدم. بنابراین هنوز دوره ها یا مقالاتی مانده است که ممکن است در آینده و به تدریج تقدیم شما شود.


وضعیت بازار کار برای برنامه نویسی شیء گرا چطور است؟

اگر بخواهید در شرکت های بزرگ استخدام شوید معمولا اکثر آن ها از شما میپرسند که آیا با برنامه نویسی شیء گرا آشنایی دارید یا خیر. چرا؟ به این دلیل که پروژه های شرکتی و بزرگ (مانند روکسو، دیجی‌کالا و امثال آن) با برنامه نویسی رویه ای جلو نمی رود. نوشتن چنین پروژه هایی به صورت ساده و رویه ای (در صورتی که با زبان PHP باشد) عملا خودکشی برای تیم برنامه نویسی محسوب می شود! با یاد گرفتن PHP به صورت شیء گرا نه تنها از مزایای طبیعی آن (امنیت، افزایش سرعت کدنویسی، نظم و ...) برخوردار می شوید بلکه در بازار کار جایگاه بهتری پیدا می کنید.


اگر شیء گرا بنویسم دیگر به برنامه نویسی رویه ای احتیاجی ندارم؟

برخی اوقات استثنائاتی وجود دارند و ممکن است ما استفاده از برنامه نویسی رویه ای را در برخی از پروژه ها یا حتی در قسمتی از پروژه های شیء گرا ترجیح بدهیم. با اینکه چنین موقعیت هایی بسیار کم پیش می آیند اما نمی توان گفت همیشه و 100% از تمام و تک تک برنامه ها و پروژه های شما شیء گرا خواهند بود!


در آخر از شما متشکرم که تا این قسمت همراه بنده بوده اید. به شما توصیه می کنم به آموزش های دیگر دوستان بنده در این وب سایت حتما سری بزنید و از آن ها استفاده کنید. برخی از دوره ها و مقالات خوب دیگر در این وب سایت را که از نظر خودم برای شما بسیار مفید خواهد بود، لینک می کنم:

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

در پناه حق.

تمام فصل‌های سری ترتیبی که روکسو برای مطالعه‌ی دروس سری شی گرایی در PHP توصیه می‌کند:
نویسنده شوید
دیدگاه‌های شما (9 دیدگاه)

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

Ali m
20 اسفند 1400
سلام و خسته نباشید واقعا اموزش هاتون خیلی خوب و کاربردی بودن مطالب به بهترین نجوه ممکن توضیح داده شده بود و مثال های خوبی هم زده شده بود و روند اموزشی هم کاملا صحیح و درست بوده از نظر من تشکر از شما و بقیه همکارانتون ♥ به شدت جای خالی همچین اموزش های خوبی توی وب فارسی حس میشه

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

روکسو
12 اردیبهشت 1401
سلام. از اینکه باعث دلگرمی ما هستید، متشکریم.

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

محمد
29 تیر 1400
با سلام و خسته نباشید.آموزش بسیار خوبی هست.تشکر از زحمات شما

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

رضا
29 بهمن 1399
شیئ گرایی یک کوه بزرگ بود برام، خیلی راحت و کاربردی این مشکل رو برام حل کردید، ممنون

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

سجاد
12 بهمن 1399
خیلی عالی و مفهومی توضیح دادید. تشکر

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

Nima
18 مرداد 1399
سپاس

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

امیر
03 خرداد 1399
خیلی عالی و مفهومی توضیح دادید. تشکر

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

star
27 فروردین 1399
سلام من یه پروژه دارم که باید توی اون با استفاده از کد ملی اطلاعات افراد رو مثل نام نام خانوادگی و ... رو پیدا کنم ممنون میشم منو راهنمایی کنید

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

sajjadVa22
20 بهمن 1397
سلام کی namespace ها رو توضیح میدید؟ من مشتاق این بحث هستم

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

امیر زوارمی
20 بهمن 1397
سلام دوست عزیز، در حال بررسی هستم. بین یک موضوع دیگه و namespace ها هنوز انتخاب نکردم اما به هر حال به زودی اون ها هم منتشر میشن.

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

Ahmad Tavakoli
29 دی 1397
خیلی باحالین! دمت گرم اموزشا عالی بودن...ولی کی می خوای در مورد pdo بنویسی/ من می خوام زودتر یاد بگیرم

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

امیر زوارمی
01 بهمن 1397
نظر لطف شماست ان شاء الله به زودی مباحث PDO منتشر میشن.

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.