تعداد بازدید: 1804

شی گرایی در php (قسمت یک)

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

  • ساخت کلاس (کلمه کلیدی class)
  • ساخت شی از روی کلاس (کلمه کلیدی new)
  • متغیر ها یا ویژگی ها (Attrubute)
  • متد ها (methods)
  • انواع متغیر کلاس (static , const)
  • انواع متد کلاس (constructor , destructor , static)

ساختار شی گرایی می تونه کمک شایانی در پیاده سازی داده ها در پروژه هایمان به ما بکنه . همچنین در ساختار های برنامه نویسی MVC و HMVC هم بهتره که از شی گرایی استفاده بشه.

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

  • پست ها در مقالات (هر پست یک شی از کلاس پست)
  • مستندات (مثلا شی رزومه از کلاس مستندات)
  • سیستم تایید هویت
  • محصولات (مثلا محصول x از کلاس محصولات)
  • سیستم تولید کننده پسوود (password generator)

نکته :‌ دقت داشته باشید انتخاب ماهیت کلاس از داخل داده های برنامتون خیلی مهمه.

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

تعریف کلاس در پی اچ پی

برای ساخت شی از کلمه کلیدی class استفاده می کنیم.

<?php class post { } ?>

اجزای تشکیل دهنده یک کلاس در پی اچ پی

ویژگی یا Attribute : متغیر های کلاس که در تمام کلاس قابل دسترسی هستند.

متد یا method : همون توابع کلاس که انواع مختلفی می تونند داشته باشند از قبیل constructor , destructor

مثال کلاس پست :

<?php
class Post {
 
    public $author;
    public $publish_date;
    public $is_published;
     
    public function __construct(){
       // fire when objec is instanciated
    }

    public function __destruct(){
       // fire when object is destroy
   }

    public function publish() {
        // Publish the article here
    }
 
}

ساخت شی از روی کلاس با کلمه کلیدی new

مثال :

<?php $post = new post(); ?>

متد های constructor و destructor

متد سازنده یا __construct : این متد زمانی که شی ساخته می شود فراخوانی می شود.

متد ازبین رونده یا __destruct : این متد زمانی که شی از بین می رود فراخوانی می شود.

سازنده می تونه با آرگومان ورودی باشه یا بدون آرگومان.

نکته : در سازنده با آرگومان ، ورودی های سازنده در زمان ساخت شی به کلاس داده می شود

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

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

متدهای استاتیک یه جورایی مثل تابع معمولی میمونه . یعنی چه شما تابعی تعریف کنید با نام custome_excerpt و یا این که کلاسی تعریف کنید و تابع custom_excerpt رو بهش به صورت static تحویل بدید.(البته از نظر تخصیص حافظه و  روال اجرا متفاوت هستند.)

متدهای static به ازای تمامی اشیا یکتا هستند.

متدهای استاتیک با استفاده از کلمه کلیدی static تعریف میشن.

<?php
class Post{
     public static custome_excerpt($content){
          // return excerpt
     }
}

خوب متد بالا رو به صورت static تعریف کردیم که بتونیم خارج کلاس بدون استفاده از شی از اون استفاده کنیم. نحوه فراخوانی اگر خارج از کلاس باشه با استفاده از نام کلاس است و اگر داخل کلاس باشه با استفاده از کلمه کلیدی self::

نکته : اگر از کلمه کلیدی $this در متد استاتیک استفاده کنیم Fatal Error می گیریم.

<?php Post::custom_excerpt($content); ?>

فراخوانی در داخل کلاس (مثلا داخل یه متد دیگه) :

<?php self::custom_excerpt($content); ?>

نکته : در داخل متد استاتیک نمیشه از $this استفاده کرد. پس برای استفاده از متد های غیر استاتیک در داخل متد استاتیک باید حتما یک شی از کلاس جاری بگیریم.

class Foo {
    public function fun1() {
        echo 'non-static';   
    }

    public static function fun2() {
        echo (new self)->fun1();
    }
}

در داخل متد های استاتیک با استفاده از self:: می تونید به سایر متد های استاتیک کلاس جاری دست پیدا کنید.

