چه زمانی از interfaceها و چه زمانی از abstract classها استفاده میشه؟ درواقع چه زمانی یکی را بر دیگری ترجیح میدهیم.
سلام و احترام
interfaceها زمانی استفاده میشه که شما فقط بخوای یک قرار دادی تعریف کنید که هر کسی که این interface رو implement کردن مجبور بشه که متدهای داخل رو پیاده سازی کنه
<?php
interface InterfaceName
{
public function someMethod1();
public function someMethod2($name, $color);
public function someMethod3() : string;
}
اما توی abstract کلاسها شما هم میتونید یک سری قوانین تعریف کنید که هر کسی این abstract کلاس رو extend کرد پیاده سازی کنه و هم همزمان میتونید متدهایی داخلش داشته باشید که پیاده سازی شدند و توی تمامی کلاس هایی که این abstract کلاس رو extend میکنند مشترک و قابل استفاده است.
abstract class AbstractClass
{
// Force Extending class to define this method
abstract protected function getValue();
abstract protected function prefixValue($prefix);
// Common method
public function printOut() {
print $this->getValue() . "\n";
}
}
class ConcreteClass1 extends AbstractClass
{
protected function getValue() {
return "ConcreteClass1";
}
public function prefixValue($prefix) {
return "{$prefix}ConcreteClass1";
}
}
class ConcreteClass2 extends AbstractClass
{
public function getValue() {
return "ConcreteClass2";
}
public function prefixValue($prefix) {
return "{$prefix}ConcreteClass2";
}
}
$class1 = new ConcreteClass1;
$class1->printOut();
echo $class1->prefixValue('FOO_') ."\n";
$class2 = new ConcreteClass2;
$class2->printOut();
echo $class2->prefixValue('FOO_') ."\n";
همون طور که در کد بالا مشخصه توی abstract کلاس ما دوتا متد abstract تعریف کردیم که هر کلاسی که اون رو extend کرد باید پیاده سازیش کنه و هم یه متد که بین همشون مشترکه به اسم printOut هم تعریف کردیم که بین تمامی کلاس هایی که abstract مارو extend کردن مشترکه و کار مشخصی رو انجام میده