کلاس های انتزاعی یا Abstract Class در PHP چیست
پایگاه خبری تحلیلی مثلث آنلاین:

 

 

در این آموزش PHP ، شما در مورد کلاس abstract یا انتزاعی در PHP و متدهای  abstractیا انتزاعی خواهید آموخت و یاد می گیرید چگونه از کلاس انتزاعی (abstract class) برای تعریف یک چارچوب (framework) برای کلاس به صورت سلسله مراتبی (hierarchy) استفاده کنید.

معرفی متد انتزاعی (abstract method) و کلاس انتزاعی (abstract class)

 

زمانی از کلاس های انتزاعی (abstract class) استفاده می کنیم که برنامه نویس را مجبور کنیم تا یک متد خاصی را در کلاس مشتق پیاده سازی کند. در واقع می توان داخل کلاس های انتزاعی (abstract class) متدهایی را تعریف نمود که بدنه ای ندارند. و این متدها باید خود abstract باشند. و بعد باید در کلاس های مشتق شده از کلاس های انتزاعی (abstract class) ، بدنه ی این متد ها را تعریف نماییم.

اموزش طراحی سایت : یک متد انتزاعی (abstract method) یک متدی است که پیاده سازی ندارد. برای ایجاد یک متد انتزاعی، از کلمه یabstract  به صورت زیر استفاده کنید:

 

abstract public function abstractMethod();

 

گفتنی ست که، کلاس انتزاعی(abstract class) یک کلاسی است که حداقل شامل یک متد انتزاعی (abstract method) باشد.

برای تعریف یک کلاس انتزاعی، از کلمه ی abstract به صورت زیر استفاده کنید:

 

<?php

 

abstract class abstractClass{

 

 abstract public function abstractMethod();

 

 //.. other methods and properties

 

}

 

 

مثال برای کلاس انتزاعی (abstract class) در php

 

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

 

<?php

 

abstract class Person{

 

 protected $firstName;

 

 protected $lastName;

 

 

 

 public function __construct($firstName,$lastName){

 

 $this->firstName = $firstName;

 

 $this->lastName  = $lastName;

 

 }

 

 

 

 public function __toString(){

 

 return sprintf("%s, %s",$this->lastName, $this->firstName);

 

 }

 

 

 

 abstract public function getSalary();

 

}

 

از روی یک کلاس انتزاعی (abstract class) نمی توان شیء ای بسازیم . به عبارت دیگر، مجاز به ایجاد یک نمونه جدید از یک کلاس انتزاعی نیستید، به عنوان مثال، کد زیر مجاز نیست:

 

$p = new Person('John','Doe');

 

یک کلاس انتزاعی (abstract class) می تواند شامل propertyهایی مانند  $firstname و  $lastname باشد.

 

یک کلاس انتزاعی می تواند شامل متد هایی باشد که به طور کامل اجرا می شوند، به عنوان مثال متد __toString() .

 

کلاس انتزاعی به شما اجازه می دهد تا یک کلاسی تعریف کنید که بخشی از آن قابلیت اجرا شدن دارد(متدهایی که دارای بدنه هستند) و بخشی از آن که قابلیت اجرا شدن ندارد (متدهای abstract که فاقد بدنه هستند و در کلاس های مشتق شده از روی کلاس، باید این متدها پیاده سازی شوند) .

 

کلاس هایی که یک کلاس انتزاعی را به ارث می برند، کلاس های concrete  نامیده می شوند، به عنوان مثال کلاس Employee و Contractor class کلاس های concrete  هستند. (منبع مقاله  : کلیک سایت)

 

<?php

 

require_once 'classes/person.php';

 

 

 

class Employee extends Person{

 

 private $salary;

 

 

 

 public function __construct($firstName,$lastName,$salary){

 

 parent::__construct($firstName, $lastName);

 

 $this->salary = $salary;

 

 }

 

 

 

 public function getSalary(){

 

 return $salary;

 

 }

 

 

 

 public function __toString(){

 

 return sprintf("Name: %s<br> Salary: $%0.2f",

 

 parent::__toString(),

 

 $this->salary);

 

 }

 

}

 

در زیر نحوه ی استفاده از کلاس Employee نشان داده شده است:

 

<?php

require_once 'classes/employee.php';

$e = new Employee('John','Doe',5000);

echo $e;

 

ما می توانیم یک کلاس concrete  به نام Contractor به شرح زیر ایجاد کنیم:

 

<?php

require_once 'classes/person.php';

class Contractor extends Person{

 private $rate;

 private $billableHours;

 

 

 

 public function __construct($firstName, $lastName,$rate, $billableHours){

 parent::__construct($firstName, $lastName);

 $this->rate = $rate;

 $this->billableHours = $billableHours;

 

 }

 public function getSalary(){

 return $this->rate * $this->billableHours;

 }

 public function __toString(){

 return sprintf("Name:%s<br>Salary:$%0.2f",

 parent::__toString(),

 $this->getSalary());

 

 }

 

}

 

 

و نمونه کدی که از کلاس Contractor استفاده می کند:

 

<?php

 

require_once 'classes/contractor.php';

$c = new Contractor('David', 'Hill', 75, 175);

echo $c;

 

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

 

contractor.php

<?php

require_once 'classes/person.php';

class Contractor extends Person{

 

                        private $rate;

                        private $billableHours;

                        public function __construct($firstName, $lastName,$rate, $billableHours){

 

                                                parent::__construct($firstName, $lastName);

                                                $this->rate = $rate;

                                                $this->billableHours = $billableHours;

                        public function getSalary(){

 

                                                return $this->rate * $this->billableHours;

 

                        }

 

                      

 

                        public function __toString(){

 

                                                return sprintf("Name:%s<br>Salary:$%0.2f",

 

                                                                                                parent::__toString(),

 

                                                                                                $this->getSalary());

 

                        }

 

}

 

 

 

employee.php

<?php

 

require_once 'classes/person.php';

class Employee extends Person{

 

                        private $salary;

                        public function __construct($firstName,$lastName,$salary){

                                                parent::__construct($firstName, $lastName);

 

                                                $this->salary = $salary;

 

                     }

                        public function getSalary(){

 

                                                return $salary;

 

                        }

                        public function __toString(){

 

                                                return sprintf("Name: %s<br> Salary: $%0.2f",

 

                                                                                                parent::__toString(),

 

                                                                                                $this->salary);

 

                        }

 

}

 

example.php

 

<?php

 

abstract class abstractClass{

 

                        abstract public function abstractMethod();

 

                        //.. other methods and properties

 

}

 

 

 

 

person.php

 

<?php

 

abstract class Person{

 

                        protected $firstName;

 

                        protected $lastName;

                        public function __construct($firstName,$lastName){

 

                                                $this->firstName = $firstName;

 

                                                $this->lastName  = $lastName;

 

                        }

                        public function __toString(){

 

                                                return sprintf("%s, %s",$this->lastName, $this->firstName);

 

                        }

 

                        abstract public function getSalary();

 

}

Index.php

 

<?php

require_once 'classes/employee.php';

require_once 'classes/contractor.php';

$e = new Employee('John','Doe',5000);

echo $e;

echo '<br/>';

$c = new Contractor('David', 'Hill', 75, 175);

echo $c;