واسطهای شی به شما امکان میدهد تا متدهای کلاس را که باید پیادهسازی گردند مشخص نماید بدون این که نحوه کار با این متدها مشخص شده باشد.
واسطها توسط کلمه کلیدی interface بصورت یکسان در کلاسهای استاندارد است اما بدون این که هیچ یک از متدهای آن تعریف شده باشد.
تمام متدهای اعلام شده باید public باشند که طبیعت یک واسط است.
برای پیادهسازی یک واسط عملگر the implements استفاده میشود. تمام متدها در واسط باید در داخل یک کلاس تعریف شده باشد. ناکامی در این کار یک خطای مرگبار ایجاد مینماید. کلاسهای ممکن است بیش از یک واسط تعریف نماید که با جدا نمودن آنها با استفاده از کاما ممکن است.
Note:
یک کلاس نمیتواند دو واسط با اشتراک نام بسازد زیرا دارای ابهام است.
Note:
واسطها همانند کلاسها با استفاده از عملگر extends گسترش مییابد.
Note:
کلاس پیادهسازی کننده واسط باید از همان امضاهای متد تعریف شده در واسط استفاده کند. عدم انجام این کار موجب خطای اصلی میشود.
واسطها امکان دارد شامل ثابت باشند. ثابتهای واسط همانند ثابتهای کلاس عمل میکنند به جز این که آنها امکان بازنویسی توسط کلاس یا واسط ارثبرنده را ندارند.
Example #1 مثال واسط
<?php
// Declare the interface 'iTemplate'
interface iTemplate
{
public function setVariable($name, $var);
public function getHtml($template);
}
// Implement the interface
// This will work
class Template implements iTemplate
{
private $vars = array();
public function setVariable($name, $var)
{
$this->vars[$name] = $var;
}
public function getHtml($template)
{
foreach($this->vars as $name => $value) {
$template = str_replace('{' . $name . '}', $value, $template);
}
return $template;
}
}
// This will not work
// Fatal error: Class BadTemplate contains 1 abstract methods
// and must therefore be declared abstract (iTemplate::getHtml)
class BadTemplate implements iTemplate
{
private $vars = array();
public function setVariable($name, $var)
{
$this->vars[$name] = $var;
}
}
?>
Example #2 واسط قابل گسترش
<?php
interface a
{
public function foo();
}
interface b extends a
{
public function baz(Baz $baz);
}
// This will work
class c implements b
{
public function foo()
{
}
public function baz(Baz $baz)
{
}
}
// This will not work and result in a fatal error
class d implements b
{
public function foo()
{
}
public function baz(Foo $foo)
{
}
}
?>
Example #3 وراثت از چند واسط
<?php
interface a
{
public function foo();
}
interface b
{
public function bar();
}
interface c extends a, b
{
public function baz();
}
class d implements c
{
public function foo()
{
}
public function bar()
{
}
public function baz()
{
}
}
?>
Example #4 واسطها به همراه ثابتها
<?php
interface a
{
const b = 'Interface constant';
}
// Prints: Interface constant
echo a::b;
// This will however not work because its not allowed to
// override constants.
class b implements a
{
const b = 'Class constant';
}
?>
واسط به همراه راهنمای نوع راه خوبی برای اطمینان همراه بودن متدهای خاص در شی است. عملگر instanceof و type hinting را ببینید.