نتیجه گیری : پس کلا برای دستیابی به متد یا متغیر غیر استاتیک نیاز به یک شی داریم حال این شی می تونه  باشه یا شی instance گرفته شده باشه . دقت داشته باشید که در داخل متد های استاتیک در داخل متد استاتیک نمیشه از $this استفاده کرد ولی میشه از شی جاری instance گرفت.

متغیر های static در کلاس

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

یک کپی به ازای تمامی کلاس ها به وجود میاد و اغلب برای صرفه جویی در حافظه برای مقادیر ثابت برای تمامی اشیا تعریف میشن.

<?php
class People {
    public $id;
    public $fname;
    public $lname;
    public static $instance;
    
    function __construct($id, $fname, $lname) {
        $this->id = $id;
        $this->fname = $fname;
        $this->lname = $lname;
        self::$instance++;
    }
}
$people1 = new People(1, 'ali', 'nikbakht');
echo 'static instance is: ' . People::$instance . '<br>';

یه مورد از استفاده های متغیر static در کلاس ها پیدا کردن تعداد شی ساخته از روی کلاس است. (فالواقع مثال بالا)

نحوه استفاده از متغیر static نیز مانند متد های استاتیک است (خارج کلاس با نام کلاس و داخل کلاس با استفاده از کلمه کلیدی self::)

نکته : دقت داشته باشید که علامت $ در زمان استفاده از متغیر static در داخل و خارج کلاس استفاده می شود.

متغیر const در کلاس

متغیر const هم مثل static هست با این تفاوت که غیر قابل تغییر است.

<?php
final class People {
    public $id;
    public $fname;
    public $lname;
    public static $instance;
    const heart = 1;

    function __construct($id, $fname, $lname) {
        $this->id = $id;
        $this->fname = $fname;
        $this->lname = $lname;
        self::$instance++;
    }
}
$people1 = new People(1, 'ali', 'nikbakht');
echo 'static instance is: ' . People::$instance . '<br>';
echo 'constant heart is: ' . People::heart . '<br>';

نحوه فراخوانی متغیر از نوع const دقیقا مثل متغیر از نوع static است (خارج کلاس با نام کلاس و داخل کلاس با استفاده از کلمه کلیدی self::) اگر مقدار متغیر const رو تغییر بدید به شما خطا میده .(چه داخل کلاس چه خارج کلاس)

نکته : دسترسی به سایر المان های کلاس (غیر static) با -> انجام می شود.حال اگر از طریق شی خارجی کلاس باشد با استفاده از نام شی و اگر در داخل کلاس باشد با کلمه کلیدی this

<?php
class Post{
    public $author;
    public function publish(){
         $this->author;
    }
}

$first_post = new Post();
$first_post->author;

هر شئ‌ را به یک موجودیت در نرم افزار نگاشت کنید و خروجی ها در صورت لزوم شئ باشند.

نتیجه گیری مهم : به طور کل اشیا یک ساختمان داده جدید است که می تواند خروجی توابع یا متد های شما باشد. یک شئ می تواند یک ساختمان داده منحصر به فرد باشد . مثلا خروجی شما یک سری Property داشته باشد که حاوی اطلاعات خروجی باشد و یک سری Method که اطلاعات داخلی یا متغیر های داخلی یا همان Property می تواند پردازش کند و حتی خروجی جدید (که آن هم می تواند یک شئ باشد) برگرداند.

function get_product(){
     $product_data = [
          'name' => 'Pelikan P252',
          'price' => 250
     ];
     return new Product($product_data);
}

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

مطالب مشابه

php error handling exceptions

مدیریت خطا و استثنا در php

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

هدر های Http در درخواست و پاسخ

Http Headers (قسمت سوم)

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

رابط mysqli , pdo

رابط mysqli و PDO

عموما DBMS ها یک رابط Command line برای دستکاری پایگاه داده در اختیار کاربر قرار می دهند. همانند تمامی پروتکل های...

اشتراک گذاری :

مدیر وب سایت گنوتک . برنامه نویسی رو با زبان C در هفده سالگی شروع کردم . در حال حاضر به برنامه نویسی php برپایه معماری MVC , HMVC و همچنین سیستم مدیریت محتوای WordPress و فریم ورک محبوب لاراول علاقه مند هستم و دوست دارم اطلاعاتم رو با شما به اشتراک بگذارم.

۰ دیدگاه برای شی گرایی در php (قسمت یک)

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

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