Nesne Arayüzleri

Nesne arayüzleri, bir sınıfın gerçeklemesi gereken yöntemlerin belirtildiği kodu, bu yöntemlerin nasıl gerçekleneceğini tanımlamaksızın oluşturmanıza imkan sağlar.

Arayüzler, sınıflardan farklı olarak class yerine interface anahtar sözcüğü kullanılarak ve içeriğinde hiçbir tanımlı yöntem olmaksızın tanımlanırlar.

Bir arayüzdeki tüm yöntemler, arayüzün doğası gereği public olarak bildirilmelidir.

Bazı bağlamlarda, örneğin imalat kipinde kullanım için kullanışlı olabilecek bir arayüz içinde bir kurucu bildirmek mümkündür.

implements işleci

Bir arayüzü gerçeklemek için, implements işleci kullanılır. Arayüzdeki tüm yöntemler bir sınıf içersinde gerçeklenmelidir; aksi takdirde bir ölümcül hata alırsınız. Bir sınıfın, birden fazla arayüz tanımlaması arayüzler virgülle ayrılarak sağlanabilir.

Bilginize:

PHP 5.3.9 öncesinde, belirsizliğe yol açacağından, bir sınıf, aynı isme sahip yöntem içeren iki arayüzü gerçekleyemezdi. PHP'nin en son sürümleri aynı imzaya sahip oldukları takdirde aynı isimli yöntemlere izin vermektedir.

Bilginize:

Arayüzler, sınıflar gibi extends işleciyle genişletilebilir.

Bilginize:

Bir arayüzü tanımlayan bir sınıf, bunu arayüzde tanımlı yöntemleri kullanarak yapmalıdır, yoksa işlem ölümcül hata ile sonuçlanır.

Sabitler

Arayüzlerin sabitlerinin olması mümkündür. Arayüz sabitleri, kendilerini miras alan sınıflar veya arayüzler tarafından geçersiz kılınamamaları dışında tıpkı sınıf sabitleri gibi çalışır.

Örnekler

Örnek 1 - Arayüz örneği

<?php
// 'iTemplate' arayüzünü tanımlayalım
interface iTemplate
{
    public function 
setVariable($name$var);
    public function 
getHtml($template);
}

// Arayüzü gerçekleyelim
// Bu çalışacaktır
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;
    }
}

// Bu çalışmayacaktır
// Ölümcül hata: BadTemplate sınıfı 1 soyut yöntem içermektedir
// dolayısıyla soyut olarak tanımlanması gerekir (iTemplate::getHtml)
class BadTemplate implements iTemplate
{
    private 
$vars = array();

    public function 
setVariable($name$var)
    {
        
$this->vars[$name] = $var;
    }
}

?>

Örnek 2 - Genişletilebilir Arayüzler

<?php
interface a
{
    public function 
foo();
}

interface 
extends a
{
    public function 
baz(Baz $baz);
}

// Bu çalışır
class implements b
{
    public function 
foo()
    {
    }

    public function 
baz(Baz $baz)
    {
    }
}

// Bu çalışmaz, ölümcül hatayla sonuçlanır
class implements b
{
    public function 
foo()
    {
    }

    public function 
baz(Foo $foo)
    {
    }
}
?>

Örnek 3 - Çok sayıda anayüz oluşturma

<?php
interface a
{
    public function 
foo();
}

interface 
b
{
    public function 
bar();
}

interface 
extends ab
{
    public function 
baz();
}

class 
implements c
{
    public function 
foo()
    {
    }

    public function 
bar()
    {
    }

    public function 
baz()
    {
    }
}
?>

Örnek 4 - Arayüzler ve sabitleri

<?php
interface a
{
    const 
'Arayüz sabiti';
}

// Şunu basar: Arayüz sabiti
echo a::b;


// Sabitler geçersiz kılınamayacağından bu çalışmaz.
class implements a
{
    const 
'Sınıf sabiti';
}
?>

Bir arayüz tür dayatarak belli bir nesnenin belli yöntemleri içermesini sağlayabilir. Ayrıca bakınız: instanceof işleci ve Tür Dayatma.