کلاس های انتزاعی یا 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;
دیدگاه تان را بنویسید