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

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

مفاهیمی که در این مقاله در رابطه با شی گرایی در پی اچ پی بررسی می کنیم :

  •  inheritance
  • encapsulation (public , private , protected)
  • getters and setters
  • Method Chaining In PHP – Fluent Interface

وراثت یا inheritance

ارث بری یعنی ساخت کلاس جدید با استفاده از کلاس های موجود . به طور مثال در وردپرس ما کلاسی داریم تحت عنوان WP_Widget که ساختارش به گونه ای هست که یک ویدجت میسازه. خوب شما برای ساخت ویدجت جدید خودتون می تونید از این کلاس یک extends بسازید و توابع خاصی رو مجددن توش override کنید.

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

کلاس والد (super class) :

class Person {
    public $id;
    public $fname;
    public $lname;
    protected $phone;
    private $mobile;
    function __construct($id, $fname, $lname, $phone, $mobile) {
        $this->id = $id;
        $this->fname = $fname;
        $this->lname = $lname;
        $this->phone = $phone;
        $this->mobile = $mobile;
        echo "constructor is calling <br>";
    }
    /**
     * Person class destruction
     * @return null
     */
    function __destruct() {
        echo "destructor is calling <br>";
    }
}

کلاس فرزند (sub class) :

<?php
class Student extends Person {
    public $student_id;
    public function __construct($id, $fname, $lname, $phone, $mobile , $student_id) {
        parent::__construct($id, $fname, $lname, $phone, $mobile);
        $this->student_id = $student_id;
    }

    public function gettinglesson() {
        echo "getting lesson";
    }

}

همونطور که می بینید :

  • در کلاس فرزند میشه method ها و Attribute های جدیدی داشته باشیم.
  • در کلاس فرزند میشه method های کلاس والد رو override کرد.
  • در کلاس فرزند ما به تمامی المان های کلاس والد (به شرط سطح دسترسی public , protected) دسترسی کامل داریم.(برای استفاده در ساختار های درونی کلاس و الا در زمان ساخت شی دقیقا همون ساختار والد به همراه ساختار های جدید در کلاس فرزند به وجود میاد).
  • مهم : در کلاس فرزند با استفاده از کلمه کلیدی parent:: می تونیم به المان های والد نظیر متدها دسترسی داشته باشیم (در مثال مشاهده فرمودید).

کلمه کلیدی final : اگر قبل از کلاس کلمه کلیدی final رو بیارید اون کلاس دیگه عقیم میشه . یعنی دیگه نمیشه از روش کلاس دومی رو درست کرد.

کپسوله سازی (encapsulation)

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

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

<?php
class car {
    public $key;
    
    public function __construct($key) {
        $this->key = $key;
    }
    public function start($key) {
        //engin_on
        //spark_pluged
        //trun_wheel
    }
    private function spark_pluged(){ }
    private function engin_on(){ }
    private function turn_wheel(){ }
}
$pride = new car('engin', 'spark', 1);
$pride->start(1);

خوب توی مثال بالا پودرهای کپسول آموکسی سیلین میشه متدهای (spark_pluged و engin_on و turn_wheel) و خود کپسول میشه متد start . پس کاربر بدون نیاز به دونستن نحوه روشن شدن ماشین با متد start ماشین رو روشن میکنه.

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

 سطح دسترسی داخل کلاس کلاس های فرزند خارج کلاس
public true true true
protected true true false
private true false false

getters and setters

ممکنه برای تغییر مواردی که سطح دسترسی در اون ها امکان پذیر نیست (حال چه private یا protected) متدهایی رو داخل کلاس تعریف کنیم که به اون ها getters , setters می گیم.

<?php
class Person {
    public $id;
    public $fname;
    public $lname;
    private $phone;
    function __construct($id, $fname, $lname, $phone) {
        $this->id = $id;
        $this->fname = $fname;
        $this->lname = $lname;
        $this->phone = $phone;
    }
    function getPhone() {
        return $this->phone;
    }
    function setphone($phone) {
        if (is_numeric($phone)) {
            $this->phone = $phone;
        }
    }

}
$person1 = new Person(1, 'ala', 'sabagh', '05136223478'); //Person construct
echo $person1->getPhone() . '<br>';
$person1->setPone('0513654321');

نکته : خود متد سازنده (constructor) هم میتونه یه setters باشه . (قطعا getters نیست چون سازنده چیزی رو بر نمی گردونه).

Method Chaining In PHP – Fluent Interface

اگر متد مربوطه (getter یا setter یا هرنوع متد دیگری) پس از انجام عملیات خودش شی this رو برگردونه می شه در زمان فراخوانی با متد میشه مثل شی رفتار کرد. یعنی پس از این که از متد استفاده کردیم بلافاصله از همون متد به تمامی ویژگی ها و متد های کلاس دسترسی داشته باشیم و اون ها رو فراخوانی کنیم.

<?php
class Person {
	public function addLeg() {
		// Adds a leg

		return $this;
	}

	public function addArm() {
		// Adds an arm

		return $this;
	}

	public function addHead() {
		// Adds a head

		return $this;
	}

	// .... and the list goes on
}

$person = new Person();
$person->addLeg()->addArm()->addHead();

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

مطالب مشابه

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

Http Headers (قسمت اول)

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

برنامه نویسی شی گرا در پی اچ پی

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

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

رابط mysqli , pdo

رابط mysqli و PDO

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

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

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

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

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

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