كلاس يا متد انتزاعي آنهائي هستند، كه متد يا كلاس آن نيازمند تكميل آن توسط اولادش ميباشد. يك كلاس انتزاعي داراي حداقل يك متد وابسته باولاد دارد .يعني آن متد يا متدها در آن كلاس والد معرفي با نام و بدون كد ميباشند.
يك كلاس يا متد انتزاعي بوسيله كلمه كليديabstract تعريف ميشود . با كلاس انتزاعي مستقيم نميتوان شئ ايجاد كرد .ايجادشئ از طريق كلاس اولاد امكان پذير است.
قالب يا فرم كلي آن در اسكريپت زير ميباشد.
<?php abstract class ParentClass { abstract public function someMethod1(); abstract public function someMethod2($name, $color); abstract public function someMethod3() : string; } ?>
هنگام ارث بردن از يك كلاس انتزاعي، متد كلاس فرزند بايد باهمان نام،واصلاح كننده دسترسي يكسان ويا كمتر محدود شده، تعريف شود .يعني اگر متد انتزاعي بصورتprotected ،تعريف شود بايد اولاد بهمين صورت ياpublic باشد، امانه private همچنين. نوع وتعداد آرگومان مورد نياز، بايد يكسان باشد .با اين حال كلاس فرزند ميتواند بدنبال آرگومان اختياري داشته باشد.
بنابراين براي ايجاد كلاس اولاد از كلاس انتزاعي بايد قوانين زير رعايت شود.
1ـ متدانتزاعي والد بايد باهمان نام در اولاد ايجادوتكميل شود.
2ـ متدكلاس فرزند بايد باهمان اصلاح كننده دسترسي ويا دسترسي بيشتر تعريف شود.
3ـ تعدادآرگومان هاي مورد نياز بايد يكسان باشد، بااين حال كلاس فرزند ميتواند آرگومانهاي اختياري بدنبال آنها داشته باشد.
مثال ـ به مثال زير توحه نمائيد.
<?php // Parent class abstract class Car { public $name; public function __construct($name) { $this->name = $name; } abstract public function intro() ; } // Child classes class Audi extends Car { public function intro() { return "Choose German quality! I'm an $this->name!"; } } class Volvo extends Car { public function intro() { return "Proud to be Swedish! I'm a $this->name!"; } } class Citroen extends Car { public function intro() { return "French extravagance! I'm a $this->name!"; } } // Create objects from the child classes $audi = new audi("Audi"); echo $audi->intro(); echo "<br>"; $volvo = new volvo("Volvo"); echo $volvo->intro(); echo "<br>"; $citroen = new citroen("Citroen"); echo $citroen->intro(); ?>
تشريح مثال ـ
در اين مثال با استفاده از كلاس انتزاعيCar سه كلاس با نامهاي Audi,Volvo وCitroen ايجاد شده است .تابع انتزاعيintro() بادسترسيpublic در هرسه تعريف ومطابق نياز تكميل شده است .مابقي موارد ازCar براي آنها بارث رسيده است .
مثال ـ به مثال زير توجه كنيد كه متد انتزاعي داراي آرگومان است.
<?php abstract class ParentClass { // Abstract method with an argument abstract protected function prefixName($name); } class ChildClass extends ParentClass { public function prefixName($name) { if ($name == "John Doe") { $prefix = "Mr."; } elseif ($name == "Jane Doe") { $prefix = "Mrs."; } else { $prefix = ""; } return "{$prefix} {$name}"; } } $class = new ChildClass; echo $class->prefixName("John Doe"); echo "<br>"; echo $class->prefixName("Jane Doe"); ?>
در اين مثال در كلاس والد تابع انتزاعيprefixName($name) بصورتprotected ميباشد ولي همين تابع در كلاس اولاد بصورتpublic تعريف گرديده يعني دسترسي محدود نشده وافزايش يافته است .پارامترتابع درهر دو با هم يكسان هستند..
مثال ـ در اين مثال متد انتراعي والد داراي آرگومان ميباشد،و اولاد داراي دو آرگومان ديگر اختياريست .در تابع انتزاعيprefixName() در اولاد، دوپارامتر ديگراضافه شده است.
<?php abstract class ParentClass { // Abstract method with an argument abstract protected function prefixName($name); } class ChildClass extends ParentClass { // The child class may define optional arguments that are not in the parent's abstract method public function prefixName($name, $separator = ".", $greet = "Dear") { if ($name == "John Doe") { $prefix = "Mr"; } elseif ($name == "Jane Doe") { $prefix = "Mrs"; } else { $prefix = ""; } return "{$greet} {$prefix}{$separator} {$name}"; } } $class = new ChildClass; echo $class->prefixName("John Doe"); echo "<br>"; echo $class->prefixName("Jane Doe"); ?>