ارث بری به این مفهوم است که یک کلاس، از کلاس دیگر مشتق (Extend) شود. کلاسی که از کلاس دیگر مشتق می شود را کلاس فرزند (Child Class) و کلاسی که دیگری از آن مشتق می شود را کلاس پدر (Parent Class) یا کلاس پایه (Base) می گویند. کلاس فرزند به جز ویژگی ها یا متدهای پنهانی (خصوصی – Private) همه دیگر هموندهای (عضوهای) کلاس پایه را به ارث می برد.

در نوشته شی گرایی در پی اچ پی – متدهای get و set گفتیم که هموندهای پنهانی (Private Member) ها تنها درون خود کلاس در دسترس هستند ولی هموندهای Protected از بیرون کلاس و بوسیله یک نمونه (شی) از آن کلاس، در دسترس نیستند ولی می توان از درون کلاس های فرزند (کلاس های مشتق شد) به آنها دسترسی داشت. بنابراین درون کلاس فرزند، می توان به هموندهای همگانی (Public) و Protected کلاس پایه دسترسی داشت.

بنابراین می تواتیم متدهای Public و Protected کلاس پایه را درون کلاس فرزند، Override کنیم که در ادامه آن را آموزش داده ایم. در سی پلاس پلاس، یک کلاس فرزند می تواند همزمان از چندین کلاس دیگر به ارث برده شود ولی در پی اچ پی با اینکه همانند سی پلاس پلاس است، چنین ویژگی را نمی توانیم به کار ببریم. کد زیر نمونه بسیار ساده ای ارث برای را نشان می دهد. برای آنکه کلاس فرزند از کلاس والد به ارث ببرد، باید واژه کلیدی extented را بنویسیم.

در کد بالا کلاس پایه ParentClass نام دارد که درون یک متد به نام ()sayHello نوشته ایم که درون این متد دستور __echo __CLASS نوشته شده است که نام کلاسی که شی یا نمونه از آن ساخته شده است را برگشت می دهد. __CLASS__ یکی از ثابت های جادویی (Magic Constant) های پی اچ پی است که نام کلاس یک شی را برگشت می دهد. کلاس ChildClass از روی کلاس ParentClass مشتق شده است. می بینید که واژه کلیدی extends را به کار برده ایم. بنابراین درون خود تابع فرزند هیچ کدی نیست و اگر دستور های زیر را انجام دهیم، پس نام کلاس ParentClass نشان داده می شود.

همچنین می توانید کلاس دیگری بنویسید که از کلاس فرزند ارث بری کند. در این گونه همه زیر فرزندها نیز از کلاس نیای خود همه هموندهای Public و Protected را به ارث می برند. بنابراین می توان از یک کلاس چندین کلاس فرزند مشتق شود ولی یک کلاس فرزند نمی تواند از چندین کلاس پایه مشتق شود.

واژه کلیدی final در پی اچ پی

final برای نخستین بار در پی اچ پی ۵ ارائه شد و می توانیم آن را به همه کلاس یا به متدهایی از کلاس واگذار کنیم. final یک کاربرد بسیار ساده دارد و آن اینکه اگر به همه کلاس واگذار شود، پس هیچ کلاس دیگری نمی تواند از این کلاس ارث بری کند. به چَم (به معنی) دیگر، نمی توانیم کلاس فرزندی را از روی آن مشتق کنیم.

اگر final به متد کلاس واگذار شود، دیگر نمی توانیم متد را درون کلاس های فرزند override کنیم. اگر در کلاس پایه، متد final باشد، پس اگر درون کلاس فرزند بخواهید آن را Override کنید، یک خطا نشان داده می شود. در کد زیر متد calculateWage به شیوه به شیوه final نوشته شده است.

مفهوم Override کردن

درون کلاس فرزند می توانیم متدی همنام با متدهای کلاس پایه داشته باشیم، به آن شرط که متد در کلاس پایه final نباشد. همچنین باید تعریف آرگومان در تابع override شده در کلاس فرزند، همسان و همانند با شیوه تعریف آنها در کلاس پایه باشد. کد زیر نمونه بسیار ساده ای از چگونگی override کردن متد کلاس پایه در کلاس فرزند را نشان می دهد.

در شکل بالا متد calculateWage از کلاس پایه Employee درون کلاس فرزند Oops (چون شیوه ovverride خطا دارد این نام Oops را برگزیده) Override کرده ایم ولی چون شیوه نوشتن آرگومان همسان نیست، پس خطا نشان داده می شود. دلیل این است که آرگومان نخست متد در کلاس پایه float است ولی در کلاس فرزند آن را int نوشته ایم.