کلاس‌های abstruct در php، کلاس‌هایی هستند که نمی‌توان از روی آن‌ها شیء ایجاد کرد و خاصیت‌های جالبی دارند.

از کلاس‌های abustruct تنها می‌توان بعنوان والد استفاده کرد و از آن‌ها کلاس دیگری را مشتق گرفت. مثال زیر را ببینید:

<?php
abstract class Car{
	public $name;
	public function __construct($value){
		$this->name = $value;
	}
}
class Bmw extends Car{
}
$BMW_M3 = new BMW("BMW M3");
var_dump($BMW_M3);
?>

در بالا یک کلاس از نوع abstract و با نام Car ایجاد کردیم. سپس یک کلاس دیگر به نام Bmw را از آن extends کردیم.

بعد کلاس‌ها یک شیء از روی کلاس BMW ایجاد کرده و آن را مقدار دهی کردیم.

از آن جایی که به محض فراخوانی BMW متد construct کلاس Car نیز فراخوانی می‌شود بنابراین توانستیم متغیر name را نیز مقدار دهی کنیم.

البته کد فوق را می‌توان به صورت زیر نیز باز نویسی کرد:

<?php
abstract class Car{
	public $name;
	public function __construct($value){
		$this->name = $value;
	}
}
class Bmw extends Car{
	public function __construct($value){
		parent::__construct($value);
	}
}
$BMW_M3 = new BMW("BMW M3");
var_dump($BMW_M3);
?>

در کد فوق یک متد construct به کلاس BMW اضافه کردیم و با parent اعمال کلاس قبل را انجام دادیم.

درون کلاس‌های abstract می‌توان متدهای abstract نیز تعریف کرد، متدهای abstract، متدهایی هستند که فقط نام دارند و هیچ بدنه‌ای ندارد و در تمام فرزندها باید تعریف شوند. مثال:

<?php
abstract class Car{
	public $name;
	abstract function getSpeed();
}
class Bmw extends Car{
	public function getSpeed(){
		return "the speed is: 240KM";
	}
}
$BMW_M3 = new BMW();
echo $BMW_M3->getSpeed();
?>

متد abstract موجود در کلاس car هیچ بدنه‌ای ندارد، ولی در فرزند آن را overide کردیم. اگر این متد را overide نمی‌کردیم برنامه با خطا مواجه می‌شد.

کاربرد متد abstract این است که متدهای الزامی را به کلاس‌ها می‌دهد که مجبور به تعریف آن‌ها هستیم.

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

آشنایی با interface ها

interface‌ها شبیه abstract کلاس‌ها هستند و تفاوت‌های زیر را با آن دارند:

- در تعریف interface‌ها از کلمه کلیدی class استفاده نمی‌شود.

- یک interface نمی‌تواند متد غیر abstract داشته باشند.

- درون یک interface تمام متدها باید public باشند.

- درون یک interface نمی‌توان یک پراپرتی گذاشت.

- برای ارث بری کلاس‌ها از interface از واژه extends استفاده نمی‌کنیم و به جای آن از implement استفاده می‌کنیم.

- یک کلاس را تنها می‌توان از یک کلاس extends کرد ولی در مورد interface اینگونه نیست و می‌توان از چند کلاس implement کرد.

- اگر کلاس از یک interface ارث بری و یا در واقع implement شود باید تمام متدها را override کند.

 مثالی از interface را در پایین ببینید:

<?php
interface Car{
	public function getName($value);
	public function getSpeed($value);
}
class BMW implements Car{
	public $name;
	public $speed;
	public function getName($value){
		$this->name= $value;
		return true;
	}
	public function getSpeed($value){
		$this->speed= $value;
		return true;
	}
	public function info(){
		return $this->name.": ".$this->speed."KM";
	}
}
$NewBMW= new BMW();
$NewBMW->getName("BMW X3");
$NewBMW->getSpeed("240");
echo $NewBMW->info();
?>

یک interface به نام Car ایجاد کردیم و از آن یک کلاس به نام BMW ایجاد کردیم. همانطور که می‌بینید تمام متدهای موجود در Car باید در BMW وجود داشته باشند.

در پایین کلاس نیز یک شیء از BMW ایجاد کردیم و به آن دو مقدار متد را نسبت دادیم. و در نهایت با متد info مقادیر را چاپ نمودیم.

قسمت‌های بعدی را از دست ندهید.